Git rm适用于符号链接的相对路径,但不是绝对路径

时间:2013-11-09 10:40:32

标签: git

我在git根文件夹中,其绝对路径为/path/project/。文件夹结构是:

/path/project
---- libs/alib (actual library folder)
---- exec/alib_link (symbolic link to the actual alib folder)

我可以使用相对路径git rm

删除git rm exec/alib_link的符号链接

但是使用绝对路径会导致git尝试删除原始文件夹

git rm /path/project/alib_link
fatal: not removing /path/project/libs/alib recursively without -r

如何强制git使用绝对路径删除符号链接而不会导致它尝试删除原始目录?

1 个答案:

答案 0 :(得分:3)

我能想到的最好的是使用Perl的Git别名:

rma = "!f() { r=`echo $1 | perl -e 'use Path::Class; $a=file(<>); $r=$a->relative(\".\"); print $r;'`; git rm $r; }; f"

然后你可以做

git rma /path/project/alib_link

从您的存储库中的任何位置,具有所需的效果。


工作原理:

  • Git别名rma调用shell函数f
  • 使用$1git rmaecho的参数)传递给Perl。 Perl使用<>读取它。
  • Perl变量$a用于指代您尝试使用其绝对路径删除的文件。
  • Perl变量$r用于引用您尝试使用其相对于工作目录的路径删除的文件。请注意,运行shell命令的Git别名使用存储库根目录作为其工作目录。
  • 通过打印来从Perl“返回”相对路径。然后将其存储在shell变量$r
  • 最后,我们运行git rm $r来实际删除该文件。请注意,这也在工作目录(即存储库根目录)中运行。

更简洁的版本可能是:

rma = "!f() { git rm `perl -e 'use Path::Class; print file($ARGV[0])->relative(\".\");' $1`; }; f"