我最好是将shell脚本替换为副本的符号链接,还是有另一种方法告诉Git遵循符号链接?
PS:我知道它不是很安全,但是我只想在某些特定情况下这样做。
我最好是将shell脚本替换为副本的符号链接,还是有另一种方法告诉Git遵循符号链接?
PS:我知道它不是很安全,但是我只想在某些特定情况下这样做。
Answers:
注意:从Git 1.6.1开始,此建议现在已过期。Git过去一直是这种方式,现在不再这样做。
默认情况下,Git尝试存储符号链接而不是跟随它们(为了紧凑,这通常是人们想要的)。
但是,当符号链接是目录时,我不小心设法使其添加到符号链接之外的文件。
即:
/foo/
/foo/baz
/bar/foo --> /foo
/bar/foo/baz
通过做
git add /bar/foo/baz
当我尝试时它似乎起作用。但是,当时我不希望这种行为,因此我无法提供其他信息。
为了将符号链接中的文件导入Git而进行的添加操作(我没有使用符号链接,但):
sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY
在Git管理的目录中执行此命令。TARGETDIRECTORY
必须在将SOURCEDIRECTORY
其安装到其中之前创建。
它可以在Linux上正常运行,但不能在OS X上运行!这个技巧也对Subversion有所帮助。我使用它来包含来自Dropbox帐户的文件,该帐户由Webdesigner负责。
umount [mydir]
。(+1为您的技巧,@ user252400)
为什么不反过来创建符号链接呢?含义不是从Git存储库链接到应用程序目录,而是以另一种方式链接。
例如,假设我要安装~/application
一个需要配置文件的应用程序config.conf
:
config.conf
到我的Git存储库,例如,在~/repos/application/config.conf
。~/application
通过运行 创建一个符号链接ln -s ~/repos/application/config.conf
。这种方法可能并不总是有效,但到目前为止对我来说效果很好。
请改用硬链接。这不同于软(符号)链接。所有程序,包括git
将文件视为常规文件。请注意,内容可以通过改变被修改或者源或目的地。
如果您已经安装了git和Xcode,请安装hardlink。这是创建硬链接的微观工具。
要创建硬链接,只需:
hln source destination
苹果文件系统是否支持目录硬链接?
Apple文件系统不支持目录硬链接。在macOS上从HFS +转换为APFS卷格式时,所有目录硬链接都会转换为符号链接或别名。
请遵循https://github.com/selkhateeb/hardlink/issues/31了解未来的选择。
该ln
命令可以建立硬链接:
ln source destination
有人建议在Windows上使用mklink创建联结,但我还没有尝试过:
mklink /j "source" "destination"
ln source destination
在OS X中也可以使用。在El Capitan上测试。
cp -al source destination
。-l表示硬链接文件,而不是复制文件。
这是一个预提交的挂钩,它将这些索引中的符号链接blob替换为这些符号链接的内容。
将其放入中.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。
尽管经过了一些测试,但此代码中可能存在一些错误/错误。
typechange
在git status
为这实际上是符号链接,虽然现在混帐东西,他们不是文件。
process_links_to_nondir
?
argv[0]
,用作sh
进程的命令名称。(花了我一些时间才弄清楚,因为我也不记得是什么了)
find: missing argument to -exec'
。可能需要一步一步地执行命令,而不是通过管道将所有内容组合成一行。
typechange
@DavidFraser 之类的东西,但是链接的文件似乎不再上演了)
在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>
其他评论已暗示了这一点,但其他答案中并未明确提供。希望这可以节省一些时间。
Failed to resolve
... No such file or directory
错误。bindfs
我对这里的每个解决方案都已过时或需要root用户感到厌倦,因此我制作了一个基于LD_PRELOAD的解决方案(仅Linux)。
它与Git的内部息息相关,覆盖了“这是一个符号链接吗?” 功能,允许将符号链接视为其内容。默认情况下,内联到回购协议之外的所有链接都是内联的;有关详细信息,请参见链接。
LD_PRELOAD
用于覆盖库函数!
在Git 2.3.2+(2015年第一季度)中,还有另外一种情况,Git将不再遵循符号链接:请参见Junio C Hamano (gitster
)(主要的Git维护者)的commit e0d201b。
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
嗯,mount --bind
似乎不适用于达尔文。
有人有招吗?
[编辑]
好的,我发现Mac OS X上的答案是建立硬链接。除了该API不是通过公开的ln
,因此您必须使用自己的微型程序来执行此操作。这是该程序的链接:
请享用!
我使用的是Git 1.5.4.3,如果传递的符号链接带有斜杠,它会遵循传递的符号链接。例如
# Adds the symlink itself
$ git add symlink
# Follows symlink and adds the denoted directory's contents
$ git add symlink/
fatal: 'src/' is beyond a symbolic link