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. –
- 1. Rebasing po połączeniu squasha?
- 2. Wyświetl obraz bez gtk
- 3. Wyświetl dziennik/stan Mercurial z domyślną wartością mniejszą
- 4. Jak mogę utworzyć Gitsubtree istniejącego repozytorium?
- 5. Zobacz dziennik git bez łączenia commits
- 6. Git - Różnica między komendami poprawek i squasha
- 7. Wyświetl zmiany kodu bez restartowania serwera
- 8. Dziennik instalacji.packages()
- 9. Jak zrozumieć pełny dziennik GC?
- 10. Uczyń dziennik wydajnym
- 11. Ektronowy dziennik błędów
- 12. Dziennik budowy Teamcity
- 13. Niejawny dziennik konsoli NSZombie
- 14. Dziennik historii zdalnej
- 15. Nie można ustalić, czy oddział został scalony podczas używania squasha.
- 16. Wyświetl plik PDF w WPF bez użycia WindowsFormsHost
- 17. Wyświetl obraz w zakresie bez konwersji na element blokowy
- 18. Wyświetl FPS na iOS na ekranie (bez instrumentów)
- 19. Zmień UITable Wyświetl wysokość wiersza bez odrzucania klawiatury
- 20. Wyświetl obraz z Graphviz bez tworzenia pliku pośredniego?
- 21. Wyświetl alternatywny obraz
- 22. Linux. Jak wyłączyć cały dziennik?
- 23. Prowadź dziennik pm2 na konsolę
- 24. Jak odczytać dziennik transakcji Zookeepera?
- 25. Jak rozumieć ten dziennik awarii
- 26. Jak rozumieć dziennik git - graf:
- 27. Nie można skonfigurować dziennik przepisywania
- 28. Jak przechwycić dziennik uruchamiania Tomcat
- 29. C# najprostszy ślad lub dziennik
- 30. Jak wyświetlić dziennik wszystkich poleceń?
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