Git 和硬链接

2024-10-29 08:35:00
admin
原创
236
摘要:问题描述:考虑到 Git 无法识别指向存储库之外的符号链接,使用硬链接是否存在问题?Git 会破坏它们吗?你能告诉我详细信息吗?解决方案 1:'tree' 对象表示 Git 中的目录,存储文件名和(部分)权限。它不存储 inode 编号(或其他类型的文件 ID)。因此,硬链接 无法在 gi...

问题描述:

考虑到 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。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用