我最好是用一个shell脚本替换符号链接的副本,还是有另一种方式告诉Git遵循符号链接?

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


当前回答

这是一个预提交钩子,它用这些符号链接的内容替换索引中的符号链接blobs。

把它放在.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兼容功能;然而,diff -a不符合POSIX,可能还有其他原因。

这段代码中可能有一些错误/错误,即使它经过了一些测试。

其他回答

注意:从Git 1.6.1开始,这个通知就已经过时了。Git过去是这样的,现在不再是这样了。


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

但是,当符号链接是一个目录时,我意外地设法让它在符号链接之外添加文件。

例如:

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

通过做

 git add /bar/foo/baz

当我尝试时,它似乎起作用了。然而,这种行为在当时是我不想要的,所以我不能给你更多的信息。

1. 您应该使用硬链接,因为在硬链接中所做的更改 由git上演。

2. 创建硬链接的语法为ln file1 file2。

3.这里file1是具有硬链接的文件的位置 您要创建的文件,而file2是硬链接的位置。

4. 我希望这对你有所帮助。

我所做的是将符号链接中的文件添加到Git中(我没有使用符号链接,但是):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

在Git-managed目录下执行此命令。必须在将SOURCEDIRECTORY挂载到TARGETDIRECTORY之前创建TARGETDIRECTORY。

它在Linux上工作得很好,但在OS X上就不行了!这个技巧也帮助了我的Subversion。我用它来包括来自Dropbox帐户的文件,网站设计师在那里做他/她的事情。

如果你想让这个绑定永久存在,在/etc/fstab中添加以下行:

/sourcedir /targetdir none bind

我厌倦了这里的每个解决方案,要么已经过时,要么需要root,所以我做了一个基于ld_preload的解决方案(仅限Linux)。

它连接到Git的内部,覆盖'这是一个符号链接吗?函数,允许符号链接被视为它们的内容。默认情况下,所有到回购外部的链接都是内联的;详情请参见链接。

我以前在符号链接之外添加文件已经有一段时间了。这在过去工作得很好,不需要做任何特别的安排。自从我更新到Git 1.6.1后,这就不再有效了。

您可以切换到Git 1.6.0来实现这个功能。我希望Git的未来版本会有一个Git -add标志,允许它再次跟随符号链接。