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
Właściwie git log --follow
powinien 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:
- 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.
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
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
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ć. –
Zauważ, że drzewo filtrów git może być twoim przyjacielem dla tego rodzaju rzeczy. –
Wierzę, że # 4 powinien być https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository- bez -zabrania-plików-historii/ –
@BryanLarsen dziękuję – rfabbri
# 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