it-swarm.cn

如何让Git遵循符号链接?

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

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

182
Matt

注意: 自Git 1.6.1起,此建议现已根据评论过时。 Git曾经以这种方式行事,而不再这样做。


Git默认尝试存储符号链接而不是跟随它们(对于紧凑性,它通常是人们想要的)。

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

即:

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

通过做

 git add /bar/foo/baz

当我尝试它时,它似乎工作。然而,当时我的这种行为是不受欢迎的,所以我无法向你提供除此之外的信息。

39
Kent Fredric

我做了什么来添加到符号链接中的文件到Git(我没有使用符号链接但是):

Sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

在Git托管目录中执行此命令。必须在TARGETDIRECTORY加载之前创建SOURCEDIRECTORY

它适用于Linux,但不适用于OS X!这个技巧也帮助了Subversion。我使用它来包含来自Dropbox帐户的文件,其中webdesigner执行他/她的东西。

127
user252400

为什么不以相反的方式创建符号链接?意思是代替从Git存储库到应用程序目录的链接,只需链接另一种方式。

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

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

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

66
spier

请改用硬链接。这与软(符号)链接不同。所有程序(包括git)都会将该文件视为常规文件。请注意,可以通过更改源或目标来修改内容。

在macOS上(10.13 High Sierra之前)

如果你已经安装了git和Xcode, install hardlink 。这是一个微观 创建硬链接的工具

要创建硬链接,只需:

hln source destination

macOS High Sierra更新

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,...)

有人建议使用 mklink 在Windows上创建一个联结,但我还没有尝试过:

mklink /j "source" "destination"
43
bfred.it

这是一个 预提交钩子 它用这些符号链接的内容替换索引中的符号链接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,可能还有其他内容。

此代码中可能存在一些错误/错误,即使它已经过一些测试。

19
Abbafei

我过去常常在符号链接之外添加文件已有一段时间了。过去工作得很好,没有做任何特殊安排。自从我更新到Git 1.6.1后,这不再适用了。

您可以切换到Git 1.6.0来完成这项工作。我希望Git的未来版本会有git-add的标志,允许它再次遵循符号链接。

12
Erik Schnetter

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

它与Git的内部结构挂钩,覆盖了'这是一个符号链接吗?'函数,允许将符号链接视为其内容。默认情况下,所有指向repo外部的链接都是内联的;请参阅链接了解详情。

7
Alcaro

使用Git 2.3.2 +(2015年第1季度),还有另一个案例,Git将 not 跟随符号链接:参见 commit e0d201b by Junio C Hamano(gitster (main 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
6
VonC

嗯,mount --bind似乎不适用于达尔文。

有人有诀窍吗?

[编辑]

好的,我发现Mac OS X上的答案是建立一个硬链接。除了API没有通过ln公开,所以你必须使用自己的小程序来做到这一点。这是该程序的链接:

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

请享用!

4
J Chris A

MacOS(我有Mojave/10.14,git版本2.7.1),使用bindfs

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

它已被其他评论暗示,但在其他答案中没有明确提供。希望这能节省一些时间。

3
ijoseph

我正在使用Git 1.5.4.3,如果它有一个尾部斜杠,它会跟随传递的符号链接。例如。

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/
1
artistoex

从符号链接转换可能很有用。链接在Git文件夹而不是符号链接 由脚本

0
Yurij73