GNU/Linux >> Linux の 問題 >  >> Linux

Git とハードリンク

フックを使用すると、 git pull をキャプチャできることがわかりました イベント (プルするものがある場合...) スクリプト イベント ハンドラを .git/hooks/post-merge に書き込む ファイル。

まず、chmod +x する必要があります

次に、 ln を入れます その内部のコマンドを使用して、各プルでハード リンクを再作成します。いいですね!

それは動作します、私は自分のプロジェクトと ls -i のためにそれが必要でした pull 以降にファイルが自動的にリンクされたことを示します .

.git/hooks/post-merge の私の例 :

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

重要:ご覧のとおり、リポジトリ内のファイルへのパスは $GIT_DIR で始まる必要があります。 、次に部分相対パスをファイルに追加します。

また重要:-f 宛先ファイルを再作成しているため、必要です。

編集

最新の git クライアントは、リモートの場所にプッシュしてそこから複製する場合でも、リポジトリ内のシンボリック リンクとハードリンクを自然にサポートしているようです。 git リポジトリの外部にリンクする必要は二度とありませんでしたが...

$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
 3 files changed, 3 insertions(+)
 create mode 100644 hardlink
 create mode 120000 symlink
 create mode 100644 x/original

ローカル git リポジトリからのクローン作成

$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink  symlink  x
$ cat symlink
123
$ cat hardlink
123

リモート リポジトリからのクローン作成

$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
 + 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123

https://github.com/mokacoding/symlinks も重要なことを指摘しています。シンボリックリンクは相対的に定義する必要があります。


Git のディレクトリを表す「ツリー」オブジェクトには、ファイル名と (のサブセット) パーミッションが格納されます。 inode番号(または他の種類のファイルID)は保存されません。したがって、ハード リンク git では表現できません 、少なくとも metastore や git-cache-meta などのサード パーティ製ツールなしではできません (これらのツールを使用しても可能かどうかはわかりません)。

Git は更新する必要のないファイルに触れないようにしますが、git はハードリンクを保持しようとしないため、git によって壊れる可能性があることを考慮する必要があります。

リポジトリ外へのシンボリック リンクについて :git には問題がなく、シンボリック リンクの内容を保持する必要があります... しかし、シンボリック リンクが壊れるかどうかはファイルシステムのレイアウト outside git リポジトリにあり、git の管理下にはありません。


このmsysgitの問題から

<ブロック引用>

ジャンクション ポイントはシンボリック リンクではありません。したがって、シンボリック リンクは msysGit ではサポートされていません。

また、ハード リンクは Git によって追跡されませんでした .

問題は Windows 指向 (msysgit に関するものであるため) であり、symlink のサポートの可能性について議論されました。
しかし、ハード リンクに関するコメントは Git 全般に関するものです。


Linux
  1. シンボリックリンクとハードリンクの違いは?

  2. Linuxでソフトリンクとハードリンクを作成する方法

  3. RHEL 7 – RHCSA 注:ハード リンクとソフト リンクを作成します。

  1. Linuxでハードリンクとシンボリックリンクを作成する方法

  2. Linux ファイル システムのソフト リンクとハード リンクとは

  3. Linuxのソフトリンクとハードリンクの違い

  1. LinuxターミナルをtmuxとGitでカスタマイズする

  2. ハードリンクとソフトリンクを作成する–RHCSA試験の準備

  3. Linuxのハードリンクとソフトリンクの説明