2013-11-09 21 views
6

Sono nella cartella radice git, il cui percorso assoluto è /path/project/. La struttura della cartella è:Git rm funziona sul percorso relativo al collegamento simbolico ma non sul percorso assoluto

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

posso rimuovere il collegamento simbolico con git rm con percorso relativo: git rm exec/alib_link

Ma usando percorso assoluto provoca git per provare a cancellare la mia cartella originale invece

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

Come posso forzare git a rimuovere il collegamento simbolico usando il percorso assoluto senza che provi a cancellare la mia directory originale?

risposta

3

Il meglio che ho potuto venire con per questo è un alias Git utilizzando Perl:

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

si può quindi fare

git rma /path/project/alib_link 

da qualsiasi punto all'interno del repository, con il effetto desiderato.


Come funziona:

  • L'alias Git rma chiama la funzione di shell f.
  • Questo stream $1 (l'argomento a git rma) a Perl utilizzando echo. Perl lo legge usando <>.
  • La variabile Perl $a viene utilizzata per fare riferimento al file che si sta tentando di rimuovere utilizzando il suo percorso assoluto.
  • La variabile Perl $r viene utilizzata per fare riferimento al file che si sta tentando di rimuovere utilizzando il relativo percorso relativo alla directory di lavoro. Nota che gli alias Git che eseguono comandi di shell usano la root del repository come directory di lavoro.
  • Il percorso relativo viene "restituito" da Perl stampandolo. Viene quindi memorizzato nella variabile di shell $r.
  • Infine, eseguiamo git rm $r per rimuovere effettivamente il file. Si noti che questo viene eseguito anche nella directory di lavoro (cioè la radice del repository).

Una versione più concisa potrebbe essere:

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

+10 per aver ricordato che gli alias Git utilizzano la radice repository come directory di lavoro. Aspetterò un po 'per vedere se arrivano le migliori opzioni, ma grazie per il tuo aiuto. –

+0

@LimH .: nessun problema. Vale la pena notare che solo gli alias git che fanno le shell usano la root del repository come directory di lavoro. Se crei un alias come 'rmr = rm -r', allora usa la directory corrente. Come ulteriore osservazione, ho scoperto nel processo di giocare con questo che il percorso relativo dalla radice del repository alla directory di lavoro originale viene memorizzato nella variabile di ambiente GIT_PREFIX, se necessario. –

Problemi correlati