Comment puis-je vérifier si j'ai des modifications non validées dans mon référentiel git:
- Modifications ajoutées à l'index mais non validées
- Fichiers non suivis
à partir d'un script?
git-status
semble toujours retourner zéro avec la version 1.6.4.2 de git.
diff
indiquer la présence ou l'absence de différences plutôt que l'exécution réussie de la commande, vous devez utiliser--exit-code
ou--quiet
. Les commandes git sont généralement très cohérentes avec le retour d'un code de sortie nul ou non nul pour indiquer le succès de la commande.Réponses:
Bon timing! J'ai écrit un article de blog à ce sujet il y a quelques jours, quand j'ai compris comment ajouter des informations sur l'état de git à mon invite.
Voici ce que je fais:
Pour le statut sale:
Pour les fichiers non suivis (notez l'
--porcelain
indicateurgit status
auquel vous donne une belle sortie analysable ):Bien que ce
git diff --shortstat
soit plus pratique, vous pouvez également l'utilisergit status --porcelain
pour obtenir des fichiers sales:Remarque: Le
2>/dev/null
filtre les messages d'erreur afin que vous puissiez utiliser ces commandes sur des répertoires non git. (Ils reviendront simplement0
pour le nombre de fichiers.)Modifier :
Voici les articles:
Ajout d'informations d'état Git à votre invite de terminal
Amélioration de l'invite du shell compatible avec Git
la source
__git_ps1
. Il affiche les noms des branches, y compris un traitement spécial si vous êtes en train de rebaser, d'appliquer, de fusionner ou de bissecter. Et vous pouvez définir la variable d'environnementGIT_PS1_SHOWDIRTYSTATE
pour obtenir un astérisque pour les modifications non échelonnées et plus pour les modifications échelonnées. (Je pense que vous pouvez également l'obtenir pour indiquer les fichiers non suivis et vous donner unegit-describe
sortie)git diff --shortstat
donnera un faux négatif si des changements sont déjà dans l'index.git status --porcelain
est préférable, cargit diff --shortstat
n'attrapera pas les fichiers vides nouvellement créés. Vous pouvez l'essayer dans n'importe quel arbre de travail propre:touch foo && git diff --shortstat
La clé d'un «script» fiable de Git est d'utiliser les commandes de «plomberie».
Les développeurs prennent soin lors du changement des commandes de plomberie pour s'assurer qu'ils fournissent des interfaces très stables (c'est-à-dire qu'une combinaison donnée d'état du référentiel, stdin, options de ligne de commande, arguments, etc. produira la même sortie dans toutes les versions de Git où la commande / existe). De nouvelles variations de sortie dans les commandes de plomberie peuvent être introduites via de nouvelles options, mais cela ne peut pas poser de problèmes pour les programmes qui ont déjà été écrits sur des versions plus anciennes (ils n'utiliseraient pas les nouvelles options, car elles n'existaient pas (ou du moins étaient non utilisé) au moment de l’écriture du script).
Malheureusement, les commandes Git «quotidiennes» sont les commandes «porcelaine», donc la plupart des utilisateurs de Git peuvent ne pas être familiers avec les commandes de plomberie. La distinction entre la porcelaine et la commande de plomberie est faite dans la page de manuel principale de git (voir les sous-sections intitulées Commandes de haut niveau (porcelaine) et Commandes de bas niveau (plomberie) .
Pour en savoir plus sur les modifications non validées, vous aurez probablement besoin de
git diff-index
(comparer l'index (et peut-être des morceaux d'arbre de travail suivis) à d'autres arborescents (par exempleHEAD
)), peut-êtregit diff-files
(comparer l'arbre de travail à l'index), et éventuellementgit ls-files
(lister les fichiers; par exemple, lister les non suivis) , fichiers non ignorés).(Notez que dans les commandes ci-dessous,
HEAD --
est utilisé à la place deHEAD
car sinon la commande échoue s'il y a un fichier nomméHEAD
.)Pour vérifier si un référentiel a des modifications par étapes (pas encore validées), utilisez ceci:
0
alors il n'y a pas de différences (cela1
signifie qu'il y a des différences).Pour vérifier si une arborescence de travail comporte des modifications pouvant être mises en scène:
git diff-index
(0
== pas de différences;1
== différences).Pour vérifier si la combinaison de l'index et des fichiers suivis dans l'arborescence de travail a des changements par rapport à
HEAD
:HEAD
). Dans cette même situation, les deux commandes distinctes renverraient toutes les deux des rapports de «différences présentes».Vous avez également mentionné les fichiers non suivis. Vous pourriez signifier «non suivi et non ignoré», ou simplement «non suivi» (y compris les fichiers ignorés). Quoi qu'il en soit,
git ls-files
est l'outil pour le travail:Pour «non suivi» (comprendra les fichiers ignorés, le cas échéant):
Pour «non suivi et non ignoré»:
Ma première pensée est de simplement vérifier si ces commandes ont une sortie:
0
se termine avec alors il n'y a pas de fichiers non suivis. S'il1
se termine avec alors il y a des fichiers non suivis.Il y a une petite chance que cela se traduise par des sorties anormales de
git ls-files
dans «aucun fichier non suivi» (les deux entraînent des sorties non nulles de la commande ci-dessus). Une version un peu plus robuste pourrait ressembler à ceci:git ls-files
se propager. Dans ce cas, une sortie non nulle pourrait signifier «il y a des fichiers non suivis» ou cela pourrait signifier qu'une erreur s'est produite. Si vous souhaitez que les résultats "erreur" soient combinés avec le résultat "pas de fichiers non suivis" à la place, utiliseztest -n "$u"
(où sortie de0
signifie "certains fichiers non suivis" et non nul signifie erreur ou "pas de fichiers non suivis").Une autre idée consiste à utiliser
--error-unmatch
pour provoquer une sortie non nulle lorsqu'il n'y a pas de fichiers non suivis. Cela risque également de confondre «aucun fichier non suivi» (sortie1
) avec «une erreur s'est produite» (sortie non nulle, mais probablement128
). Mais la vérification des codes de sortie0
vs.1
vs non-zéro est probablement assez robuste:N'importe lequel des
git ls-files
exemples ci-dessus peut être--exclude-standard
utilisé si vous souhaitez considérer uniquement les fichiers non suivis et non ignorés.la source
git ls-files --others
donne les fichiers locaux non suivis, tandis que lagit status --porcelain
réponse acceptée donne tous les fichiers non suivis qui sont sous le référentiel git. Je ne sais pas laquelle de ces affiches originales voulait, mais la différence entre les deux est intéressante.--error-unmatch
. Essayez (par exemple)git ls-files --other --error-unmatch --exclude-standard .
(notez la période de fin, elle fait référence au cwd; exécutez-la à partir du répertoire de niveau supérieur de l'arborescence de travail).git update-index -q --refresh
avant lediff-index
pour éviter certains «faux positifs» causés par des informations stat (2) incompatibles.git update-index
besoin! Ceci est important si quelque chose touche les fichiers sans apporter de modifications.--porcelain
solution répertorie tous les fichiers non suivis trouvés dans l' ensemble du référentiel git (moins les fichiers ignorés par git), même si vous êtes dans l'un de ses sous-répertoires.En supposant que vous utilisez git 1.7.0 ou une version ultérieure ...
Après avoir lu toutes les réponses sur cette page et expérimenté, je pense que la méthode qui atteint la bonne combinaison d'exactitude et de concision est:
Bien que git permette beaucoup de nuances entre ce qui est suivi, ignoré, non suivi mais non ignoré, etc., je pense que le cas d'utilisation typique est d'automatiser les scripts de construction, où vous voulez tout arrêter si votre paiement n'est pas propre.
Dans ce cas, il est logique de simuler ce que le programmeur ferait: taper
git status
et regarder la sortie. Mais nous ne voulons pas compter sur des mots spécifiques qui apparaissent, nous utilisons donc le--porcelain
mode introduit dans 1.7.0; lorsqu'il est activé, un répertoire propre n'entraîne aucune sortie.Ensuite, nous utilisons
test -n
pour voir s'il y a eu une sortie ou non.Cette commande renverra 1 si le répertoire de travail est propre et 0 s'il y a des modifications à valider. Vous pouvez changer le
-n
en a-z
si vous voulez le contraire. Ceci est utile pour chaîner cela à une commande dans un script. Par exemple:Cela indique en fait "soit qu'il n'y a pas de changement à faire ou déclencher une alarme"; ce one-liner peut être préférable à une instruction if selon le script que vous écrivez.
la source
test -n "$(git diff origin/$branch)"
, pour aider à empêcher les commits locaux d'être autorisés dans un déploiementUne implémentation de la réponse de VonC :
la source
J'ai regardé quelques-unes de ces réponses ... (et j'ai eu divers problèmes sur * nix et windows, ce qui était une exigence que j'avais) ... j'ai trouvé que ce qui suit fonctionnait bien ...
Pour vérifier le code de sortie dans * nix
Pour vérifier le code de sortie dans la fenêtre $
Provenant de https://github.com/sindresorhus/pure/issues/115 Merci à @paulirish sur ce post pour le partage
la source
Pourquoi ne pas encapsuler '
git status
avec un script qui:De cette façon, vous pouvez utiliser ce statut «amélioré» dans votre script.
Comme 0xfe le mentionne dans son excellente réponse , joue un
git status --porcelain
rôle dans toute solution basée sur un scriptla source
Une possibilité de bricolage, mise à jour pour suivre la suggestion de 0xfe
Comme l'a noté Chris Johnsen , cela ne fonctionne que sur Git 1.7.0 ou plus récent.
la source
--porcelain
drapeau a été ajouté? Ne fonctionne pas avec 1.6.4.2.git status --short
alors.git status --porcelain
etgit status --short
ont tous deux été introduits dans 1.7.0.--porcelain
Il a été introduit spécifiquement pour permettregit status --short
de varier son format à l'avenir. Donc,git status --short
subirait le même problème quegit status
(la sortie peut changer à tout moment car ce n'est pas une commande de «plomberie»).J'avais assez souvent besoin d'un moyen simple d'échouer une génération si à la fin de l'exécution il y a des fichiers suivis modifiés ou des fichiers non suivis qui ne sont pas ignorés.
Ceci est très important pour éviter le cas où les builds produisent des restes.
Jusqu'à présent, la meilleure commande que j'ai utilisée ressemble à:
Cela peut sembler un peu complexe et j'apprécierais que quelqu'un trouve une variante raccourcie qui maintienne le comportement souhaité:
la source
@ eduard-wirch était assez complète, mais comme je voulais vérifier les deux en même temps, voici ma dernière variante.
Lorsque vous n'exécutez pas à l'aide de set -e ou équivalent, nous pouvons à la place faire un
u="$(git ls-files --others)" || exit 1
(ou retourner si cela fonctionne pour une fonction utilisée)Donc, untracked_files, n'est défini que si la commande réussit correctement.
après quoi, nous pouvons vérifier les deux propriétés et définir une variable (ou autre).
la source
Il s'agit d'une variante plus conviviale pour découvrir si des fichiers non suivis existent dans le référentiel:
Cela ne débouche pas sur un deuxième processus,
grep
et n'a pas besoin de vérifier si vous êtes dans un référentiel git ou non. Ce qui est pratique pour les invites de shell, etc.la source
Vous pouvez aussi faire
. Il ajoutera le mot "-dirty" à la fin s'il détecte un arbre de travail sale. Selon
git-describe(1)
:. Attention: les fichiers non suivis ne sont pas considérés comme "sales", car, comme l'indique la page de manuel, il ne se soucie que de l'arbre de travail.
la source
Il peut y avoir une meilleure combinaison des réponses de ce fil .. mais cela fonctionne pour moi ... pour
.gitconfig
de »[alias]
section ...la source
Le test automatique le plus simple que j'utilise pour détecter l' état sale = toutes les modifications, y compris les fichiers non suivis :
REMARQUE:
add --all
diff-index
ne remarque pas les fichiers non suivis.git reset
après avoir testé le code d'erreur pour tout remettre en scène.la source
Voici le meilleur moyen, le plus propre. La réponse sélectionnée n'a pas fonctionné pour moi pour une raison quelconque, elle n'a pas détecté les modifications par étapes qui étaient de nouveaux fichiers qui n'étaient pas validés.
la source