6

我在 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 使用绝对路径删除符号链接而不导致它尝试删除我的原始目录?

4

1 回答 1

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
  • 这使用 .$1将(的参数git rma)流式传输到 Perl echo。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"
于 2013-11-09T20:56:45.827 回答