Git 和硬链接
- 2024-10-29 08:35:00
- admin 原创
- 59
问题描述:
考虑到 Git 无法识别指向存储库之外的符号链接,使用硬链接是否存在问题?
Git 会破坏它们吗?你能告诉我详细信息吗?
解决方案 1:
'tree' 对象表示 Git 中的目录,存储文件名和(部分)权限。它不存储 inode 编号(或其他类型的文件 ID)。因此,硬链接 无法在 git 中表示,至少在没有第三方工具(例如metastore或git-cache-meta)的情况下无法表示(而且我不确定即使使用这些工具是否可行)。
Git 尝试不触碰不需要更新的文件,但是您必须考虑到 git 不会尝试保留硬链接,因此它们可能会被 git 破坏。
关于指向存储库外部的符号链接:git 对它们没有任何问题,并且应该保留符号链接的内容......但我对这种链接的实用性感到怀疑,因为这些符号链接是否会被破坏取决于git 存储库外部的文件系统布局,而不是在 git 的控制之下。
解决方案 2:
我发现,使用钩子,你可以捕获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
从本地 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也指出了一件重要的事情:符号链接必须相对定义。
解决方案 3:
从msysgit
本期开始
连接点不是符号链接;因此,msysGit 根本不支持符号链接。
此外,Git 从未跟踪过硬链接。
关于硬链接的评论与 Git 总体有关。具体问题与 Microsoft Windows 有关(因为它与有关msysgit
),讨论讨论了对符号链接的潜在支持。
解决方案 4:
谷歌搜索“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。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件