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

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


当前回答

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


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

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

例如:

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

通过做

 git add /bar/foo/baz

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

其他回答

符号链接的转换可能很有用。链接到Git文件夹中,而不是脚本中的符号链接。

为什么不反过来创建符号链接呢?这意味着不是从Git存储库链接到应用程序目录,而是以相反的方式链接。

例如,假设我正在设置一个安装在~/application中的应用程序,它需要一个配置文件config.conf:

我将config.conf添加到Git存储库中,例如~/repos/application/config.conf。 然后我通过运行ln -s ~/repos/application/config.conf从~/application创建一个符号链接。

这种方法可能并不总是有效,但到目前为止对我来说效果很好。

@user252400建议的另一种实现是使用bwrap,这是一个小型setuid沙盒,可以在所有主要发行版中找到——通常默认安装。Bwrap允许你无需sudo就可以绑定挂载目录,并在git或shell退出时自动解除绑定。

假设你的开发过程不是很疯狂(见下文),在一个私有的命名空间中启动bash,并在git目录下绑定外部目录:

bwrap --ro-bind / / \
      --bind {EXTERNAL-DIR} {MOUNTPOINT-IN-GIT-DIR} \
      --dev /dev \
      bash

然后做你通常做的所有事情,比如git添加、git提交等等。当你完成时,退出bash。干净简单。

注意:为了防止沙盒转义,bwrap不允许执行其他setuid二进制文件。详见man bwrap。

嗯,mount -bind似乎对达尔文不起作用。

有人有什么诀窍吗?

(编辑)

好吧,我在Mac OS X上找到了答案,那就是做一个硬链接。只是这个API不是通过ln公开的,所以你必须用你自己的小程序来做这件事。以下是该程序的链接:

在Mac OS X中创建目录硬链接

享受吧!

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

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

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

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

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

/sourcedir /targetdir none bind