Windows中的Git符号链接


245

我们的开发人员混合使用Windows和Unix操作系统。因此,在Unix机器上创建的符号链接成为Windows开发人员的问题。在Windows(msysgit)中,符号链接将转换为文本文件,并带有指向该文件的路径。相反,我想将符号链接转换为实际的Windows符号链接。

我对此的(更新的)解决方案是:

  • 编写一个结帐后脚本,该脚本将递归查找“符号链接”文本文件。
  • 将它们替换为与虚拟“ symlink”具有相同名称和扩展名的Windows symlink(使用mklink)
  • 通过在.git / info / exclude中添加条目来忽略这些Windows符号链接

我尚未实现,但是我认为这是解决此问题的可靠方法。

问题:

  1. 您认为这种方法有什么弊端?
  2. 这个结帐后脚本甚至可以实现吗?即我可以递归地找出git创建的虚拟“符号链接”文件吗?
  3. 有人在做这样的剧本吗?

3
尽管Git支持符号链接,但我强烈建议不要将它们作为链接存储在资源库中,特别是如果您还在Windows上使用该代码时。
Greg Hewgill

2
@Greg Hewgill-我完全同意你的看法。不幸的是,我们代码库的性质需要符号链接...因此,对于我们来说,删除它们不是一个选择。
平川健(Ken Hirakawa)

12
您还可以在msysgit邮件列表上询问为什么他们首先没有像这样实现它。
2011年

8
@GregHewgill为什么不呢?Windows支持符号链接和结点-对我来说,这似乎确实是Windows版本的Git中缺少的功能...
BrainSlugs83 2013年

6
在Windows 10中启用“开发人员模式”后,创建符号链接不需要管理员权限!(其他人对投票较少的答案也发表了很多评论,但我没有看到它们。希望以后的读者可以更清楚地看到此评论。)
Dave Pascua

Answers:


105

您可以通过120000以下命令查找模式为的文件来找到符号链接:

git ls-files -s | awk '/120000/{print $4}'

替换链接后,我建议您将其标记为git update-index --assume-unchanged,而不要在中列出.git/info/exclude


2
我必须用awk将awk替换为msysgit,但否则效果很好。谢谢!
平川谦(Ken Hirakawa)

6
Helo Ken。您是否愿意共享您的脚本来检查符号链接文本文件,并使用mklink在Windows上将其替换为符号链接。尽管这实际上对我们有用,但假设不变的部分却没有。切换到另一个分支时,git说符号链接文件已更改,需要首先提交,而git status说没有更改。
joreg 2011年

6
这是我刚刚整理的一个PowerShell-gist.github.com/ferventcoder/7995025 – ferventcoder 2013
21:48

3
@flungo与使用GNU awk相比,有更多可移植的方式来打印第四列。例如:(git ls-files -s | grep '^12' | cut -f2第二个制表符分隔的列;其他列以空格分隔)
Zenexer '16

1
Cygwin / bash用来标记所有符号链接的衬套保持不变:for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
DaveAlden '16

187

不久前,我在问这个完全相同的问题(不是在这里,只是一般而言),最终提出了与OP主张非常相似的解决方案。首先,我将提供对问题1 2和3的直接答案,然后发布最终使用的解决方案。

  1. 提议的解决方案确实存在一些缺点,主要是由于存储库污染的可能性增加,或者在处于“ Windows symlink”状态时意外添加重复文件。(有关更多信息,请参见下面的“限制”。)
  2. 是的,可以执行结帐后脚本!也许不算git checkout是文字上的后续步骤,但是下面的解决方案已经很好地满足了我的需求,因此不需要文字上的后验结脚本。
  3. 是!

解决方案:

我们的开发人员处于与OP大致相同的情况:Windows和类Unix主机,具有许多git符号链接的存储库和子模块的混合,并且在MsysGit发行版中还没有本机支持(尚未)用于智能地处理Windows主机上的这些符号链接。

