2013-11-09 21 views
6

私はgitルートフォルダにあり、その絶対パスは/path/project/です。フォルダ構造は次のとおりです。Git rmはシンボリックリンクへの相対パスで動作しますが、絶対パスはありません

/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に強制することはできますか?

答えて

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 

を行うことができます所望の効果。


仕組み:

  • シェル関数を呼び出すfrma Gitの別名。
  • git rmaへの引数)をechoを使用してPerlにストリームします。 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" 
+0

10 Gitの別名は作業ディレクトリとしてリポジトリのルートを使用することを指摘し。より良い選択肢が出てくるかどうかを少しはお待ちしておりますが、お手数をお掛けいただきましてありがとうございます。 –

+0

@LimH .: probsはありません。シェルの作業を行うgitエイリアスだけが、作業ディレクトリとしてリポジトリルートを使用することに注意してください。 'rmr = rm -r'のようなエイリアスを作成すると、現在のディレクトリが使用されます。さらなる観察として、リポジトリルートから元の作業ディレクトリへの相対パスが環境変数GIT_PREFIXに格納されることが必要であれば、このことを知ることができました。 –

関連する問題