111

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

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

4

4 に答える 4

95

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

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


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

于 2010-09-16T21:56:05.270 に答える
23

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も重要なことを指摘しています。シンボリックリンクは相対的に定義する必要があります。

于 2012-02-17T02:58:55.020 に答える
8

このmsysgitの問題から

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

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

問題はWindows指向であり(msysgitに関するものであるため)、シンボリックリンクの潜在的なサポートについての議論がありました。
しかし、ハードリンクに関するコメントは一般的にGitに関するものです。

于 2010-09-16T17:55:39.170 に答える
2

Google の 'git preserve hard links' は、おそらく設計上、ハード リンク構造を保持する方法を 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 が作成されます。

于 2011-08-23T02:51:57.727 に答える