84 votes

Git : comment obtenir tous les fichiers modifiés et les nouveaux fichiers dans un dossier ou un zip ?

Comme le dit ma question, après avoir modifié des fichiers et ajouté de nouveaux fichiers dans mon référentiel, je commet normalement les fichiers avec git Mais parfois, j'ai besoin que tous les fichiers modifiés soient copiés dans un dossier pour des raisons d'organisation personnelle.

Une option ?

0 votes

Si vous nous dites ce que vous essayez d'accomplir, nos réponses seront peut-être un peu plus utiles.

0 votes

Ça dépend, parfois juste pour les ftp

0 votes

Mais "les mettre sur ftp" n'est pas un objectif en soi. Quelle est la raison de faire cela ? Je n'ai jamais voulu créer un zip des seuls fichiers modifiés, je m'interroge donc sur le cas d'utilisation.

125voto

Jefromi Points 127932

En supposant que vous voulez dire que vous n'avez pas encore livré, et que vous voulez empaqueter tous les fichiers qui ont actuellement des modifications locales, vous pouvez obtenir la liste des fichiers modifiés avec git ls-files --modified . Si vous voulez les fichiers qui ont été modifiés par la dernière livraison, vous pouvez utiliser git diff --name-only HEAD^ . C'est à vous de décider où vous voulez en venir. Exemples :

zip modified-files.zip $(git ls-files --modified)
cp $(git ls-files --modified) ../modified-files

Notez que cela utilise les versions des fichiers dans l'arbre de travail actuellement.

Si vous avez des espaces dans les noms de fichiers, vous devrez vous donner un peu plus de mal.

(Bien sûr, en fonction de ce que vous essayez vraiment de faire, vous pourriez rechercher git stash Vous pouvez aussi simplement créer une branche temporaire sur laquelle effectuer un commit).

1 votes

C'est sans commiting, comment puis-je obtenir les nouveaux fichiers aussi.

0 votes

Lorsque je parle de nouveaux fichiers, je veux dire avant de les ajouter au référentiel.

4 votes

Je pense avoir trouvé ce que je cherchais : cp $(git ls-files --modified --others) modified-files. Merci beaucoup.

71voto

Sven Marnach Points 133943

Pour faire exactement ce que vous demandez (en supposant que vous avez déjà effectué un commit et que vous voulez créer une archive des fichiers modifiés par le dernier commit), vous pourriez faire :

git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip

Si vous avez supprimé des fichiers dans un commit, pour éviter une erreur de pathpec, utilisez --diff-filter=d :

git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip

Mais peut-être que vous voulez réellement créer un patch en utilisant :

git diff HEAD^ HEAD > a.patch

et appliquer ce patch là où vous en avez besoin en utilisant :

patch -p1 < a.patch

Bien sûr, l'application d'un patch ne fonctionne que si votre répertoire cible contient déjà l'ancienne version de votre référentiel.

1 votes

Je recommande d'utiliser git format-patch au lieu de la tuyauterie git diff vers un fichier

1 votes

C'est après le commit, comment puis-je obtenir les nouveaux fichiers aussi.

0 votes

Par nouveaux fichiers, vous entendez les fichiers non suivis dans votre répertoire de travail ? Eh bien, dites-nous ce que vous voulez réellement accomplir.

17voto

Aftershock Points 1602

Si vous utilisez TortoiseGIt, il fournit cela aussi.
Choisissez le dossier, dans l'explorateur
Clic droit, Choisir le menu, TortoiseGit-> Afficher le journal.

Sélectionnez le répertoire de travail et la dernière version commise.
Clic droit. Comparez les révisions. Sélectionnez les fichiers que vous souhaitez enregistrer/exporter.
Clic droit. Exporter vers un dossier. Terminé.

0 votes

J'aimerais que l'outil d'exportation de TortoiseGit vous permette de sélectionner plusieurs commits.

8voto

Saifullah khan Points 121

Zippez les fichiers modifiés et nouvellement créés dans le dépôt git.

zip mychanges.zip $({ (git ls-files --others --exclude-standard) ; (git ls-files --modified)})

3voto

BRT Points 31

En supposant que vous n'avez pas supprimé ou renommé des fichiers, cela devrait faire l'affaire.

Copie :

cp --parents $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev) destination_folder

Zip :

zip modified.zip $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev)

0 votes

Le cp --parents semble copier/créer des répertoires en même temps que les fichiers, y a-t-il un moyen de copier les fichiers sans créer de répertoire ? Je suppose que la suppression de l'argument --parents fonctionne très bien :) .

0 votes

--parents utilise le nom complet du fichier source sous DIRECTORY L'argument --parents place les fichiers dans la même structure de dossiers à destination qu'à l'origine. Par exemple, si vous avez modifié des fichiers dans les dossiers include et source, l'argument --parents les place dans les dossiers include et source sur la destination. [orig/folder_a/file_1, orig/folder_b/file_2] -> [dest/folder_a/file_1, dest/folder_b/file_2] Ceci est très utile si vous avez des fichiers modifiés dans différents dossiers du même projet (par exemple les dossiers include et source).

0 votes

Si vous ajoutez '??' à egrep "M|A|AM" comme egrep "M|A|AM| ??", vous copierez également les fichiers qui ne sont pas sous contrôle de version. Ceci est utile pour les nouveaux fichiers qui n'ont pas encore été ajoutés ou commités.

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