Linux Git和硬链接

Linux Git和硬链接,linux,git,hyperlink,hardlink,Linux,Git,Hyperlink,Hardlink,考虑到Git不能识别指向存储库之外的符号链接,使用硬链接有什么问题吗 Git能打破它们吗? 你能给我指一下详细的信息吗?从这里 连接点不是符号链接;因此,符号链接非常简单 msysGit中不支持 而且,硬链接从未被Git跟踪过 这个问题是面向Windows的(因为它是关于msysgit的)和关于symlink潜在支持的争论。 但是关于硬链接的评论通常与Git有关。表示Git中目录的“tree”对象存储文件名和权限(子集)。它不存储索引节点号(或其他类型的文件id)。因此,硬链接无法在git中表示

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

Git能打破它们吗? 你能给我指一下详细的信息吗?

从这里

连接点不是符号链接;因此,符号链接非常简单 msysGit中不支持

而且,硬链接从未被Git跟踪过

这个问题是面向Windows的(因为它是关于msysgit的)和关于symlink潜在支持的争论。

但是关于硬链接的评论通常与Git有关。

表示Git中目录的“tree”对象存储文件名和权限(子集)。它不存储索引节点号(或其他类型的文件id)。因此,硬链接无法在git中表示,至少在没有诸如或之类的第三方工具的情况下是如此(我不确定即使使用这些工具也是否可行)

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



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

谷歌“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进行更改,我会在一个地方对其进行更改,硬链接(产品详细信息页面)会指向这些更改——但git在克隆和在其他计算机上拉取时不会保留这种关系

me@server:www$ git pull

在另一台机器上,将为每个硬链接创建一个新的index.php。

我发现,使用挂钩,您可以捕获
git pull
事件(当有东西要拉时…),将脚本事件处理程序写入
.git/hooks/post merge
文件

首先,您必须
chmod+x
it

然后,将
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存储库克隆 从远程存储库克隆
还有一点很重要:符号链接必须相对定义。

您想做什么,为什么?硬链接与普通文件没有区别。如果您从另一个存储库中提取新版本,它将覆盖您已有的版本-链接到repo之外的内容有什么意义?Git将识别指向存储库之外路径的符号链接。没有mipadi,唯一的方法是在repo中挥动文件,并在repo中挥动符号链接“真实”LocationSYMBOL指向回购协议之外路径的链接可能很有用。我在webapps中使用它们来指向repo未跟踪的数据库或媒体文件。这样,web应用程序的配置文件可以指向一个静态路径,但该路径的实际位置在本地开发环境和服务器环境之间可能有所不同。@mipadi:BTW。现代gitweb对于在存储库外部标准化后显示符号链接有特殊情况。是的,repo外部的符号链接也可以。我用它们来指向一个我不需要(或不想)版本连接的海量数据目录。通常我使用相对链接。因此,在5月份的情况下,回购协议和数据目录必须在某个父目录中并排放置。您可以使用指向../foo的符号链接来实现惊人的技巧(git://git.hardeman.nu/metastore.git)不再提供。是git-cache-meta的替代品。您应该在Web应用程序中实现某种路由。硬链接很奇怪。是的,至少使用符号链接。:)这就是我想要的,我不想git保留硬链接。我有一个Jenkins目录,其中包含大量的工作区目录,由于多分支管道,因此存在大量重复。因此,我有一个夜间作业,在
/var/lib/jenkins
上运行
hardlink--ignore time
,以回收一些磁盘空间。白天,在
git pull
mvn compile
之后,一些文件会再次被取消链接,但这没关系,我希望会发生这种情况。如果git要保留硬链接,那么我的磁盘空间回收策略就不起作用了。因此,每次向回购协议添加硬链接时,似乎还需要手动向合并后挂钩脚本添加一行。如果您的预提交钩子使其完全自动化,那就太好了——检测提交中的硬(和符号)链接,并将适当的行写入合并后文件。Git不必在repo中存储inode信息,它会将其中的一部分存储在hook中!但是,如果链接的文件在另一个git repo中被跟踪,那将是多么混乱。。。在一个地方对文件的编辑是否会顺利传播到另一个位置?使用循环推/拉循环进行永久合并?这是一种聪明的方法,但不幸的是Git不跟踪硬链接,甚至可能在不支持硬链接的文件系统上将其表示为副本。@hobs很抱歉花了7年时间回复:)你说得对。如果
$ 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