考虑到Git无法识别指向仓库之外的符号链接,使用硬链接是否存在问题?
Git会破坏它们吗? 请指出详细信息。
考虑到Git无法识别指向仓库之外的符号链接,使用硬链接是否存在问题?
Git会破坏它们吗? 请指出详细信息。
'Tree'对象在Git中代表目录,存储文件名和(部分的)权限信息。它不存储inode号码(或其他类型的文件ID)。因此硬链接不能在Git中表示,至少没有第三方工具如metastore或git-cache-meta的帮助下是不可能的(即使使用了这些工具也不确定是否能实现)。
Git尽力避免修改不需要更新的文件,但是你需要注意的是Git不会保留硬链接,所以Git有可能会破坏它们。
关于指向代码库之外的符号链接:Git对它们没有问题,并且应该会保留符号链接的内容...但是这样的链接的实用性对我来说有些可疑,因为这些符号链接是否被破坏取决于在git代码库之外的文件系统布局,而不受git控制。
我发现使用hooks可以捕获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
$ 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 还指出了一个重要的事情:符号链接必须是相对定义的。
从这个msysgit
问题中可以看出:
联接点不是符号链接,因此在 msysGit 中不支持符号链接。
此外,硬链接从未被 Git 跟踪。
关于硬链接的评论涉及到 Git 的一般情况。具体问题是与 Microsoft Windows 相关的(因为它涉及到 msysgit
),讨论了对符号链接的潜在支持。
搜索“git保留硬链接”并显示git不知道如何保留硬链接结构,据我所知,可能是出于设计考虑。
我的网络项目使用硬链接如下:
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*
me@server:www$ git pull