2009-08-31 5 views
4

Je dois générer une liste de changements dans un dépôt git sur une période de temps. Pour cela, j'ai noté l'ID de validation et le compare avec le récent HEAD pour générer la liste des changements dans un dépôt git. Par exemple:Comment obtenir une liste de répertoires supprimés dans mon dépôt git?

$ git diff --name-status OLD_COMMIT..HEAD 

Ceci donne une liste de modifications dans un dépôt git.

Mais, récemment, j'ai remarqué une faille dans cette approche car elle ne répertorie pas le répertoire supprimé. Bien qu'il répertorie les fichiers supprimés correctement.

Comment puis-je obtenir une liste correcte de suppressions dans un référentiel git? (Comme s'il pouvait lister le répertoire supprimé, il est donc entendu que tous les fichiers ont été supprimés à l'intérieur, donc il n'y aura pas une énorme liste de fichiers supprimés mais une seule ligne montrant le répertoire supprimé !!!)

+0

Je serais intéressé de savoir comment faire aussi :) git ne garde pas de dossiers, seulement des fichiers, donc cela peut nécessiter un peu de piratage. –

Répondre

7

git effectue le suivi des objets arborescents qui sont sa représentation des répertoires. Bien que techniquement possible du point de vue du modèle objet, git ne conserve pas les arbres vides. Au lieu de cela, git supprimera toute entrée pour un arbre vide de son arbre parent.

La commande git diff-tree génère une sortie qui montre comment toutes les entrées d'arbre ont été modifiées entre les arbres.

git diff-tree origin/master master 

Cette sortie vous indiquera comment toutes les entrées de l'arbre donné (à savoir l'arbre racine du donné engagent dans cet exemple) ont changé. Le format est décrit dans git-diff-treeman page, mais fondamentalement tout répertoire qui a été créé ou supprimé aura 040000 dans la deuxième ou la première colonne et 000000 dans la première ou deuxième colonne respectivement. Ce sont les 'modes' d'entrée de l'arbre pour les entrées gauche et droite.

Si vous voulez récursivité et rechercher des entrées d'arbres dans les sous-arbres, vous devez utiliser l'option -t et pas seulement les -r options par défaut -r montre les sous-entrées d'un arbre au lieu de l'entrée de l'arbre lui-même, -t montrera tous les deux. Si vous êtes intéressé par les répertoires qui ont été modifiés (ajoutés ou supprimés ou modifiés par rapport à un autre type, par exemple un lien symbolique) et pas uniquement des contenus différents, vous devez probablement filtrer les entrées commençant par :040000 040000.

Voici une ligne de commande possible qui fait cela.

git diff-tree -t origin/master master | grep 040000 | grep -v -E '^:040000 040000' 
+0

Pour afficher toutes les suppressions, y compris les fichiers et les répertoires: git diff-tree --diff-filter = D --nom -name -t origine/master master – blt04

Questions connexes