如何让 Git 跟踪符号链接?
如何让Git跟踪符号链接?
Git无法直接跟踪符号链接,但可以通过使用硬链接来解决这个问题。硬链接与软链接不同,所有程序,包括Git,都将把文件视为普通文件。需要注意的是,内容可以通过更改源文件或目标文件来修改。
以下是在不同操作系统上解决该问题的方法:
在macOS(10.13 High Sierra之前)上:
如果已经安装了Git和Xcode,请安装hardlink工具。这是一个微型工具,用于创建硬链接。
要创建硬链接,只需执行以下命令:
hln source destination
macOS High Sierra更新:
苹果文件系统是否支持目录硬链接?
苹果文件系统不支持目录硬链接。将HFS+转换为APFS卷格式时,所有目录硬链接都将转换为符号链接或别名。
在Linux和其他Unix系统上:
使用ln命令可以创建硬链接:
ln source destination
在Windows(Vista、7、8等)上:
使用mklink在Windows上创建联接:
mklink /j "source" "destination"
请注意,这仅适用于osX上的HFS/HFS+!
需要注意的是,Linux上的硬链接不能跨文件系统边界(这是我的用例)。
如果目标路径中有符号链接,这种方法将无法工作。
无法创建目录的硬链接,对吗?
在OS X上,ln source destination也可以工作。在El Capitan上进行了测试。
不,但可以使用`cp -al source destination`。`-l`表示硬链接文件而不是复制。
不幸的是,无法硬链接目录,也无法跨文件系统边界。这使得这个解决方案对我来说无法工作。
即使在文件系统之间,这个解决方案也无法正常工作:无法创建硬链接‘localDirpath1/file’到‘/dirpath2/file’:无效的跨设备链接
在APFS上,目录硬链接在OSX High Sierra上无法正常工作。
在Windows上很好地工作。
只要删除其中一个文件的硬链接(即其中一个文件的副本),是否还能正常工作?还原补丁等操作使用unlink命令。
是的,良好的编辑器和Git通常不会简单地用`st_nlink > 1`覆盖文件,而是会询问是覆盖还是创建新文件-更喜欢创建新文件。因此,在这里使用硬链接就像在水上绘画一样…
我发现给定的ln符号表示令人困惑(而且顺序错了?)。根据man页面的说明,应该是`ln TARGET LINK_NAME`。
如何让Git跟随符号链接?
有时候,我们希望在Git仓库和应用程序目录之间创建符号链接,但是Git默认并不会跟随符号链接。那么,我们应该如何解决这个问题呢?
一个解决方法是换个角度思考,即从应用程序目录指向Git仓库,而不是从Git仓库指向应用程序目录。具体做法如下:
1. 将需要的配置文件(比如config.conf)添加到Git仓库中,例如在~/repos/application/config.conf
路径下;
2. 然后通过运行ln -s ~/repos/application/config.conf
命令在~/application
目录下创建一个符号链接。
这种方法可能并不总是适用,但对我来说效果很好。
另一种解决方法是使用junction命令(在Windows 7下使用"mklink /j"命令),可以在一个Git仓库中创建指向另一个Git仓库的符号链接,这样可以在两个位置编辑文件并提交到各自的远程仓库。
当然,有时候问题的答案就是如此简单。
如果你想在不同的代码仓库中同时跟踪源代码和目标代码,上述方法可能不适用。
还有一种情况是,如果你想在Nginx中使用符号链接来提供文件服务,那可能会遇到问题,因为Nginx拒绝从符号链接中提供文件服务。
如果你想在两个Git仓库之间共享一个文件夹,那就无法使用上述的“换个角度思考”的方法了。我认为Git应该增加一个--follow-symlinks选项来解决这个问题。
还有一种方法是在Git仓库中添加一个创建符号链接的脚本,这样可以备份各种应用程序的配置文件。但是需要注意的是,有些应用程序(比如iCloud)并不会跟随符号链接。
总之,看起来并没有一个通用的方法可以让Git跟随符号链接,但是根据具体情况可以选择合适的解决方法。
如何使Git遵循符号链接?
问题的原因:
- 想要将符号链接中的文件添加到Git中,但是若不使用符号链接,并没有使用它。
- 在Linux上使用了sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
命令成功实现了这一目标,但在OS X上却不起作用。
解决方法:
- 在Git管理的目录中执行以下命令:sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
。在将SOURCEDIRECTORY
挂载到TARGETDIRECTORY
之前,TARGETDIRECTORY
必须先创建。
- 若要使此绑定永久生效,可以将以下行添加到/etc/fstab
文件中:/sourcedir /targetdir none bind
。
- 若要撤销此绑定,使用umount [mydir]
命令。
- 若要使绑定持久生效,可以将其放入/etc/fstab
文件中,如:/sourcedir /targetdir none bind
。
- 另一种方法是使用sshfs命令来实现类似的功能,不需要sudo权限,只需安装sshfs并执行sshfs username:/etc/folder ./target_folder
命令即可。
其他相关信息:
- 对于OS X,可以使用bindfs.org,使用brew install bindfs
命令安装,并按照屏幕上显示的说明正确设置osxfuse。
- 使用bwrap
命令可以在不使用sudo的情况下绑定挂载目录,该命令在所有主要发行版上都可用,并且可能预装在许多系统中。
以上就是如何使Git遵循符号链接的原因和解决方法。