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はシェル関数を呼び出しますf
  • $1これは、 を使用して ( への引数git rma) を Perlにストリーミングしechoます。Perl は を使用してそれを読み取ります<>
  • Perl 変数$aは、絶対パスを使用して削除しようとしているファイルを参照するために使用されます。
  • Perl 変数$rは、作業ディレクトリからの相対パスを使用して、削除しようとしているファイルを参照するために使用されます。シェル コマンドを実行する Git エイリアスは、作業ディレクトリとしてリポジトリ ルートを使用することに注意してください。
  • 相対パスは、表示することによって Perl から「返されます」。その後、シェル変数に格納されます$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 に答える