我怎样才能让git遵循符号链接?

我有一个谷歌如何做到这一点,但没有任何运气。

我最好将是一个shell脚本replace符号链接与副本,还是有另一种方法告诉git遵循符号链接?

PS:我知道这不是很安全,但我只想在几个特定的​​情况下做。

注意:git 1.6.1这个build议现在已经过时了。 Git曾经这样做,不再这样做。


Git默认尝试存储符号链接而不是遵循它们(为了紧凑,而且它通常是人们想要的)

然而,我意外地设法让它在符号链接是一个目录时添加超出符号链接的文件。

即:

  /foo/ /foo/baz /bar/foo --> /foo /bar/foo/baz 

通过做

  git add /bar/foo/baz 

它似乎工作时,我试了一下,然而当时我的行为是不受欢迎的,所以我不能给你超越这个信息。

我所做的添加到一个符号链接到git(我没有使用符号链接,但是):

 sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY 

在gitpipe理的目录中执行这个命令。 TARGETDIRECTORY必须在SOURCEDIRECTORY被装入之前创build。

在Linux上可以正常工作,但不能在OS X上工作! 那个诡计也帮我颠覆了。 我使用它来包含来自Dropbox帐户的文件,在这里,一个webdevise师在做他的东西。

为什么不反过来创build符号链接? 意思,而不是从git存储库链接到应用程序目录,只是反过来链接。

例如,假设我正在设置一个安装在需要configuration文件config.conf ~/application

  • 我把config.conf添加到我的git仓库,例如~/repos/application/config.conf
  • 然后通过运行ln -s ~/repos/application/config.conf~/application创build一个符号链接

这种方法可能并不总是奏效,但对我来说迄今为止效果不错。

改用硬链接。 这与软(符号)链接不同。 包括git在内的所有程序都会将该文件视为常规文件。 请注意,可以通过更改源或目标来修改内容。

在macOS上(10.13之前的高Sierra)

如果你已经安装了git和Xcode, 请安装hardlink 。 这是一个创build硬链接的微观工具 。

要创build硬链接,只需:

 hln source destination 

macOS高Sierra更新

苹果文件系统是否支持目录硬链接?

Apple文件系统不支持目录硬链接。 在MacOS上将HFS +转换为APFS卷格式时,所有目录硬链接都将转换为符号链接或别名。

从developer.apple.com上的APFS常见问题

按照https://github.com/selkhateeb/hardlink/issues/31的未来替代。;

在Linux和其他Unix的口味

ln命令可以build立硬链接:

 ln source destination 

在Windows(Vista,7,8,…)

有人build议使用mklink在Windows上创build一个连接,但我没有尝试过:

 mklink /j "source" "destination" 

这是一个预先提交的钩子 ,它将索引中的符号链接blobreplace为这些符号链接的内容。

把它放在.git/hooks/pre-commit ,并使其可执行:

 #!/bin/sh # (replace "find ." with "find ./<path>" below, to work with only specific paths) # (these lines are really all one line, on multiple lines for clarity) # ...find symlinks which do not dereference to directories... find . -type l -exec test '!' -d {} ';' -print -exec sh -c \ # ...remove the symlink blob, and add the content diff, to the index/cache 'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \ # ...and call out to "sh". "process_links_to_nondir" {} ';' # the end 

笔记

我们尽可能使用符合POSIX标准的function; 然而, diff -a不符合POSIX标准,可能还有其他一些问题。

这个代码中可能会有一些错误/错误,即使它被testing了一些。

我曾经添加超过符号链接的文件相当长一段时间了。 这工作得很好,没有做任何特别的安排。 由于我更新到git 1.6.1,这不再工作。

你可以切换到git 1.6.0来完成这个工作。 我希望未来版本的git将会有一个git-add标志,让它再次遵循符号链接。

使用Git 2.3.2+(2015年第1季度),还有另一种情况,Git 不会遵循符号链接:参见由Junio C gitstergitster ) 提交e0d201b (主要Git维护者)

apply :不要触及超出符号链接的文件

因为Git将符号链接作为符号链接进行跟踪,所以在其前面有一个符号链接的path/to/dir/file (例如path/to/dir/file ,其中path/to/dir是到别处的符号链接)可以在其内部或外部工作树)永远不会出现在有效应用的修补程序中,除非相同的修补程序先删除符号链接以允许在其中创build目录。

检测并拒绝这样的补丁。

类似地,当一个input创build一个符号链接path/to/dir ,然后创build一个文件path/to/dir/file ,我们需要将其标记为错误,而不必在文件系统中创buildpath/to/dir符号链接。

相反,对于input中在结果中留下path(即非删除)的任何修补程序,我们会检查所有前导path与修补程序创build的结果树,方法是检查input中的所有修补程序,然后检查修补程序的目标应用程序(索引或工作树)。

这样,我们:

  • 赶上一个恶作剧或错误添加符号链接path/to/dir和文件path/to/dir/file在同一时间,
  • 同时允许删除符号link path/to/dir的有效修补程序,然后添加文件path/to/dir/file

这意味着,在这种情况下,错误信息将不是像"%s: patch does not apply"那样的通用信息,而是更具体的一个:

 affected file '%s' is beyond a symbolic link 

嗯挂载 – 绑定似乎并不适用于达尔文。

有没有人有一个技巧呢?

[编辑]

好的,我发现在OSX上的答案是做一个硬链接。 除了那个API没有通过ln暴露,所以你必须使用你自己的小程序来做到这一点。 这是该程序的链接:

在MacOS X中创build目录硬链接?

请享用!

我使用的是git 1.5.4.3,它跟在传递的符号链接上,如果它有斜线。 例如

 # adds the symlink itself $ git add symlink # follows symlink and adds denoted directory's contents $ git add symlink/ 

从符号链接转换将是有用的? 链接在git文件夹,而不是一个符号链接, 通过脚本