Git and hard links

考虑到 Git 不能识别指向存储库之外的符号链接,那么使用硬链接有什么问题吗?

Git 能破解吗? 你能告诉我详细的信息吗?

53326 次浏览

从这个 Msysgit 的问题

连接点不是符号链接; 因此,符号链接是简单的 在 msysGit 中不支持。

还有 Git 从未跟踪过硬链接

这个问题是面向 Windows 的(因为它是关于 msysgit 的) ,并且对 symlink 的潜在支持存在争议。
但是关于硬链接的评论通常与 Git 有关。

“ tree”对象表示 Git 中的目录,存储文件名和(子集)权限。它不存储 inode 号(或其他类型的文件 id)。因此,硬链接 不能用 git 表示,至少不是没有第三方工具,如 超级存储器Git-cache-meta(我不知道如果它是可能的,甚至与这些工具)。

Git 尽量不碰它不需要更新的文件,但是您必须考虑到 Git 不会试图保存硬链接,因此它们可能会被 Git 破坏。


关于 指向存储库外部的符号链接: git 对它们没有任何问题,应该保留符号链接的内容... ... 但是这些链接的效用对我来说是值得怀疑的,因为这些符号链接是否会被破坏取决于文件系统布局 外面 git 存储库,而不是在 git 的控制之下。

谷歌“ git 保存硬链接”,它表明,git 不知道如何保存硬链接结构 AFAIK,也许是通过设计。

矿山网络项目使用的硬链接如下:

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。

我发现,通过使用钩子,可以将脚本事件处理程序写入到 .git/hooks/post-merge文件中,从而捕获 git pull事件(当有东西要拉时...)。

First, you have to chmod +x it.

然后,将 ln命令放入其中,在每次拉动时重新创建硬链接!

It works, I just needed that for my project and ls -i shows that files were automatically linked after pull.


My example of .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 还指出一件重要的事情: 符号链接必须相对定义。