web-dev-qa-db-ja.com

Gitとハードリンク

Gitはリポジトリの外部を指すシンボリックリンクを認識しないことを考慮すると、ハードリンクの使用に問題はありますか?

Gitはそれらを破壊できますか?詳細情報を教えていただけますか?

78

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

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


リポジトリの外部を指すシンボリックリンクについて:gitには問題がなく、シンボリックリンクの内容を保存する必要があります...しかし、そのようなリンクの有用性は私には疑わしいです、それらのシンボリックリンクが壊れるかどうかは、ファイルシステムのレイアウトに依存するためoutsidegitリポジトリ、およびgitの制御下にありません。

69
Jakub Narębski

わかりました、今これは遅い応答= Dです

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

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

次に、lnコマンドをその中に配置して、各プルでハードリンクを再作成します。きちんとした

それは機能します、私は自分のプロジェクトのためにそれが必要でしたし、ls -ipullの後にファイルが自動的にリンクされたことを示しています。


.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が必要です。これは、宛先ファイルを再作成しているためです。

16
Niloct

これから msysgit issue

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

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

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

7
VonC

Googleは「gitはハードリンクを保持」し、おそらく設計上、gitがハードリンク構造を知る方法を知らないことを示しています。

私のWebプロジェクトは、次のようにハードリンクを使用します。

www/products/index.php
www/products/Dell_latitude_id577/index.php #(hard linked to above)
www/products/Dell_inspiron_id323/index.php #(hard linked again to above)

me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*

Index.phpを変更したい場合は、一箇所で変更します。ハードリンク(製品詳細ページ)は変更を指します。ただし、gitは他のコンピューターでのクローン作成およびプル中にこの関係を保持しません。

me@server:www$ git pull

別のマシンでは、ハードリンクごとに新しいindex.phpが作成されます。

1
xce_git