我的最佳选择是用一个Shell脚本替换符号链接为拷贝,还是有其他的方法告诉Git跟随符号链接?
PS:我知道这样做不太安全,但我只想在一些特定情况下这么做。
我的最佳选择是用一个Shell脚本替换符号链接为拷贝,还是有其他的方法告诉Git跟随符号链接?
PS:我知道这样做不太安全,但我只想在一些特定情况下这么做。
我是如何将符号链接中的文件添加到Git中的(我没有使用符号链接,但是):
sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
在Git管理的目录中执行此命令。TARGETDIRECTORY
必须在将SOURCEDIRECTORY
挂载到其中之前创建。
它在Linux上运行良好,但在OS X上不行!这个诀窍也帮助我解决了Subversion的问题。我用它来包含从Dropbox帐户中的Web设计师那里获取的文件。
如果您想使此绑定永久,请将以下行添加到/etc/fstab
:
/sourcedir /targetdir none bind
umount [mydir]
命令。(感谢 @user252400 的好建议,加1赞!) - JellicleCat~/application
中并需要配置文件config.conf
的应用程序:
config.conf
添加到我的Git仓库中,例如在~/repos/application/config.conf
处。ln -s ~/repos/application/config.conf
在~/application
中创建一个符号链接。使用硬链接代替软链接(symbolic link),所有程序,包括 git
,都将把该文件视为常规文件。请注意,可以通过更改源或目标来修改其内容。
如果已经安装了 git 和 Xcode,请安装hardlink。它是一个微小的创建硬链接的工具。
要创建硬链接,只需执行以下操作:
hln source destination
苹果文件系统是否支持目录硬链接?
苹果文件系统不支持目录硬链接。当您在 macOS 上从 HFS+ 转换到 APFS 卷格式时,所有目录硬链接都会被转换为符号链接或别名。
请关注https://github.com/selkhateeb/hardlink/issues/31以获取未来的替代方案。
ln
命令可以创建硬链接:
ln source destination
使用mklink命令来创建一个链接:
mklink /j "source" "destination"
ln source destination
在 OS X 上也可以使用。已在 El Capitan 上进行了测试。 - Mahdi Dibaieecp -al 源路径 目标路径
。其中 -l
表示创建硬链接而不是复制文件。 - Paolo注意:此建议已过时,根据Git 1.6.1的评论。 Git曾经以此方式运行,现在不再。
默认情况下,Git尝试存储符号链接而不是遵循它们(出于紧凑性,并且这通常是人们想要的)。
但是,当符号链接是目录时,我意外地设法使它添加超出符号链接的文件。
即:
/foo/
/foo/baz
/bar/foo --> /foo
/bar/foo/baz
通过执行
git add /bar/foo/baz
我尝试过,似乎有效。但当时我不需要那种行为,所以除此之外我无法提供更多信息。
.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标准,还有其他一些可能。
尽管代码经过了一些测试,但仍可能存在一些错误/问题。
sh
进程命令名的名称/argv[0]
。(花了我一点时间才明白,因为我也记不得它是什么了☺) - Abbafeitypechange
,但是似乎链接的文件不再被暂存了)。 - Scz在 macOS(我的版本是 Mojave/10.14,git
版本为 2.7.1)上,可以使用 bindfs
。
brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>
其他评论中已经提到过,但在其他答案中没有明确提供。希望这能为某些人节省一些时间。
bindfs
命令中使用完整路径名,否则我会遇到Failed to resolve
...No such file or directory
错误。 - electromaggotmacfuse
后,您必须下载最新版本的bindfs
并构建它。您必须使用gmake
(与brew
一起安装的版本),而不是Mac默认的make
才能使其正常工作。按照README
中的步骤进行制作和安装。安装完成后,请确保首先创建空的子目录,因为这本质上是一个挂载操作。如注所述,bindfs
在两个参数上都需要完整路径(并且在目标中,请确保将您创建的目录作为挂载点的最后一个元素添加)。 - Aron Tgmake
绕过了这些问题,而较新版本的Mac OS X已经解决了。更奇怪的是,苹果公司在近两年内都没有升级其make
版本! - Aron T我厌倦了这里的每一个解决方案都过时或需要root权限,所以我制作了一种基于LD_PRELOAD的解决方案(仅适用于Linux)。
它钩入Git的内部,覆盖“这是符号链接吗?”函数,允许将符号链接视为它们的内容。默认情况下,所有指向仓库外部的链接都会被内联;有关详细信息,请参见链接。
LD_PRELOAD
覆盖库函数的非常有创意的解决方案! - iBug我过去一直用符号链接添加文件,而且一直都没有问题,不需要做任何特殊的安排。但自从我升级到 Git 1.6.1 后,这种方法就无法使用了。
你可以尝试切换回 Git 1.6.0 来使其正常工作。我希望未来版本的 Git 会有一个标志,允许 git-add
命令再次跟随符号链接。
从Git 2.3.2+(2015年第一季度)开始,有另外一种情况下Git将不再跟随符号链接:请参见提交e0d201b由Junio C Hamano (gitster
)(主要Git维护者)。
apply
:不要触及符号链接之外的文件path/to/dir/file
,其中path/to/dir
是指向其他位置的符号链接,无论是在工作树内部还是外部)永远不会出现在有效应用补丁中,除非相同的补丁首先删除符号链接以允许在那里创建目录。检测并拒绝这样的补丁。同样,当一个输入创建一个符号链接path/to/dir
,然后创建一个文件path/to/dir/file
时,我们需要将其标记为错误,而不实际在文件系统中创建path/to/dir
符号链接。相反,对于任何在结果中留下路径(即非删除)的输入补丁,我们检查所有前导路径与通过检查输入中的所有补丁,然后是补丁应用的目标(索引或工作树)所创建的结果树相匹配。这样,我们可以捕捉同时添加符号链接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
嗯,mount --bind
在 Darwin 上似乎不起作用。
有没有什么技巧可以实现呢?
[编辑]
好的,我在 Mac OS X 上找到了答案,就是使用硬链接。除了这个 API 不会通过 ln
公开,所以你需要使用自己的小程序来完成。下面是一个链接到该程序的链接:
享受吧!