157 votes

Git diff --nom-seulement et copie cette liste

J'espère que quelqu'un pourra m'aider. Je veux juste obtenir la liste des fichiers modifiés entre les révisions, et c'est simple:

 git diff -–name-only commit1 commit2 > /path/to/my/file
 

Mais que dois-je écrire, si je veux copier tous les fichiers énumérés dans un autre endroit? Et j'ai besoin d'une structure de répertoire complètement identique pour les fichiers copiés.

Par exemple, j'ai modifié et ajouté des fichiers:

 /protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
 

Je veux avoir dans / home / changes / all que des fichiers modifiés et ajoutés:

 /home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
 

125voto

York Points 458

$ cp -pv --parents `git diff --name-only` DESTINATION-DIRECTORY

Testé et travaillé.

17voto

Vous pouvez le faire avec un simple script shell:

 #!/bin/bash
# Target directory
TARGET=/target/directory/here

for i in $(git diff --name-only)
    do
        # First create the target directory, if it doesn't exist.
        mkdir -p "$TARGET/$(dirname $i)"
        # Then copy over the file.
        cp "$i" "$TARGET/$i"
    done
 

16voto

Mark Longair Points 93104

La suivante devrait fonctionner:

git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/

Pour de plus amples explications:

  • L' -z avec git diff --name-only moyen de sortie de la liste de fichiers séparés par NUL octets au lieu de retours à la ligne, juste au cas où vos noms de fichiers ont des caractères inhabituels.

  • L' -0 de xargs dit à interpréter l'entrée standard comme un NUL séparées liste de paramètres.

  • L' -IREPLACE est nécessaire, car par défaut xargs voudrais ajouter les paramètres à la fin de l' rsync commande. Au lieu de cela, qui dit à qui la plus tard REPLACE . (C'est une astuce sympa à partir de ce Serveur Faute de réponse.)

  • L' -a paramètre rsync moyen de préserver les permissions, la propriété, etc. si cela est possible. L' -R moyen d'utiliser le chemin complet par rapport lors de la création des fichiers dans la destination.

Mise à jour: si vous avez une ancienne version d' xargs, vous aurez besoin d'utiliser l' -i option au lieu d' -I. (L'ancien est déconseillée dans les versions ultérieures d' findutils.)

14voto

kolypto Points 3161

Voici un one-liner:

Répertoriez les fichiers modifiés et créez-les au format * .zip:

 git diff --name-only | zip patched.zip -@
 

Répertoriez les derniers fichiers modifiés validés et compressez-les au format * .zip:

 git diff --name-only HEAD~ HEAD | zip patched.zip -@
 

6voto

Mark Points 898
zip update.zip $(git diff --name-only commit commit)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X