Existe-t-il un moyen de voir tous les référentiels git qui existent sur ma machine? Une commande pour ça?
Existe-t-il un moyen de voir tous les référentiels git qui existent sur ma machine? Une commande pour ça?
Réponses:
Si vous êtes sous Linux find / -name ".git"
, sinon il n'y a aucun moyen, ce sont des répertoires standard, utilisez simplement votre programme de recherche de fichiers / dossiers OS pour trouver les .git
dossiers nommés.
for d in `find / -name ".git"`; do cd $d/..; echo `pwd`:; git status; echo; done
RÉPONSE ORIGINALE : Cela fonctionne plutôt bien à partir de Windows Powershell:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Include ".git" -Recurse
EDIT # 1 : -Le filtre est deux fois plus rapide que -Include. Voici cette solution:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse
EDIT # 2 : Keith E. Truesdell a mentionné l'envoi de la sortie vers un fichier. Voir son commentaire pour cette solution. Je préfère la sortie de la console. Mais son commentaire m'a fait penser que je préfère juste le chemin complet, pas tout le désordre qui est retourné par défaut. Si vous ne voulez que le chemin complet, utilisez ce qui suit:
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.FullName }
NOTE FINALE : Les solutions ci-dessus ne renvoient que les référentiels Git sous le répertoire courant . Si vous voulez TOUS les référentiels sur un lecteur, vous devez exécuter la commande une fois à partir de la racine de chaque lecteur.
Sur * nix, cela trouvera également tous les --bare
dépôts.
find / -name "*.git" -type d
name.git
c'est juste une convention, que je ne suis pas par exemple.
find
ces dépôts?
Dépôts Git ont tous HEAD
, refs
et les objects
entrées.
sur GNU / n'importe quoi,
find -name HEAD -execdir test -e refs -a -e objects \; -printf %h\\n
La .git
simple vérification manquera de nombreux dépôts et sous-modules nus.
Pour devenir complètement paranoïaque sur la vérification, vous pouvez demander à git de faire toutes ses propres vérifications avant d'imprimer,
find -name HEAD -execdir test -e refs -a -e objects \; \
-execdir sh -ec 'GIT_DIR=$PWD git rev-parse --absolute-git-dir 2>&-' \;
(modifier: je pensais que le .git/config
fichier était nécessaire, il s'avère que ce n'est pas le cas, donc le minimum absolu git init newrepo
est
mkdir -p newrepo/.git/{objects,refs}
echo ref: refs/heads/master >newrepo/.git/HEAD
)
Sous Linux, un moyen plus rapide serait:
locate -r "\.git$"
en supposant que vous mainteniez la base de données de Locate à jour avec sudo updatedb
Sous Linux et OS X, la commande suivante est probablement la plus rapide (en ignorant les référentiels sans .git
) lorsque le répertoire racine de find
est /
:
find / -name .git -exec dirname {} \; -prune
Mais pour les racines qui ont principalement des référentiels en dessous, ce qui suit est probablement le plus rapide (vous voudrez peut-être remplacer /
par .
ou une autre racine):
find / -type d -exec test -d {}/.git \; -prune -print
Explication rapide des primaires de find
utilisé (puisqu'aucun opérateur n'est présent ici, -and
est implicite, c'est-à-dire que pour chaque nœud visité, les primaires sont évaluées de gauche à droite jusqu'à ce que l'un d'eux soit évalué false
):
-name
est true
si le nom correspond (souvent, mais pas ici, avec des caractères génériques)-exec
exécute une commande terminée par ;
(qui est échappée par \
pour éviter l'interprétation par le shell), et est true
si l'état de retour est 0
(c'est-à-dire, OK). Le nœud actuel est disponible en tant que {}
(qui ne nécessite aucun échappement)-prune
est toujours true
, et fait sauter tous les nœuds enfants-type d
est true
pour les répertoires-print
est nécessaire ici car si -exec
est présent, il n'est pas implicitement ajoutéSous Linux, essayez cette commande avec l'autorisation root:
find / | grep \\.git$
cela recherche simplement tous les fichiers qui se terminent par .git ... vous pouvez le faire avec des outils de recherche sous Windows, Linux, etc.
find
tout laisser sortir puis de filtrer avec grep
. Je préférerais utiliser--name "*.git"
/
arbre pour le second à grep, quand le premier peut tout faire et éviter l'énorme utilisation inutile des IO. Pas une vraie différence pour l'utilisateur normalement, mais pour les gros systèmes de fichiers, cela peut faire une différence.
Une version simple de PowerShell:
Get-ChildItem . -Recurse -Hidden .git
C:\users\<username>\PrintHood
Aussi, je a trouvé utile d'ajouter une sortie à un fichier et puisque je ne me souciais que du chemin (car ce script obtient un tas d'informations) de filtrer également uniquement les informations de chemin / répertoire. Get-ChildItem . -Recurse -Hidden .git | Out-file -FilePath C:\Dev\GitRepoList.txt
Petite variation par rapport à la réponse d'Eric Burcham. Cette réponse ajoute \ .git à la fin, celle-ci non.
Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { Write-Host $_.Parent.FullName }
J'utilise cette commande en début de journée. Il ajoute simplement quelques commandes git à ce qui précède. Pour une raison quelconque, notre dépôt git fonctionne mieux si l'on exécute une extraction puis une extraction, je ne sais pas pourquoi. Et nous avons beaucoup de sous-modules pour une raison quelconque. Quoi qu'il en soit, mettez ce dont vous avez besoin entre les {}.
push-location; Get-ChildItem . -Attributes Directory+Hidden -ErrorAction SilentlyContinue -Filter ".git" -Recurse | % { cd $_.parent.fullname; write-host '*************'; $(get-location).path; git fetch; git pull; git checkout .; git clean -f; git submodule update; git status; write-host '*************'; write-host ' '; }; pop-location