Git: comment lister tous les fichiers (par étapes) qui tentent d’être validés

A écrit un script bash pour le hook prepare-commit-msg git. Il répertorie tous les fichiers mis en scène qui existent, mais je souhaite uniquement que les fichiers en attente qui tentent d’être validés (exemple de l’entrée / sortie souhaitée en bas de la page).

Le travail de mon script consiste à empêcher une validation si les fichiers tentant d’être validés ne suivaient pas une convention de commentaire spécifique (par exemple, docs java). Non seulement cela, mais il édite et formate automatiquement les commentaires pour respecter ma convention de commentaires. Il est extrêmement important de noter que je ne peux pas simplement saisir le SHA-1 de la validation car ce script doit avoir lieu avant la création de cette clé.

Cela fonctionne parfaitement lorsque j’exécute commit -a (c’est-à-dire, valide tous les fichiers). Cependant, je rencontre des problèmes lorsque je veux simplement valider quelques fichiers mis en scène.

Existe-t-il un moyen de ne capturer que les fichiers en attente de validation, et pas uniquement tous les fichiers en attente qui existent?

Par exemple, disons que mes fichiers mis en scène étaient les suivants:

 file1.txt file2.txt file3.txt file4.txt file5.txt 

Lorsque git commit file1.txt file2.txt file3.txt , je veux intercepter file1.txt file2.txt file3.txt dans mon script … mais pas file4.txt et file5.txt .

Est-ce qu’il y a un moyen de faire ça?

EDIT: Certainement pas un doublon. La solution à la question “duplicate” n’est certainement pas ce que je demande.

Git commit opération, statut et contrôle

Git introduit sa propre terminologie. Certains de ces mots ont été mal utilisés, je décrirai les concepts mal compris et les commandes problématiques qui mènent à la formulation erronée.

Heureusement, git a un langage très fort et défini, où chaque terme a un sens précis, certains peuvent être vus dans git help gitglossary . Pour comprendre les concepts utilisés par git, la page git help git vaut la peine d’être lue 5 à 50 fois avec les pages d’introduction qui y sont liées.

Si vous avez installé une version de git sans la documentation, giflez votre administrateur système. Je suppose que la plupart des personnes qui lisent activement des questions, des réponses et des articles sont leurs propres administrateurs, alors giflez-vous, mais pas trop;) Bien sûr, les documents peuvent être trouvés sur le net, mais ils font partie intégrante d’un be-used installation git.

Heureusement, git a été lancé et son kernel a été entièrement écrit par l’un des esprits les plus excellents de notre époque, ou du moins par celui qui utilise des concepts logiques très ssortingcts, au lieu d’appliquer des outils hors pair, pour écrire et contrôler son développement logiciel: Linus Thorvalds.

Cela permet d’utiliser les mêmes termes avec des significations définies, quand on parle de git et d’opérations dans un repository git. Je n’irai pas trop loin, car certains concepts sont développés avec des termes théoriques assez avancés en informatique.

Le repository git

Il existe deux principaux types de référentiels git, appelés bare non-bare bare et non-bare , ou dis-je parfois check-out ( git help init ). Dans cet article, je viens de parler de référentiels non nus, où les fichiers suivis du référentiel sont enregistrés dans le répertoire de travail.

de gitglossary (7):

  working tree The tree of actual checked out files. The working tree normally contains the contents of the HEAD commit's tree, plus any local changes that you have made but not yet committed. 

Note pour les gitglossary(7) : gitglossary(7) signifie la page de manuel avec le nom “gitglossary” dans la section 7. Avec man cette page peut être atteinte avec man -s7 gitglossary . Avec git help gitglossary la même chose apparaîtra, avec git help --web gitglossary vous voyez un document bien formaté dans votre navigateur, si votre système est configuré pour appeler à distance une page HTML dans votre session de navigateur. Avec Windows, où il n’y a personne man vous serez toujours dirigé vers le navigateur. Pour les commandes git telles que l’ ajout de la page de manuel est man 1 git-add ou git-add(1) .

Fichiers suivis

Nous avons vu ici que le terme suivi signifie que le référentiel git connaît et contrôle ce fichier. Le glossaire ne provient pas de gitglossary(7) , mais de git-add(1) , option

  -u, --update Update the index just where it already has an entry matching . This removes as well as modifies index ensortinges to match the working tree, but adds no new files. If no  is given when -u option is used, all tracked files in the entire working tree are updated (old versions of Git used to limit the update to the current directory and its subdirectories). 

La commande git add –update est l’une des opérations les plus importantes pour comprendre la gestion de l’arbre de travail par git.

Ici montre le problème

avec git commit file1.txt file2.txt file4.txt , mais git commit file1.txt file2.txt file4.txt définir d’autres termes.

Fichiers mis en scène ou index

L’ensemble des fichiers mis en scène génère l’ index (voir gitglossary (7) pour l’ index , mais ignore les différents niveaux de fusion ou l’ index non fusionné ). Pour notre propos

The index is a stored version of your working tree.

à savoir la version stockée de votre arbre de travail qui est prête à être validée en tant que commit (encore une fois gitgloassary (7))

commit `Comme un nom: Un seul sharepoint l’histoire de Git;

… “revision” ou “version” sont des synonymes d’autres systèmes de contrôle de version. Comme les utilisateurs de Git, nous disons “commit”.

… à suivre (26.Fiday) …

 $ git status -s -uno ME AR 

Le fichier E est modifié, le fichier R est mis en scène (ajouté).

Un fichier non monté a le marqueur d’action dans la deuxième colonne (après git reset E , pour décomposer le fichier E):

 $ git status -s -uno ME AR 

Ceux-ci peuvent être supprimés avec grep -v '^ ' par exemple.

Voici une preuve complète dans mon répertoire de test:

Fichiers suivis

  ~/test/ed $ git ls-tree HEAD 100644 blob 96bf192a9be8d1cecc314f66bb1ef5961564e983 E 100644 blob 11470e37f3d22a2548ce5c85040a44c9581d7727 I 100644 blob 8f2f9e95d9b00595d1588ccef91495c06295f5fa O 

Fichiers de système de fichiers (tous, comme dans git commit -a )

  ~/test/ed $ ls -l . total 16 -rw-r--r-- 1 ingo ingo 140 25. Jun 05:48 E -rw-r--r-- 1 ingo ingo 143 25. Jun 05:39 I -rw-r--r-- 1 ingo ingo 106 25. Jun 05:29 O -rw-r--r-- 1 ingo ingo 157 25. Jun 05:28 R 

Statut du répertoire de travail: Modifications par rapport aux fichiers HEAD et à la mise en attente

  ~/test/ed $ git status -s -uno ME AR 

La sortie sans les fichiers modifiés qui ne sont pas encore ou pas plus (git reset) dans l’index (aka. Non mis en scène ou non mis en scène)

  ~/test/ed $ git status -s -uno|grep -v '^ ' AR 

Noms de fichiers intermédiaires uniquement, sans l’indicateur d’opération

  ~/test/ed $ git status -s -uno|grep -v '^ '|awk '{print $2}' R