我最好是一个shell脚本用副本替换符号链接,还是有另一种方式告诉Git遵循符号链接?
PS:我知道它不是很安全,但我只想在一些特定情况下这样做.
我做了什么来添加到符号链接中的文件到Git(我没有使用符号链接但是):
sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
在Git托管目录中执行此命令.TARGETDIRECTORY
必须在SOURCEDIRECTORY
安装到它之前创建.
它适用于Linux,但不适用于OS X!这个技巧也帮助了Subversion.我使用它来包含来自Dropbox帐户的文件,其中webdesigner执行他/她的东西.
为什么不以相反的方式创建符号链接?意思是代替从Git存储库到应用程序目录的链接,只需链接另一种方式.
例如,假设我正在设置一个~/application
需要配置文件的应用程序config.conf
:
我添加config.conf
到我的Git存储库,例如,at ~/repos/application/config.conf
.
然后我~/application
通过运行 创建一个符号链接ln -s ~/repos/application/config.conf
.
这种方法可能并不总是有效,但到目前为止它对我来说效果很好.
注意:自Git 1.6.1起,此建议现已根据评论过时.Git曾经以这种方式行事,而不再这样做.
Git默认尝试存储符号链接而不是跟随它们(对于紧凑性,它通常是人们想要的).
但是,当符号链接是目录时,我偶然设法让它在符号链接之外添加文件.
即:
/foo/ /foo/baz /bar/foo --> /foo /bar/foo/baz
通过做
git add /bar/foo/baz
当我尝试它时,它似乎工作.然而,当时我的这种行为是不受欢迎的,所以我无法向你提供除此之外的信息.
请改用硬链接.这与软(符号)链接不同.所有程序,包括git
将文件视为常规文件.请注意,内容可以通过改变被修改或者源或目的地.
如果您已经安装了git和Xcode,请安装hardlink.它是创建硬链接的微观工具.
要创建硬链接,只需:
hln source destination
Apple文件系统是否支持目录硬链接?
Apple File System不支持目录硬链接.在macOS上从HFS +转换为APFS卷格式时,所有目录硬链接都将转换为符号链接或别名.
来自developer.apple.com上的APFS FAQ
关注https://github.com/selkhateeb/hardlink/issues/31以了解未来的替代方案.
在Linux和其他Unix风格该ln
命令可以生成硬链接:
ln source destination在Windows上(Vista,7,8,...)
有人建议在Windows上使用mklink创建一个联结,但我还没有尝试过:
mklink /j "source" "destination"
这是一个预提交钩子,用这些符号链接的内容替换索引中的符号链接blob.
把它放入.git/hooks/pre-commit
,并使其可执行:
#!/bin/sh # (replace "find ." with "find ./" 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 1.6.0来完成这项工作.我希望Git的未来版本会有一个标志,git-add
允许它再次遵循符号链接.
在MacOS
(我有Mojave / 10.14,git
版本2.7.1)上,使用bindfs
。
brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs
其他评论已暗示了这一点,但其他答案中并未明确提供。希望这可以节省一些时间。
使用Git 2.3.2+(Q1 2015年),还有就是Git会另一起案件不遵循符号链接了:见犯e0d201b通过JUNIOÇ滨野(gitster
)(主Git的维护者)
apply
:不要触摸符号链接之外的文件因为Git将符号链接跟踪为符号链接,所以在其主要部分中具有符号链接的路径(例如
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
我厌倦了这里的每个解决方案要么已经过时,要么需要root,所以我做了一个基于LD_PRELOAD的解决方案(仅限Linux).
它与Git的内部结构挂钩,覆盖了'这是一个符号链接吗?' 函数,允许将符号链接视为其内容.默认情况下,所有指向repo外部的链接都是内联的; 请参阅链接了解详情.