2013-05-20 11 views
33

Na przykład, możesz zrobić git remote --verbose, a git pokaże wszystkie piloty, które masz w projekcie, git branch pokaże wszystkie gałęzie i zasygnalizuje bieżącą gałąź, ale jak wyświetlić wszystkie poddrzewa, bez żadnego destrukcyjnego polecenia? git subtree poda przykłady użycia, ale niczego nie wylistuje. poddrzewo ma tylko add, pull, push, split, merge.Jak wyświetlić listę poddrzewa git w katalogu głównym?

+0

wybaczcie, ale to, co jest poddrzewo? Uruchamianie 'git subtree' dało mi' git: 'subtree' nie jest poleceniem git. ". – Jokester

+1

musisz zainstalować podtekst oddzielnie, nie jest teraz dołączony do git. http://engineeredweb.com/blog/how-to-install-git-subtree/. poddrzewo to znacznie lepsza alternatywa dla submodułów :) – pocesar

+1

@ subklan gocesar git [został scalony] (https://github.com/apenwarr/git-subtree/blob/master/THIS-REPO-IS-OBSOLETE) do głównej linii git, i jest dostępny od wersji 1.7.11 – 1615903

Odpowiedz

36

Nie ma żadnego wyraźny sposób to zrobić (przynajmniej na razie), jedyne dostępne polecenia są wymienione tutaj (jak zauważył sam, ale tutaj jest punktem odniesienia dla kolejnych poszukiwaczy): https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt

Przeszedłem przez kod (w zasadzie cały ten mechanizm jest dużym plikiem skryptowym powłoki), wszystkie śledzenie odbywa się za pomocą komunikatów zatwierdzania, więc wszystkie funkcje używają mechanizmu git log z wieloma grep -ing, aby zlokalizować własne dane.

Od subtree musi mieć folder o tej samej nazwie w folderze głównym repozytorium, można uruchomić tego, aby uzyskać informacje, które chcesz (w powłoce bash):

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq 

Teraz to robi” t sprawdzić, czy folder istnieje lub nie (może to i mechanizm poddrzewa nie będą wiedzieć, usuwanie), tak oto w jaki sposób można wymienić tylko istniejące poddrzewa, to będzie pracować w dowolnym folderze w repozytorium:

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then echo {}; fi' 

Jeśli naprawdę chcesz, zaproponuj Git, aby dołączali do następnych wersji :)

+1

polecenie, które podasz mi nie działa, git log | grep git-subtree-dir nie zwraca żadnych wyników (wersja git 1.7.9.5) – FlipMcF

+2

+1. @procesar, FlipMcF: Działa to dla mnie w "git bash" w systemie Windows: "git version 1.8.5.2.msysgit.0". Powodem, dla którego powinno działać, jest to, że polecenie "git subtree" dodaje kilka linii zaczynających się od "git-subtree-" do wiadomości commit, a jedna z linii wygląda jak "git-subtree-dir: you-prefix-folder" .Dla "prof" - wystarczy spojrzeć na wynik "git log" zaraz po tobie uruchom "git subtree add ...", a zobaczysz te linie: –

+1

@FlipMcF, oficjalne wsparcie poddrzewa zostało dodane w 1.7.11, więc domyślam się, że używasz starego i odłączonego modułu poddrzewa, który nie działa jak nowoczesne wersje. Możesz zainstalować najbardziej zaktualizowany skrypt podtremy (zobacz [tutaj] (http://log.pardus.de/2012/08/modular-git-with-git-subtree.html)) lub zaktualizuj całą instalację git. –

21

Nawiązując do Sagi Illtus' answer, dodaj następującą alias do ~/.gitconfig

[alias] 
    ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'" 

wtedy można git ls-subtrees z korzenia repozytorium, aby wyświetlić wszystkie ścieżki poddrzewa:

$> cd /path/to/repository 
$> git ls-subtrees 
some/subtree/dir 
+0

Byłoby świetnie, gdyby nie to wypluwa duplikaty w moim repozytorium - prawdopodobnie dlatego, że dodałem usunięte i ponownie dodałem poddrzewo. Kiedy faktycznie wiem, co robię, będzie to pomocne ;-) –

+0

@MattBracewell Spójrz na 'uniq'. Możesz zaktualizować alias do potoku do niego lub 'git ls-subtrees | uniq' – kenchilada

+2

Lub użyj" sort-u "i dodaj katalogi w porządku alfabetycznym jako bonus! – Potherca

Powiązane problemy