Gitとハードリンク


91

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

Gitはそれらを壊すことができますか?詳細な情報を教えてもらえますか?


2
あなたは何をしようとしているのですか?その理由は?ハードリンクは通常のファイルと何の違いもありません。別のリポジトリから新しいバージョンをプルする場合、それはあなたが持っていたものを上書きします-リポジトリ外の何かにリンクすることの意味は何ですか?
Carl Norum、2009

1
Gitは、リポジトリ外のパスを指すシンボリックリンクを認識します。
mipadi

いいえmipadi、唯一の方法は、彼らの「本当の」場所にレポ内のファイルとsymjbolicリンクを振っていない
アルフレドパルハレス

回答:


84

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

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


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


4
リポジトリ外のパスへのシンボリックリンクが役立つ場合があります。私はそれらをWebアプリケーションで使用して、リポジトリによって追跡されていないデータベースまたはメディアファイルをポイントしました。このように、Webアプリの構成ファイルは静的パスを指すことができますが、そのパスの実際の場所は、ローカル開発環境とサーバー環境の間で異なる可能性があります。
mipadi

@mipadi:ところで。最新のgitwebには、リポジトリ外での正規化の後に続くシンボリックリンクを表示する特別なケースがあります。
JakubNarębski10年

6
はい、リポジトリ外のシンボリックリンクは問題ありません。それらを使用して、バージョン管理する必要のない(またはしたくない)大規模なデータディレクトリを指定しました。通常、相対リンクを使用します。そのため、場合によっては、リポジトリとデータディレクトリが親ディレクトリ内で互いに隣接している必要があります。../fooへのシンボリックリンクを使って驚くべきトリックを実行できます。
エイドリアン・ラトナパラ2011年

残念ながらmetastoreのGitリポジトリ(git://git.hardeman.nu/metastore.git)はご利用になれません。
Derek Mahar 2017年

1
github.com/danny0838/git-store-metagit-cache-metaの代替です。
Derek Mahar 2017年

21

フックを使用すると、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、宛先ファイルを再作成しているため、重要です。


11
したがって、リポジトリにハードリンクを追加するたびに、マージ後のフックスクリプトに手動で行を追加する必要があるように見えます。コミット前のフックがこれを完全に自動化した場合、コミットでハード(およびシンボリック)リンクを検出し、適切な行をマージ後のファイルに書き込むと便利です。Gitはinode情報をリポジトリに保存する必要はなく、その一部をフックに保存します!しかし、リンクされたファイルが別のgitリポジトリで追跡された場合、何が厄介なのでしょう...ある場所でのファイルの編集が他のリポジトリにスムーズに伝播するでしょうか?永続的なマージは円形のプッシュ/プルループですか?
ホブ

賢いアプローチですが、Gitがハードリンクを追跡せず、ハードリンクをサポートしていないファイルシステム上のコピーとしてそれらを表す可能性さえあるのは残念です。
Derek Mahar

8

このmsysgitの問題から

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

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

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


2

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に変更を加えたい場合は、1か所で変更し、ハードリンク(製品詳細ページ)が変更をポイントします。ただし、gitが他のコンピューターのクローン作成やプル中にこの関係を維持しない点が異なります。

me@server:www$ git pull

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


7
Webアプリケーションになんらかのルーティングを実装する必要があります。ハードリンクは奇妙です。
Nowaker

5
ええ、少なくともシンボリックリンクを使用してください。:)
Andres Riofrio 2012

2
これは実際に私が望んでいることであり、gitにハードリンクを保持させたくありません。大量のワークスペースディレクトリを含むJenkinsディレクトリがあり、マルチブランチパイプラインのため、多くの重複があります。したがって、私はで実行する毎晩のジョブを実行hardlink --ignore-timeして/var/lib/jenkins、ディスク領域を解放します。日中はいくつかのファイルが後に再びunhardlinkedますgit pullmvn compileそれは大丈夫、私はそれが起こることを期待しています。gitがハードリンクを保持する場合、ディスクスペースのリサイクル戦略は機能しません。
Amedee Van Gasse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.