Git 和硬链接

2024-10-29 08:35:00
admin
原创
59
摘要:问题描述:考虑到 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。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用