Dans Git, comment puis-je rechercher un fichier ou un répertoire par chemin dans plusieurs branches?
J'ai écrit quelque chose dans une branche, mais je ne me souviens pas laquelle. Maintenant, je dois le trouver.
Précision : je recherche un fichier que j'ai créé sur une de mes succursales. Je voudrais le trouver par chemin, et non par son contenu, car je ne me souviens pas du contenu.
Réponses:
git log
+git branch
le trouvera pour vous:Prend également en charge le globbing:
Les guillemets simples sont nécessaires (au moins si vous utilisez le shell Bash) afin que le shell passe le modèle glob à git inchangé, au lieu de le développer (comme avec Unix
find
).la source
somefile
: si vous avez besoin d'une recherche d'expression régulière sur le chemin / nom de fichier, par exemple, vous pouvez utiliser la réponse d'ididak.git log --all -- **/my_file.png
git log --grep='branch' --author='me' -- *.sql
. A fonctionné comme un charme. git version 1.7.11.1gitk
prend également en charge le globbing. C'est une excellente réponse @webmat! Si vous voulez voir où il a été supprimé / créé / etc, vous pouvez l'utilisergit log --all --stat -- **/my_file.png
, de cette façon, vous n'aurez pas à deviner si vous le retirez d'un commit qui l'a supprimé.git ls-tree pourrait aider. Pour rechercher dans toutes les branches existantes:
L'avantage de ceci est que vous pouvez également rechercher des expressions régulières pour le nom de fichier.
la source
git for-each-ref --format="%(refname)" refs/heads
; do" (c) "git ls-tree --name-only" rendra la sortie plus nette (d) il pourrait être utile de souligner dans votre réponse qu'il y a un avantage à cela par rapport à la solution de Dustin, à savoir que vous n'avez pas besoin de connaître exactement le nom de fichier - vous pouvez rechercher par expression régulière correspondant à n'importe quelle partie du cheminrefs/remotes
au lieu derefs/heads
. Pour tout rechercher (succursales locales, succursales de suivi à distance et balises), utilisez simplementrefs/
.Bien que la réponse d'ididak soit plutôt cool, et Handyman5 fournit un script pour l'utiliser, je l'ai trouvé un peu limité pour utiliser cette approche.
Parfois, vous devez rechercher quelque chose qui peut apparaître / disparaître avec le temps, alors pourquoi ne pas chercher contre tous les commits? En plus de cela, vous avez parfois besoin d'une réponse détaillée, et d'autres fois, ne validez que les correspondances. Voici deux versions de ces options. Mettez ces scripts sur votre chemin:
git-find-file
git-find-file-verbose
Maintenant vous pouvez faire
Voyez qu'en utilisant getopt vous pouvez modifier ce script pour alterner la recherche de tous les commits, refs, refs / heads, été verbeux, etc.
Consultez https://github.com/albfan/git-find-file pour une implémentation possible.
la source
Vous pouvez utiliser
gitk --all
et rechercher des commits "touchant les chemins" et le chemin d'accès qui vous intéresse.la source
Copiez et collez ceci pour l'utiliser
git find-file SEARCHPATTERN
Impression de toutes les branches recherchées:
Imprimer uniquement les branches avec des résultats:
Ces commandes vont ajouter des scripts shell minimum directement à votre
~/.gitconfig
comme alias global git .la source
Une implémentation assez décente de la
find
commande pour les référentiels Git peut être trouvée ici:https://github.com/mirabilos/git-find
la source