2010-05-05 4 views
0

J'ai un alias git (git undo) qui annule tout dans le répertoire de travail, y compris les nouveaux fichiers, les fichiers modifiés et les fichiers supprimés:git alias undo avec xargs

!git reset --hard && git ls-files -d | xargs -0 git rm --ignore-unmatch && git clean -fq 

Sur OS X, cela fonctionne très bien. Sur Linux, cependant, je rencontre le problème suivant: si aucun fichier n'a été supprimé du référentiel, la commande git ls-files -d | xargs -0 git rm --ignore-unmatch échouera (xargs ne sera rien passé).

Existe-t-il un moyen pour que xargs se déplace silencieusement s'il ne reçoit rien de git ls-files?

+2

Si vous passez l'option '' -0' à xargs' alors il est important que vous utilisez aussi Option '-z' avec' git ls-files'. –

+0

Notez que pour annuler * tout *, vous pouvez (ou non) vouloir dire 'git clean -qfdx' (voir' git help clean') –

Répondre

3

Avec un git reset --hard devant elle, la git ls-files -d ne doit jamais générer une sortie (et si elle l'a fait, vous voulez utiliser git ls-files -d -z pour avoir produire une sortie fin NUL pour xargs -0).

Une fois que vous avez terminé git reset --hard, la partie suivie de l'arborescence de travail et l'index entier correspondent à la validation HEAD. git ls-files -d affichera uniquement les fichiers qui se trouvent dans l'index mais pas dans l'arborescence de travail. Comme l'arbre de travail aura tout ce que l'index a, il ne devrait jamais y avoir de fichiers supprimés après une réinitialisation matérielle.

Le bit git clean est utile pour supprimer des fichiers non suivis (qui git reset --hard ne touche pas), mais vous voudrez peut-être changer pour git clean -dfq également supprimer des répertoires entièrement non suivies).

+0

Ahhh, d'accord - je vois. Essayer de faire trop à la fois, semble-t-il. – ABach

2

De l'man page:

--no-run-if-empty, -r
Si l'entrée standard ne contient pas de Non vides, ne pas exécuter la commande
. Normalement, la commande est exécutée une fois même s'il n'y a pas d'entrée
. Cette option est une extension GNU.

Assurez-vous que votre version de xargs a cette option (man xargs)

+0

Cela ressemble à la réponse - étrange que la version OS X de xargs doesn ' t avoir cette option (ou l'utilise par défaut). Je suppose que je vais devoir faire des alias spécifiques au système d'exploitation. ;) – ABach

+0

OS X est basé sur FreeBSD, tout comme la version FreeBSD de xargs. C'est conforme POSIX, mais n'a pas d'extensions GNU. – rjh

0

Peut-être que vous voulez utiliser l'option "-r" de xargs:

xargs -r -0 git rm --ignore-unmatch 

De cette façon, si ls-files montre rien, xargs n'appellera pas git rm du tout.

0

Il est « git propre » (git-propre homme): Supprimer les fichiers non suivis de l'arbre de travail