Comment savoir si un fichier est suivi par git (par le code de sortie du shell)?

357

Existe-t-il un moyen de savoir si un fichier est suivi en exécutant une gitcommande et en vérifiant son code de sortie?

En d'autres termes: git suit-il un fichier?

Dale Forester
la source
Je pense que le point est de savoir quels sont les critères pour décider qu'un fichier est suivi ou non. Il devrait y avoir une sorte de collection de fichiers suivis à rechercher.
smwikipedia

Réponses:

444

essayer:

git ls-files --error-unmatch <file name>

quittera avec 1 si le fichier n'est pas suivi

hasen
la source
Au moins avec mon ancienne version (1.6.0) de git, vous devez mettre l' --error-unmatchoption avant le nom de fichier pour obtenir une erreur. D'une manière ou d'une autre, l'option n'est appliquée qu'aux noms de fichiers qui la suivent.
Alex Dupuy
En fait, le problème semble être que l'option permutation GNU getopt n'est pas activée, et lorsqu'elle apparaît après un nom de fichier (ou après --), elle --error-unmatchest traitée comme un autre nom de fichier (pas dans l'index) et n'a aucun effet.
Alex Dupuy
29
git ls-files | grep <PATTERN>? exemple:git ls-files | grep Main.h
gaussblurinc
1
[Une manière naïve] Faites une petite modification dans le fichier (ajouter / supprimer un espace). Et voyez si le fichier est répertorié lorsque «git status» est tapé. Une manière idiote, mais peut gagner du temps.
BraveNinja
Mais je l'ai ajouté et validé avec la commande "git add -A && git commit -m" blah ". Voir même des fichiers entiers avec la commande" git ls-tree --name-only -r sha1 ".
Dr.jacky
66

Si vous ne voulez pas encombrer votre console de messages d'erreur, vous pouvez également exécuter

git ls-files file_name

puis vérifiez le résultat. Si git ne renvoie rien, le fichier n'est pas suivi. S'il est suivi, git retournera le chemin du fichier.

Cela est pratique si vous souhaitez le combiner dans un script, par exemple PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}
cheesus
la source
Je pense que file_namedoit être une correspondance exacte (chemin complet + nom de fichier), mais peut être utilisé avec des caractères génériques:git ls-files *foo.rb
dechimp
16

ÉDITER

Si vous devez utiliser git depuis bash, il est --porcelainpossible de git status:

--porcelaine

Donnez la sortie dans un format stable et facile à analyser pour les scripts. Actuellement, c'est identique à --short, mais il est garanti qu'il ne changera pas à l'avenir, ce qui le rend sûr pour les scripts.

La sortie ressemble à ceci:

> git status --porcelain
 M starthudson.sh
?? bla

Ou si vous ne créez qu'un seul fichier à la fois:

> git status --porcelain bla
?? bla

ORIGINAL

faire:

git status

Vous verrez un rapport indiquant quels fichiers ont été mis à jour et lesquels ne sont pas suivis.

Vous pouvez voir bla.shest suivi et modifié et newblan'est pas suivi:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")
stefanB
la source
Désolé, j'aurais dû être plus clair. L'état est correct, mais je préfère vérifier un code de sortie plutôt que d'analyser la sortie.
Dale Forester,
git status --porcelainest votre ami si vous avez besoin d'analyser la sortie par script, jetez un oeil au document lié il montre quelques autres options utiles
stefanB
Hihi, ne fonctionne pas avec le très vieux Git: git status --porcelain error: unknown option porcelain 'La version est 1.6.0 :-)
Laryx Decidua
@ user465139 c'est correct ... vous avez besoin de git 1.7.0 ou plus récent (l'option porcelaine n'a pas été ajoutée jusque-là).
mason81
13

Essayez de lancer git statusle fichier. Il affichera une erreur s'il n'est pas suivi par git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.
JaredPar
la source
Sensationnel. Je dois l'avoir exécuté sur un répertoire et il a agi comme s'il vérifiait le dépôt entier. Merci.
Dale Forester,
4
En fait, si j'exécute, git status trackedfilej'obtiens le code de sortie 1 (attendu que 0 soit utile) mais cela ne me donne pas "erreur:" dans la sortie. Je préfère analyser un code de sortie plutôt qu'une sortie de chaîne.
Dale Forester,
43
Je constate qu'aucune erreur n'est générée si j'exécute git status sur un fichier qui existe dans ma copie de travail git mais qui est exclu par .gitignore. (C'est-à-dire que cette réponse ne fera pas l'affaire.)
JellicleCat
Veuillez noter que cela ne fonctionne pas bien si le fichier est dans la liste des ignorés, c'est-à-dire dans le fichier.gitignore
Robin Hsu
8
Ça ne marche pas. Il imprime toujours la même chose, même si le fichier n'existe pas. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe
6

Je ne connais aucune commande git qui donne un "mauvais" code de sortie, mais il semble qu'un moyen facile de le faire serait d'utiliser une commande git qui ne donne aucune sortie pour un fichier qui n'est pas suivi, comme fichiers git-log ou git-ls. De cette façon, vous n'avez pas vraiment besoin d'analyser, vous pouvez l'exécuter via un autre utilitaire simple comme grep pour voir s'il y a une sortie.

Par exemple,

git-ls-files fichier_test.c | grep.

quittera avec un code zéro si le fichier est suivi, mais un code de sortie de un si le fichier n'est pas suivi.

Jay Walker
la source
3

Je suggère une coutume alias sur vous .gitconfig.

Il faut bien faire:

1) Avec la commande git:

git config --global alias.check-file <command>

2) Modification ~/.gitconfiget ajout de cette ligne sur la section alias:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Une fois la commande lancée (1) ou le fichier enregistré (2), sur votre espace de travail vous pouvez le tester:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked
Luca Davanzo
la source
2

en utilisant git logdonnera des informations à ce sujet. Si le fichier est suivi dans git, la commande affiche des résultats (journaux). Sinon, il est vide.

Par exemple, si le fichier est suivi par git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <[email protected]>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Si le fichier n'est pas git tracké,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#
SuperNova
la source
1

Juste mes deux cents:

git ls-files | grep -x relative/path

relative/pathpeut être facilement déterminé en appuyant sur tabdans un shell de complétion automatique. Ajoutez-en un supplémentaire | wc -l pour obtenir une sortie 1 ou 0.

andreee
la source
Selon le chemin (par exemple s'il contient un point), vous devez ajouter une grepoption --fixed-strings.
EndlosSchleife