Je veux juste obtenir une liste des fichiers modifiés entre deux révisions, ce qui est simple:
git diff -–name-only commit1 commit2 > /path/to/my/file
Mais, que dois-je écrire, si je veux copier tous les fichiers répertorié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/
tous ces fichiers modifiés et ajoutés:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
peut faire cela pour les plages de validation.git diff commit1 commit2 > my.patch
et puiscd other/path; patch -p1 < my.patch
. Pourquoi faut-il le faire avec des copies complètes des fichiers? Si c'est parce que vous pensez que le correctif pourrait ne pas s'appliquer, et que par conséquent l'autre répertoire n'est pas vraiment dans l'commit1
état, vous devriez vraiment tout copier de l'commit2
état ...Réponses:
Essayez la commande suivante, que j'ai testée:
la source
cp --parents
indice, je voulais cette option depuis des années et je n'ai jamais su qu'elle existait! .. évidemment je n'ai jamais pris la peine de le chercher non plus = \--parents
option decp
n'est pas disponible.IFS=$'\n'
premier peut le faire. (De préférence dans un sous-shell pour ne pas gâcher votre valeur IFS d'origine.)cp: cannot stat 'git diff --name-only': No such file or directory
sur git bash sous Windows. Qu'est-ce que je fais mal? Le répertoire de destination existeLes éléments suivants devraient fonctionner correctement:
Pour expliquer davantage:
Le
-z
à avecgit diff --name-only
signifie pour afficher la liste des fichiers séparés par des octets NUL au lieu de nouvelles lignes, juste au cas où vos noms de fichiers contiennent des caractères inhabituels.Le
-0
toxargs
dit d'interpréter l'entrée standard comme une liste de paramètres séparés par NUL.Le
-IREPLACE
est nécessaire car par défautxargs
ajouterait les paramètres à la fin de larsync
commande. Au lieu de cela, cela dit de les mettre là où se trouve le dernierREPLACE
. (C'est un bon conseil de cette réponse Server Fault .)Le
-a
paramètrersync
signifie pour préserver les autorisations, la propriété, etc. si possible. Le-R
moyen d'utiliser le chemin d'accès relatif complet lors de la création des fichiers dans la destination.Mise à jour: si vous avez une ancienne version de
xargs
, vous devrez utiliser l'-i
option à la place de-I
. (Le premier est obsolète dans les versions ultérieures defindutils
.)la source
xargs --version
dit-elle?-i
place, ce qui est obsolète dans les versions ultérieures - la 4.1 est maintenant assez ancienne. Je mettrai à jour ma réponse.-I
dans certaines versions, alors essayez peut-être à la-I REPLACE
place.-I
n'est pris en charge que depuis la versionfindutils
4.2.10, sortie en décembre 2004.--diff-filter=d
pour exclure les fichiers supprimés de la liste. Sinon, vous finirez par avoir des erreurs en essayant de les copier dans le dossier des modifications. Sinon, bonne réponse. Merci!Voici un one-liner:
Répertoriez les fichiers modifiés et compressez-les au format * .zip:
Répertoriez les derniers fichiers modifiés validés et compressez-les au format * .zip:
la source
sed.exe
? Je ne suis toujourszip
pas trouvé sur Windows.PATH
variable env.la source
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
la source
Cela fonctionne parfaitement.
la source
Personne n'a mentionné
cpio
ce qui est facile à taper, crée des liens physiques et gère les espaces dans les noms de fichiers:la source