Git和硬链接


91

考虑到Git无法识别指向存储库外部的符号链接,使用硬链接是否有任何问题?

Git可以打破它们吗?您能给我指出详细的信息吗?


2
您想做什么,为什么?硬链接与普通文件没有什么不同。如果您曾经从另一个存储库中提取一个新版本,它将覆盖您已有的版本-链接到存储库之外的东西有什么意义?
卡尔·诺鲁姆

1
Git将识别指向存储库外部路径的符号链接。
mipadi

没有mipadi,唯一的办法就是在回购文件中挥舞着文件,并在其“真实”位置挥舞着symjbolic链接
Alfredo Palhares 2010年

Answers:


84

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

Git尝试不触摸不需要更新的文件,但是您必须考虑到git不会尝试保留硬链接,因此它们可能会被git破坏。


关于指向外部存储库的符号链接:git没问题,应该保留符号链接的内容...但是这种链接的实用性对我来说还是个疑问,因为这些符号链接是否断开取决于git存储库之外的文件系统布局,并且不受git的控制。


4
与回购外部路径的符号链接可能很有用。我已经在webapps中使用它们来指向存储库未跟踪的数据库或媒体文件。这样,Web应用程序的配置文件可以指向静态路径,但是该路径的实际位置在本地开发环境和服务器环境之间可能会有所不同。
mipadi

@mipadi:顺便说一句。现代gitweb有特殊情况,用于在存储库外部进行规范化之后显示符号链接。
JakubNarębski2010年

6
是的,回购外的符号链接很好。我用它们指向不需要(或想要)版本化的海量数据目录。通常我使用相对链接。因此,在某些情况下,存储库和数据目录必须在某个父目录中彼此相邻。您可以通过指向../foo的符号链接来完成各种技巧。
Adrian Ratnapala 2011年

不幸的是,用于存储的Git存储库(git://git.hardeman.nu/metastore.git)不再可用。
德里克·马哈尔

1
github.com/danny0838/git-store-metagit-cache-meta的替代方法。
德里克·马哈尔

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不跟踪硬链接,甚至可能将它们表示为不支持硬链接的文件系统上的副本。
德里克·马哈尔

8

从这个msysgit问题

连接点不是符号链接;因此,msysGit中根本不支持符号链接。

另外,Git从未跟踪硬链接

这个问题是面向Windows的(因为它是关于msysgit的),并且就symlink的潜在支持进行了辩论。
但是有关硬链接的评论通常涉及Git。


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。


7
您应该在Web应用程序中实现某种路由。硬链接很奇怪。
Nowaker

5
是的,至少要使用符号链接。:)
Andres Riofrio 2012年

2
这实际上是我想要的,我不想git保留硬链接。我有一个包含大量工作空间目录的Jenkins目录,由于存在多分支管道,因此存在很多重复项。因此,我有一份每晚工作在hardlink --ignore-time上进行/var/lib/jenkins,以回收一些磁盘空间。在一天中,某些文件在之后git pull或之后再次取消链接,mvn compile但这没关系,我希望这种情况会发生。如果git保留硬链接,那么我的磁盘空间回收策略将行不通。
Amedee Van Gasse
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.