2013-11-09 22 views
6

Mutlak yolu /path/project/ olan git kök klasöründeyim. klasör yapısı şöyledir:Git rm simgesel bağlantı için göreceli yol üzerinde çalışır ancak mutlak yol değil

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

göreli yolu kullanarak git rm ile sembolik bağlantıyı kaldırabilirsiniz: git rm exec/alib_link

Ama mutlak yolu kullanarak orijinal klasörü silmeyi deneyin için git neden yerine

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

nasıl orijinal dizini silmeye çalışmasına izin vermeden simgesel bağlantıyı mutlak yol kullanarak kaldırmaya zorlayabilir miyim?

cevap

3

Bu Perl kullanarak bir Git takma için ile gelip başardık iyi:

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

Sen ile, sonra depo içinde herhangi bir yerden

git rma /path/project/alib_link 

yapabilirsiniz istenen etki.


Nasıl çalışır:

  • kabuk işlevini f çağırır rma Git takma.
  • Bu $1 Perl (git rma için bağımsız değişkeni) echo kullanılarak akımları. Perl, <>'u kullanarak okur.
  • Perl değişkeni $a, mutlak yolunu kullanarak kaldırmaya çalıştığınız dosyaya başvurmak için kullanılır.
  • Perl değişkeni $r, çalışma dizinine göre yolunu kullanarak kaldırmaya çalıştığınız dosyaya başvurmak için kullanılır. Kabuk komutlarını çalıştıran Git takma adlarının, havuz dizinini çalışma dizini olarak kullandığını unutmayın.
  • Göreli yol yazdırılarak Perl'den "döndürülür". Daha sonra kabuk değişkeni $r'da depolanır.
  • Son olarak, dosyayı gerçekten kaldırmak için git rm $r çalıştırıyoruz. Bunun ayrıca çalışma dizininde (yani, depo kökünde) çalıştığını unutmayın.

Daha özlü versiyonu olabilir: git adlar dizini çalışma olarak depo kök kullandığını işaret için

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

+10. Daha iyi bir seçenek olup olmadığını görmek için biraz bekleyeceğim ama yardımlarınız için teşekkür ederim. –

+0

@LimH .: Probs yok. Kabuk parçaları yapan yalnızca hedef takma adların çalışma dizini olarak depo kökünü kullandığını belirtmek gerekir. Eğer rmr = rm -r' gibi bir takma ad oluşturursanız, o zaman geçerli dizini kullanır. Daha fazla bir gözlem olarak - bununla oynanma sürecinde, depo kökünden asıl çalışma dizinine olan göreceli yolun GIT_PREFIX ortam değişkeninde depolanması gerektiğini buldum. –