2012-06-06 11 views
10

Połączyłem drzewo na moje repozytorium za pomocą dodania git git bez opcji squasha. Dziennik git pokazuje, że zatwierdzenia zostały pomyślnie dodane do repozytorium. Jeśli jednak wykonam operację git log --follow filename, historia zatrzyma się przy scalaniu i nie wyświetli poprzednich zatwierdzeń. Próbowałem używać -M zamiast --follow i to też nie działa. Jak mogę uzyskać dziennik zatwierdzeń dla określonego pliku lub plików przed scaleniem?git-subtree bez squasha: wyświetl dziennik

Odpowiedz

2

Właściwie git log --followpowinien pracy z poddrzewem łączy, ale znany jest hackish przez dłuższy czas [1-3].

Można trzymać się zgrupowań poddrzewa i mieć pewność, że strategia jest ważna do śledzenia wielu historii, i cierpliwie czekać na nieuniknione zdarzenie, które poprawi się git log --follow. Może to być rzeczywiście wykonalna decyzja, ponieważ obecnie git log --follow może zobaczyć pewną historię w bardzo użytecznych przypadkach. Powiedzmy, że przeniosłeś plik z repozytorium po sprzedaży do sub-repo, a następnie możesz śledzić cały ruch. Jeśli chcesz śledzić historię, która jest specyficzna dla sub-repo, naprawdę musisz mieć oddzielną kopię lub sprawdzić oddział sub-repo.

Alternatywy i Obejścia

Można dostać logi dla plików takich jak ta [1]:

git log -- '*filename'   # from the toplevel 

ten postrzega siebie popełnić że dotknął plik, którego nazwa kończy się filename . Nie podąży za rzeczywistymi nazwami i może okazać się fałszywy pozytywny, jeśli masz kilka plików o tej samej nazwie systemu [1].

Można również scalać repozytoria za pomocą różnych strategii. Ref [4] pokazuje sposób, aby to zrobić, bardzo zbliżony do tego, co masz z regularnym łączeniem poddrzewa, ale z historiami identyfikowalnymi. Zasadniczo:

  1. dodać, pobrać i scalić każde pod-repozytorium z repozytorium toplevel jako zwykły pilot, bez poddrzewa git lub readtree. Na początku spowoduje to zniszczenie twojego katalogu głównego tak, jakby był on ich, więc należy to zrobić na początku życia projektu.
  2. git mv pliki sub-repo do oddzielnych folderach

wówczas:

  • upstream zmiany mogą być pobierane i połączyła się normalnie, ale z flagą -Xsubtree do git scalania.
  • inne przypadki powinny być podobne. Testowałem wypychanie i działa, zobacz komentarz w [4].

Referencje

[1] Z listy git korespondencji http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html

[2] Z listy git korespondencji http://git.661346.n2.nabble.com/gsoc-Better-git-log-follow-support-td6188083.html#a6188352

[3] git log --follow został w Google Summer of Code https://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support

[4] https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history

+0

Wierzę, że # 4 powinien być https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository- bez -zabrania-plików-historii/ –

+0

@BryanLarsen dziękuję – rfabbri

+0

# 4, 'git log --follow' obecnie działa tylko dla plików, nie folderów. "Git log - follow" wewnątrz folderu sub-repo nie zwróci zatwierdzeń sub-repo, podobnie jak "gitk - follow". (Git 2.10.1) – rfabbri

14

Zatwierdzenie utworzone przez git subtree merge lub git subtree add powoduje "dodanie" plików pochodzących z poddrzewa, a nie "przeniesienie". Oznacza to, że ich historii nie można śledzić tak, jak w przypadku innych scaleń lub ruchów.

Historia żądanego pliku może być nadal wyświetlana, patrząc bezpośrednio w poddrzewie przed scaleniem. Jeśli twój obszar roboczy jest połączeniem scalonym utworzonym przez git subtree, drugi jego rodzic (HEAD^2) będzie ostatnim zatwierdzeniem oryginalnego poddrzewa. Tutaj możesz zobaczyć zawartość oryginalnego poddrzewa:

# Display the contents of the original subtree 
git ls-tree HEAD^2 

Z tego zatwierdzenia możesz śledzić zmiany pliku, który Cię interesuje. Uważaj, aby ścieżka do pliku była inna w podtekście, które znajduje się w obszarze roboczym. Będziesz musiał usunąć --prefix podany pod git subtree, aby mieć poprawną ścieżkę do pliku.

git log HEAD^2 --follow -- path-in-subtree/file 
+2

Dzięki. W związku z tym problemem nie korzystaliśmy z łączenia pod poddrzewo - znacznie łatwiej było innym zrozumieć, co się dzieje, jeśli użyliśmy dwóch oddzielnych repozytoriów. Zgrupowanie poddrzeżeń może * prawie * być traktowane jako pojedyncze repozytorium przez niezaawansowanych użytkowników git, ale niewielkie różnice, takie jak te, mogą powodować wzrost zainteresowania. Więc nie przetestowałem twojej odpowiedzi, ale zdecydowanie warto przegłosować. –

+1

Zauważ, że drzewo filtrów git może być twoim przyjacielem dla tego rodzaju rzeczy. –