フックを使用すると、 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 全般に関するものです。