Comment puis-je rechercher des twigs Git pour un fichier ou un répertoire?

Dans Git, comment pourrais-je rechercher un fichier ou un répertoire par chemin sur plusieurs twigs?

J’ai écrit quelque chose dans une twig, mais je ne me souviens plus lequel. Maintenant je dois le trouver.

Clarification : Je recherche un fichier que j’ai créé sur une de mes twigs. Je voudrais le trouver par chemin, et non par son contenu, car je ne me souviens pas du contenu.

git log le trouvera pour vous:

% git log --all -- somefile commit 55d2069a092e07c56a6b4d321509ba7620664c63 Author: Dustin Sallings  Date: Tue Dec 16 14:16:22 2008 -0800 added somefile % git branch -a --contains 55d2069 otherbranch 

Prend en charge la globalisation aussi:

 % git log --all -- '**/my_file.png' 

Les guillemets simples sont nécessaires (du moins si vous utilisez le shell bash), de sorte que le shell passe le modèle glob à git au lieu de le développer (comme avec un find Unix).

git ls-tree pourrait aider. Pour rechercher dans toutes les twigs existantes:

 for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo $branch :; git ls-tree -r --name-only $branch | grep '' done 

L’avantage de ceci est que vous pouvez également rechercher avec des expressions régulières le nom du fichier.

Bien que la réponse de @ididak soit plutôt cool, et que @ Handyman5 fournisse un script pour l’utiliser, j’ai trouvé que cette approche était très limitée.

Parfois, vous devez rechercher quelque chose qui peut apparaître / disparaître au fil du temps, alors pourquoi ne pas rechercher tous les commits? En outre, vous avez parfois besoin d’une réponse verbeuse, d’autres fois uniquement des correspondances. Voici deux versions de ces options. Mettez ces scripts sur votre chemin:

git-find-file

 for branch in $(git rev-list --all) do if (git ls-tree -r --name-only $branch | grep --quiet "$1") then echo $branch fi done 

git-find-file-verbose

 for branch in $(git rev-list --all) do git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /' done 

Maintenant tu peux faire

 $ git find-file  sha1 sha2 $ git find-file-verbose  sha1: path/to//searched sha1: path/to/another//in/same/sha sha2: path/to/other//in/other/sha 

Voyez que l’utilisation de getopt vous permet de modifier ce script pour rechercher en alternance tous les commits, refs, refs / heads, verbose, etc.

 $ git find-file  $ git find-file --verbose  $ git find-file --verbose --decorated --color  

Commander https://github.com/albfan/git-find-file pour une implémentation possible

Vous pouvez utiliser gitk --all et rechercher des “chemins” de gitk --all et le chemin qui vous intéresse.

Copiez / collez ceci pour utiliser git find-file SEARCHPATTERN

Impression de toutes les twigs recherchées:

 git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :' 

Imprimer uniquement les twigs avec les résultats:

 git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :' 

Ces commandes appendont des scripts shell minimaux directement à votre ~/.gitconfig tant ~/.gitconfig global git .

Une implémentation assez décente de la commande find pour les repositorys git peut être trouvée ici: https://github.com/mirabilos/git-find