感谢Josh Lee指出git使用特殊的filemode提交符号链接的事实120000。通过此信息,可以添加一些git别名,以允许在Windows主机上创建和操作git符号链接。

  1. 在Windows上创建git符号链接

    git config --global alias.add-symlink '!'"$(cat <<'ETX'
    __git_add_symlink() {
      if [ $# -ne 2 ] || [ "$1" = "-h" ]; then
        printf '%b\n' \
            'usage: git add-symlink <source_file_or_dir> <target_symlink>\n' \
            'Create a symlink in a git repository on a Windows host.\n' \
            'Note: source MUST be a path relative to the location of target'
        [ "$1" = "-h" ] && return 0 || return 2
      fi
    
      source_file_or_dir=${1#./}
      source_file_or_dir=${source_file_or_dir%/}
    
      target_symlink=${2#./}
      target_symlink=${target_symlink%/}
      target_symlink="${GIT_PREFIX}${target_symlink}"
      target_symlink=${target_symlink%/.}
      : "${target_symlink:=.}"
    
      if [ -d "$target_symlink" ]; then
        target_symlink="${target_symlink%/}/${source_file_or_dir##*/}"
      fi
    
      case "$target_symlink" in
        (*/*) target_dir=${target_symlink%/*} ;;
        (*) target_dir=$GIT_PREFIX ;;
      esac
    
      target_dir=$(cd "$target_dir" && pwd)
    
      if [ ! -e "${target_dir}/${source_file_or_dir}" ]; then
        printf 'error: git-add-symlink: %s: No such file or directory\n' \
            "${target_dir}/${source_file_or_dir}" >&2
        printf '(Source MUST be a path relative to the location of target!)\n' >&2
        return 2
      fi
    
      git update-index --add --cacheinfo 120000 \
          "$(printf '%s' "$source_file_or_dir" | git hash-object -w --stdin)" \
          "${target_symlink}" \
        && git checkout -- "$target_symlink" \
        && printf '%s -> %s\n' "${target_symlink#$GIT_PREFIX}" "$source_file_or_dir" \
        || return $?
    }
    __git_add_symlink
    ETX
    )"
    

    用法:git add-symlink <source_file_or_dir> <target_symlink>,其中与源文件或目录相对应的参数必须采用相对于目标符号链接的路径形式您可以像平常一样使用此别名ln

    例如,存储库树:

    dir/
    dir/foo/
    dir/foo/bar/
    dir/foo/bar/baz      (file containing "I am baz")
    dir/foo/bar/lnk_file (symlink to ../../../file)
    file                 (file containing "I am file")
    lnk_bar              (symlink to dir/foo/bar/)
    

    可以在Windows上如下创建:

    git init
    mkdir -p dir/foo/bar/
    echo "I am baz" > dir/foo/bar/baz
    echo "I am file" > file
    git add -A
    git commit -m "Add files"
    git add-symlink ../../../file dir/foo/bar/lnk_file
    git add-symlink dir/foo/bar/ lnk_bar
    git commit -m "Add symlinks"
    
  2. 用NTFS硬链接+连接替换git符号链接

    git config --global alias.rm-symlinks '!'"$(cat <<'ETX'
    __git_rm_symlinks() {
      case "$1" in (-h)
        printf 'usage: git rm-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      ppid=$$
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        case "$symlink" in
          (*/*) symdir=${symlink%/*} ;;
          (*) symdir=. ;;
        esac
    
        git checkout -- "$symlink"
        src="${symdir}/$(cat "$symlink")"
    
        posix_to_dos_sed='s_^/\([A-Za-z]\)_\1:_;s_/_\\\\_g'
        doslnk=$(printf '%s\n' "$symlink" | sed "$posix_to_dos_sed")
        dossrc=$(printf '%s\n' "$src" | sed "$posix_to_dos_sed")
    
        if [ -f "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //H "$doslnk" "$dossrc"
        elif [ -d "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //J "$doslnk" "$dossrc"
        else
          printf 'error: git-rm-symlink: Not a valid source\n' >&2
          printf '%s =/=> %s  (%s =/=> %s)...\n' \
              "$symlink" "$src" "$doslnk" "$dossrc" >&2
          false
        fi || printf 'ESC[%d]: %d\n' "$ppid" "$?"
    
        git update-index --assume-unchanged "$symlink"
      done | awk '
        BEGIN { status_code = 0 }
        /^ESC\['"$ppid"'\]: / { status_code = $2 ; next }
        { print }
        END { exit status_code }
      '
    }
    __git_rm_symlinks
    ETX
    )"
    
    git config --global alias.rm-symlink '!git rm-symlinks'  # for back-compat.
    

    用法:

    git rm-symlinks [symlink] [symlink] [...]
    

    此别名可以一次删除一次或一次完全删除git符号链接。符号链接将被NTFS硬链接(对于文件)或NTFS联结(对于目录)替换。与“真正的” NTFS符号链接相比,使用硬链接+接头的好处是不需要提高的UAC权限即可创建它们。

    要从子模块中删除符号链接,只需使用git的内置支持对其进行迭代:

    git submodule foreach --recursive git rm-symlinks
    

    但是,对于像这样的每一次剧烈动作,都可以逆转……

  3. 在Windows上还原git符号链接

    git config --global alias.checkout-symlinks '!'"$(cat <<'ETX'
    __git_checkout_symlinks() {
      case "$1" in (-h)
        printf 'usage: git checkout-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        git update-index --no-assume-unchanged "$symlink"
        rmdir "$symlink" >/dev/null 2>&1
        git checkout -- "$symlink"
        printf 'Restored git symlink: %s -> %s\n' "$symlink" "$(cat "$symlink")"
      done
    }
    __git_checkout_symlinks
    ETX
    )"
    
    git config --global alias.co-symlinks '!git checkout-symlinks'
    

    用法:git checkout-symlinks [symlink] [symlink] [...],可以撤消git rm-symlinks,有效地将存储库恢复到其自然状态(更改除外,该更改保持不变)。

    对于子模块:

    git submodule foreach --recursive git checkout-symlinks
    
  4. 局限性:

    • 目录/文件/符号链接的路径中应该有空格。但是制表符或换行符?YMMV…(我的意思是:请勿这样做,因为它将无法正常工作。)

    • 如果您自己或其他人忘记git checkout-symlinks做某事,git add -A否则可能会导致广泛的后果,例如,本地存储库可能最终处于污染状态。

      使用以前的“示例存储库”:

      echo "I am nuthafile" > dir/foo/bar/nuthafile
      echo "Updating file" >> file
      git add -A
      git status
      # On branch master
      # Changes to be committed:
      #   (use "git reset HEAD <file>..." to unstage)
      #
      #       new file:   dir/foo/bar/nuthafile
      #       modified:   file
      #       deleted:    lnk_bar           # POLLUTION
      #       new file:   lnk_bar/baz       # POLLUTION
      #       new file:   lnk_bar/lnk_file  # POLLUTION
      #       new file:   lnk_bar/nuthafile # POLLUTION
      #
      

      哎呀...

      因此,最好将这些别名包含为在构建项目之前和之后对Windows用户执行的步骤,而不是在结帐后或推送之前。但是每种情况都不同。这些别名对我来说已经足够有用,因此不需要真正的结帐解决方案。

希望有帮助!

参考文献:

http://git-scm.com/book/en/Git-Internals-Git-Objects

http://technet.microsoft.com/zh-CN/library/cc753194

最后更新:2019-03-13

  • 符合POSIX(mklink当然,除了那些电话之外)-再也没有Bashisms了
  • 支持目录和其中包含空格的文件。
  • 现在正确保存/返回零和非零退出状态代码(分别用于传达请求的命令的成功/失败)。
  • add-symlink现在,别名的工作方式更像ln(1),可以在存储库中的任何目录中使用,而不仅仅是存储库的根目录。
  • rm-symlink别名(单数)已被取代由rm-symlinks用于选择性地变换的git符号链接到NTFS硬链接+结别名(复数),它现在可以接受多个参数(或根本没有参数,它找到所有符号链接的整个库,如前) 。
  • checkout-symlinks别名也已更新,以接受多个参数(在全或无,一切==)对上述转变的选择性逆转。

最后说明:尽管我确实使用Bash 3.2(甚至3.1)测试了加载和运行这些别名的对象,但由于各种原因它们仍然可能停留在这样的古老版本上,但请注意,像这样古老的版本因其解析器而臭名昭著。错误。如果在尝试安装这些别名中的任何一个时遇到问题,则首先要考虑的是升级外壳程序(对于Bash,请使用CTRL + X,CTRL + V检查版本)。另外,如果您尝试通过将它们粘贴到终端仿真器中来安装它们,则可能更幸运的是将它们粘贴到文件中并进行采购,例如

. ./git-win-symlinks.sh

祝好运!



这是一个很棒的脚本,但是有什么理由为什么要在我用git add-symlink创建的某些文件的末尾随机附加“ git”一词?
彼得·特纳

另外,如果您的文件名包含“ -h”,则可以使用。还是非常有用的脚本!
彼得·特纳

您的git add-symlink食谱对我来说非常有价值。非常感谢。
Dan Lenski

1
有什么方法可以使用挂钩自动执行这些脚本吗?
ARF

74

git scm的最新版本(testet 2.11.1)允许启用符号链接。但是您必须再次使用符号链接克隆存储库git clone -c core.symlinks=true <URL>。您需要以管理员权限运行此命令。也可以在Windows上使用mklink创建符号链接。查看Wiki

在此处输入图片说明


1
这对我不起作用。我为Windows重新安装了git,记得记住选中symlink复选框并再次克隆我的项目。我tslint.json引用父目录中文件的文件仍包含../tslint.json。可惜,因为这看起来确实是那里提出的所有解决方案中最简单的一种。
Jan Aagaard

8
@JanAagaard您必须像这样克隆它:git clone -c core.symlinks=true <URL> 在Windows上,必须以管理员权限运行它。
sirlunchalot

6
@ARF“启动gpedit.msc(即组策略编辑器),并将帐户添加到“计算机配置\ Windows设置\安全设置\本地策略\用户权限分配\创建符号链接”。
sirlunchalot

2
@sirlunchalot感谢您的帮助。从那以后,我意识到我的问题是我的用户属于Administrators组,并且此属性对这些用户无效。他们需要git不能做到的UAC提升。
ARF

9
Windows 10 Creators Update中的“开发人员模式”中不需要管理员权限。感谢@dennis 的评论
多米尼克

16

它应该在msysgit中实现,但是有两个缺点:

  • 符号链接仅在Windows Vista和更高版本中可用(2011年应该不是问题,但现在是...),因为较旧的版本仅支持目录连接。
  • (最大的)Microsoft认为符号链接存在安全风险,因此默认情况下只有管理员可以创建它们。您需要提升git进程的特权或使用fstool在您使用的每台计算机上更改此行为。

我进行了快速搜索,并且正在为此做积极的工作,请参阅问题224


2
更新:由于上述原因,该问题已作为wontfix被关闭。讨论表明,可以通过对该补丁进行更多工作来接受此修复程序(例如,仅在符号链接有效时使用它们)。
Blaisorblade 2012年

2
A.)当前,msysgit根本不支持符号链接-为什么不让它检测到“哦,您在使用NTFS的Vista上,让我使用符号链接”或“哦,您使用的操作系统支持与NTFS的连接,让我使用这些”,或“哦,您使用的是Windows 98 / fat32,请让我回退到没有此功能,而是警告您!” 然后是B。)几乎所有的Microsoft开发人员。如果您不以管理员身份运行工具,那么这些工具将无法正常工作(至少不是针对其所有功能)— IT部门中的每个人都知道开发人员需要成为自己的管理员。
BrainSlugs83 2013年

1
虽然我确实在Admin帐户中运行某些计算机,但我在开发计算机上却没有遵循这种理念。我始终以启用UAC的普通用户身份运行。我为需要提升特权的操作保留了单独的控制台。至于要实现它,归结于某个人(像您一样)自愿实现它。msysgit开发人员不以慈善闻名...
djs 2013年

@djs用户必须使用“以管理员身份运行”打开命令提示符。它几乎完全以管理员用户身份运行,从而完全改变了环境。无法以同样属于Admin组的用户身份运行'mklink / d'。它不会提示UAC。它将永远失败。它只有两种工作方式:名义上以管理员用户(RunAs Verb)或具有组策略更改的非管理员用户。连接点应为默认值,并且应被所有工具识别。“安全风险”是Windows上的符号链接可以“重定向” SMB共享。这是痛苦和残酷的。
Andrew T Finnell

8
2016年12月宣布,Windows 10中的Symlinks不再是管理员操作。 blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/…–
丹尼斯

16

因此,自从发布了这些答案以来,GIT发生了变化,这是使符号链接在Windows中正常运行的正确说明

2018年8月


1.确保git安装了symlink支持

在Windows上安装git的过程中

2.告诉Bash创建硬链接而不是符号链接

编辑-(git文件夹)/etc/bash.bashrc

添加到底部- MSYS=winsymlinks:nativestrict

3.设置git config以使用符号链接

git config core.symlinks true

要么

git clone -c core.symlinks=true <URL>

注意:我已经尝试将其添加到全局git config中,但目前对我不起作用,因此我建议将此添加到每个存储库中。

4.拉回购

注意:除非您在最新版本的Windows 10中启用了开发人员模式,否则需要以管理员身份运行bash来创建符号链接

5.重置所有符号链接(可选)如果您有现有的存储库,或者正在使用子模块,则可能会发现符号链接创建不正确,因此要刷新存储库中的所有符号链接,可以运行以下命令。

find -type l -delete
git reset --hard

注意:这将重置自上次提交以来的所有更改,因此请确保您先提交


15

简短的回答:现在,如果您可以启用开发人员模式,则很好地支持它们。

https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/

现在,在Windows 10 Creators Update中,用户(具有管理员权限)可以首先启用开发人员模式,然后计算机上的任何用户都可以运行mklink命令,而无需提升命令行控制台。

是什么推动了这一变化?对现代开发人员而言,符号链接的可用性和使用意义重大:

当创建存储库或软件包时,许多流行的开发工具(如git)和软件包管理器(如npm)分别识别并保持符号链接。然后将这些存储库或软件包还原到其他位置时,符号链接也将还原,以确保不会浪费磁盘空间(和用户的时间)。

易于忽略“创建者更新”的所有其他公告,但是,如果启用开发人员模式,则可以创建没有提升特权的符号链接。您可能必须重新安装git并确保启用了符号链接支持,因为默认情况下未启用它。

默认情况下不启用符号链接


1
gpedit.msc->-> Local Computer Policy-> Computer Configuration-> Windows Settings-> Security Settings-> Local Policies-> User Rights Assignment已成为分配用户权限(如SeCreateSymbolicLink“年龄”和“朋友”)的规范方法。除了ntrights.exe来自Resource Kit或PowerShell的信息...
0xC0000022L19

10

我建议您不要在回购协议中使用符号链接。将实际内容存储在存储库中,然后将符号链接放置在指向该内容的存储库外。

因此,可以说您使用回购协议来比较在* nix上托管站点与在Win上托管。存储在您的回购协议”的内容,可以说/httpRepoContentc:\httpRepoContent通过GIT,SVN等同步的文件夹。

然后,替换Web服务器的内容文件夹(/var/wwwc:\program files\web server\www指向您存储库中内容的符号链接 {名称实际上无关紧要,如果需要,请进行编辑})。Web服务器将在“正确的”位置看到内容,但是您可以使用源代码控制。

但是,如果您需要在“回购”中使用符号链接,则需要查看类似某种前/后提交脚本的内容。我知道您可以使用它们执行操作,例如通过格式化程序解析代码文件,因此应该可以在平台之间转换符号链接。

如果有人知道学习如何为通用源代码控件SVN GIT MG编写这些脚本的好地方,那么请添加注释。


最后,我选择了这种方法来创建一个symlink-out文件夹,并创建到原始文件所在位置的符号链接。即使更改了.git / config设置core.symlinks = true,另一种方法也无法正常工作。仅将符号链接文件保存到存储库,而不保存数据。符号链接上的文件夹时间戳也存在问题,因此当文件夹中的文件更改时,git bash从未见过。

我猜@Eggs您可能已经看到的是该链接位于存储库中,因此git简单地保存了它。但是,问题在于目标位于存储库之外,而git没有遵循指向目标数据的链接。在Linux上,您有一种适用于此的链接类型,基本上是让您有两条路径存储到磁盘上的同一数据。我觉得新的Windows现在可以做到这一点。无论哪种方式,我仍然认为它不会做人们想要的事情。
thecoshman '18

@thecoshman这不是解决方案,而是解决方法。但是,有时这不是一个选择。我有一个带有git-annex的存储库,由于符号链接,其所有体系结构都可以工作。
marcelo.guedes

10

2020年答案

  1. 在Windows 10中启用“开发人员模式”-授予mklink权限
  2. 确保在git中启用符号链接
    • git config --global core.symlinks true
    • 在安装msysgit时选中该复选框

切换分支将迫使重新创建丢失的符号链接。

注意,在Windows上与其他一些Git客户端的对Symlinks的支持还不完整。尤其是GitKraken。


我所有的本地存储库都具有core.symlinks = false,它将覆盖您的解决方案。知道什么是自动生成此本地配置的吗?是否可能在不选中复选框的情况下为Windows安装Git?
gravidThoughts

@gravid思考您安装了哪个git客户端?也许有些工具正在执行此操作?在新克隆中这是真的吗?
卡梅隆·塔克林德

8

对于在Vista,Win7或更高版本上使用CygWin的用户,本机git命令可以创建Windows应用程序(例如Android Studio)可以识别的“正确”符号链接。您只需要将CYGWIN环境变量设置为include winsymlinks:nativewinsymlinks:nativestrict这样:

export CYGWIN="$CYGWIN winsymlinks:native"

不利的一面(也是那个意义上的一个重要方面)是CygWin shell必须以“以管理员身份运行”,才能拥有创建此类符号链接所需的OS权限。但是,一旦创建它们,就不需要特殊的权限才能使用它们。只要没有其他开发人员在存储库中更改它们,git此后在具有正常用户权限的情况下即可正常运行。

就个人而言,由于增加了难度,我仅将其用于Windows应用程序(即非CygWin)导航的符号链接。

有关此选项的更多信息,请参见以下SO问题:如何在Windows 7中使用cygwin进行符号链接


6

这是一个基于Josh Lee的答案的批处理脚本,用于转换存储库中的符号链接(仅用于文件)。带有一些额外的管理员权限检查的脚本在https://gist.github.com/Quazistax/8daf09080bf54b4c7641

@echo off
pushd "%~dp0"
setlocal EnableDelayedExpansion

for /f "tokens=3,*" %%e in ('git ls-files -s ^| findstr /R /C:"^120000"') do (
     call :processFirstLine %%f
)
REM pause
goto :eof

:processFirstLine
@echo.
@echo FILE:    %1

dir "%~f1" | find "<SYMLINK>" >NUL && (
  @echo FILE already is a symlink
  goto :eof
)

for /f "usebackq tokens=*" %%l in ("%~f1") do (
  @echo LINK TO: %%l

  del "%~f1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: del
    goto :eof
  )

  setlocal
  call :expandRelative linkto "%1" "%%l"
  mklink "%~f1" "!linkto!"
  endlocal
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: mklink
    @echo reverting deletion...
    git checkout -- "%~f1"
    goto :eof
  )

  git update-index --assume-unchanged "%1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: git update-index --assume-unchanged
    goto :eof
  )
  @echo SUCCESS
  goto :eof
)
goto :eof

:: param1 = result variable
:: param2 = reference path from which relative will be resolved
:: param3 = relative path
:expandRelative
  pushd .
  cd "%~dp2"
  set %1=%~f3
  popd
goto :eof

当已经存在冗长而冗长的答案时,未记录的答案实际上并没有太大用处。
Xennex81 '17

4

我一直在我的文档根目录和git repo目录之间使用符号链接。我喜欢将它们分开。在Windows上,我使用mklink / j选项。联结似乎让git表现正常:

>mklink /j <location(path) of link> <source of link>

例如:

>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts


2
注意Windows资源管理器和联结。它不会将连接与基本位置区分开,并且删除会递归到目标并删除其内容,而删除符号链接只会删除符号链接。只是陷阱。
劳伦斯·多尔

5
实际上,仅在最新的Windows7上对此进行了测试,并且不再使用它,因此在过去几年中的某个时候,对联结的处理已有所改进。
劳伦斯·多尔

3

我一直在寻找一种简单的解决方案来处理Windows上的Unix符号链接。非常感谢您提供上述Git别名。可以对rm-symlinks进行一些优化,以免在意外再次运行别名时不会删除目标文件夹中的文件。在运行逻辑之前,请在循环中观察新的if条件,以确保该文件尚未链接到目录。

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
for symlink in $(git ls-files -s | egrep "^120000" | cut -f2); do
    *if [ -d "$symlink" ]; then
      continue
    fi*
    git rm-symlink "$symlink"
    git update-index --assume-unchanged "$symlink"
done
}; __git_rm_symlinksenter 

2

我们使用的一个简单技巧是git add --all连续调用两次。

例如,我们的Windows 7提交脚本调用:

$ git add --all
$ git add --all

第一个添加将链接视为文本,并添加要删除的文件夹。

第二个添加正确地遍历链接,并通过还原文件来撤消删除。

它不像其他一些提议的解决方案那样优雅,但是它是对我们一些添加符号链接的旧环境的简单修复。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.