111

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

Git可以破坏它们吗?你能指点我详细的信息吗?

4

4 回答 4

95

“树”对象代表 Git 中的目录,存储文件名和(子集)权限。它不存储 inode 编号(或其他类型的文件 ID)。因此,硬链接 不能在 git 中表示,至少在没有第三方工具(例如metastoregit-cache-meta )的情况下不能表示(我不确定即使使用这些工具是否可行)。

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 repo 之外进行链接了……

$ 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

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

我的 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。

于 2011-08-23T02:51:57.727 回答