Nie jestem pewien, czy jest to wspierane przez Git, ale teoretycznie wydaje mi się, że powinno to działać.
Mój przepływ pracy często obejmuje edycję plików w wielu gałęziach jednocześnie. Innymi słowy, często chcę otworzyć kilka plików w jednym oddziale podczas edycji zawartości innego pliku w innym oddziale.
Moim typowym rozwiązaniem tego jest dokonanie dwóch transakcji, ale szkoda, że nie mogę udostępniać gałęzi i referencji między nimi. Chciałbym mieć tylko dwa katalogi robocze zarządzane przez ten sam folder .git.
Zdaję sobie sprawę z lokalnych rozwiązań klonowania git (domyślnie jest to hardlink udostępnionych obiektów oraz opcja --shared, która konfiguruje alternatywny magazyn obiektów z oryginalnym repo), ale rozwiązania te ograniczają tylko wykorzystanie miejsca na dysku , a zwłaszcza w przypadku opcji - share, wydają się być pełne niebezpieczeństw.
Czy istnieje sposób na użycie jednego folderu .git i utworzenie kopii zapasowej dwóch działających katalogów? A może Git jest na stałe zapisany w jednym katalogu roboczym w dowolnym momencie?
git-new-workdir
zostanie zastąpiony przezgit checkout --to=<path>
w Git 2.5. Zobacz moją odpowiedź poniżejgit worktree add <path> [<branch>]
(Git 2.5 rc2). Zobacz moją zredagowaną odpowiedź poniżejOdpowiedzi:
Git 2.5 proponuje od lipca 2015 r. Zamiennik
contrib/workdir/git-new-workdir
: git worktreeZobacz commit 68a2e6a przez Junio C Hamano (
gitster
) .Informacja o wersji wspomina :
Zobacz zatwierdzenie 799767cc9 (Git 2.5rc2)
Oznacza to, że teraz możesz zrobić
git worktree add <path> [<branch>]
Ostrzeżenie: nadal istnieje sekcja
git worktree
„BŁĘDY”, o której należy pamiętać.Uwaga: dzięki git 2.7rc1 (listopad 2015) możesz wyświetlić swoje listy robocze.
Zobacz popełnić bb9c03b , popełnić 92718b7 , popełnić 5193490 , popełnić 1ceb7f9 , popełnić 1ceb7f9 , popełnić 5193490 , popełnić 1ceb7f9 , popełnić 1ceb7f9 (08 paź 2015), popełnić 92718b7 , popełnić 5193490 , popełnić 1ceb7f9 , popełnić 1ceb7f9 (08 paź 2015), popełnić 5193490 , zatwierdzić 1ceb7f9 (08 października 2015), zatwierdzić 1ceb7f9 (08 października 2015) i zatwierdzić ac6c561(02 października 2015) autor:Michael Rappazzo (
rappazzo
) .(Połączone przez Junio C Hamano -
gitster
- in commit a46dcfb , 26 października 2015)Na przykład:
Uwaga: jeśli PRZESUŃ folder folderu roboczego, musisz ręcznie zaktualizować
gitdir
plik.Zobacz commit 618244e (22 stycznia 2016 r.) I commit d4cddd6 (18 stycznia 2016 r.) Autor: Nguyễn Thái Ngọc Duy (
pclouds
) .Pomógł: Eric Sunshine (
sunshineco
) .(Połączone przez Junio C Hamano -
gitster
- w commit d0a1cbc , 10 lutego 2016)Nowy dokument w git 2.8 (marzec 2016) będzie zawierać:
Zachowaj ostrożność podczas usuwania gałęzi: przed git 2.9 (czerwiec 2016 r.) Możesz usunąć jedną używaną w innym działającym drzewie.
Zobacz commit f292244 (29 marca 2016) autor: Kazuki Yamaguchi (
rhenium
) .Pomógł: Eric Sunshine (
sunshineco
) .(Połączone przez Junio C Hamano -
gitster
- w commit 4fca4e3 , 13 kwietnia 2016)Podobnie przed wersją 2.9 (czerwiec 2016 r.) Zmiana nazwy oddziału wyewidencjonowanego w innym drzewie roboczym nie zmieniła symbolicznej HEAD we wspomnianym innym drzewie roboczym.
Zobacz zatwierdzenie 18eb3a9 (08 kwietnia 2016) i zatwierdzenie 70999e9 , zatwierdzenie 2233066 (27 marca 2016) przez Kazuki Yamaguchi (
rhenium
) .(Połączone przez Junio C Hamano -
gitster
- w commit 741a694 , 18 kwietnia 2016)Mechanizm blokujący jest oficjalnie obsługiwany przez git 2.10 (III kwartał 2016)
Zobacz zatwierdzenie 080739b , zatwierdzenie 6d30862 , zatwierdzenie 58142c0 , zatwierdzenie 346ef53 , zatwierdzenie 346ef53 , zatwierdzenie 58142c0 , zatwierdzenie 346ef53 , zatwierdzenie 346ef53 (13 czerwca 2016 r.) I zatwierdzenie 984ad9e , zatwierdzenie 6835314 (03 czerwca 2016 r.) Autor: Nguyễn Thái Ngọc Duy (
pclouds
) .Sugerowane przez: Eric Sunshine (
sunshineco
) .(Połączone przez Junio C Hamano -
gitster
- w commit 2c608e0 , 28 lipca 2016)Git 2.13 (Q2 2017) dodaje
lock
opcję w zatwierdzeniu 507e6e9 (12 kwietnia 2017 r.) Autor: Nguyễn Thái Ngọc Duy (pclouds
) .Sugerowane przez: David Taylor (
dt
) .Pomoc: Jeff King (
peff
) .(Połączone przez Junio C Hamano -
gitster
- w commit e311597 , 26 kwietnia 2017)Podobnie
git worktree add' --lock
jestgit worktree lock
pogit worktree add
, ale bez warunków wyścigu.Git 2.17+ (Q2 2018) dodaje
git worktree move
/git worktree remove
: zobacz tę odpowiedź .Git 2.19 (III kwartał 2018 r.) Dodaje
--quiet
opcję „git worktree add
”, dzięki której „ ” jest mniej gadatliwy.Zobacz commit 371979c (15 sierpnia 2018) autor: Elia Pinto (
devzero2000
) .Pomagają: Martin Ågren, Duy Nguyen (
pclouds
) i Eric Sunshine (sunshineco
) .(Połączone przez Junio C Hamano -
gitster
- w commit a988ce9 , 27 sierpnia 2018)Zauważ, że „
git worktree add
” kiedyś „znajdował dostępną nazwę ze stat, a następniemkdir
”, która jest podatna na rasę.Zostało to naprawione w Git 2.22 (Q2 2019) przy użyciu
mkdir
i reakcjiEEXIST
w pętli.Zobacz commit 7af01f2 (20 lutego 2019) autorstwa Michała Suchanka (
hramrach
) .(Połączone przez Junio C Hamano -
gitster
- w commit 20fe798 , 09 kwi 2019)Git 2.22 (drugi kwartał 2019 r.) Naprawia logikę, aby stwierdzić, czy repozytorium Git ma działające drzewo, chroni
git branch -D
przed usunięciem gałęzi, która jest obecnie wypisana przez pomyłkę.Implementacja tej logiki została zepsuta dla repozytoriów o nietypowej nazwie, co niestety jest obecnie normą dla podmodułów.
Zobacz zatwierdzenie f3534c9 (19 kwietnia 2019 r.) Autor: Jonathan Tan (
jhowtan
) .(Połączone przez Junio C Hamano -
gitster
- w commit ec2642a , 08 maja 2019)źródło
git
Dystrybucja przychodzi z pomocą przyczyniła skrypt o nazwiegit-new-workdir
. Użyłbyś tego w następujący sposób:gdzie katalog-projektu to nazwa katalogu zawierającego twoje
.git
repozytorium. Skrypty tworzą kolejny.git
katalog z wieloma dowiązaniami symbolicznymi do oryginalnego, z wyjątkiem plików, których nie można udostępnić (jak bieżąca gałąź), umożliwiając pracę w dwóch różnych gałęziach.Brzmi to trochę krucho, ale jest to opcja.
źródło
git-new-workdir-recursive
który jest opakowaniemgit-new-workdir
.Natknąłem się na to pytanie, mając nadzieję na rozwiązanie, którego tutaj nie znalazłem. Więc teraz, że ja nie znaleźć to, co potrzebne, postanowiłem opublikować go tutaj dla innych.
Uwaga: Prawdopodobnie nie jest to dobre rozwiązanie, jeśli musisz edytować wiele gałęzi jednocześnie, np. Stany OP. Jest za posiadające wiele oddziałów wyrejestrowany jednocześnie, że nie zamierza edytować. (Wiele katalogów roboczych wspieranych przez jeden folder .git.)
Nauczyłem się kilku rzeczy, odkąd po raz pierwszy zadałem to pytanie:
Co to jest „ nagie repozytorium ”. Jest to zasadniczo zawartość
.git
katalogu, nie będąc zlokalizowanym w działającym drzewie.Fakt, że możesz określić lokalizację używanego repozytorium (lokalizację katalogu
.git
) w wierszu polecenia zgit
opcją--git-dir=
Fakt, że możesz określić lokalizację swojej kopii roboczej za pomocą
--work-tree=
Co to jest „repozytorium lustrzane”.
To ostatnie jest dość ważnym rozróżnieniem. Tak naprawdę nie chcę pracować z repozytorium, muszę tylko mieć jednocześnie kopie różnych gałęzi i / lub tagów. W rzeczywistości muszę zagwarantować, że gałęzie nie będą się różnić od gałęzi mojego pilota. Zatem lustro jest dla mnie idealne.
Więc w moim przypadku użycia dostałem to, czego potrzebowałem, robiąc:
Największym zastrzeżeniem jest to, że nie ma osobnego HEAD dla dwóch kopii. Po powyższym, uruchomienie
git --git-dir=<localgitdir> --work-tree=firstcopy status
pokaże wszystkie różnice między gałęzią 2 i gałęzią 1 jako niezatwierdzone zmiany - ponieważ HEAD wskazuje na gałąź 2. (Dlatego używam tej-f
opcjicheckout
, ponieważ tak naprawdę nie planuję żadnych lokalnych zmian. Mogę pobrać dowolny tag lub gałąź dla dowolnego drzewa roboczego, o ile korzystam z tej-f
opcji).W moim przypadku, gdy na tym samym komputerze istnieje wiele kas, bez konieczności ich edycji , działa to doskonale. Nie wiem, czy jest jakiś sposób na posiadanie wielu HEAD dla wielu drzew roboczych bez skryptu, takiego jak ten, który jest opisany w innych odpowiedziach, ale mam nadzieję, że i tak jest to pomocne dla kogoś innego.
źródło
$HOME
. Jest jeszcze jedno zastrzeżenie dotyczące powyższej metody, którą odkryłem później, która dotyczy plików, które nie istnieją w tej czy innej gałęzi. Jeśli wyewidencjonujesz A do katalogu 1, następnie wyewidencjonujesz B do katalogu 2, a następnie wymusisz pobranie C do katalogu 1, jeśli istnieje plik, który istnieje w A, ale nie w B lub C, plik nie zostanie usunięty z katalogu 1 nawet przez wymuszenie pobrania .git clean
W takim przypadku możesz więc poeksperymentować - lub zrobić to, co zrobiłem i po prostu użyj tej metody do zapełnienia świeżo utworzonego katalogu.Jedyne rozwiązanie, jakie mogę wymyślić, to sklonowanie dwóch katalogów i dodanie ich jako zdalnych repozytoriów. Możesz następnie wyciągać rzeczy ze zmienionego jednego do drugiego bez faktycznego wypychania czegokolwiek do zdalnego repozytorium.
Zakładam, że chcesz mieć dwa działające katalogi, a nie dwa klony pilota, ponieważ nie chcesz wypychać niektórych gałęzi do pilota. W przeciwnym razie dwa klony twojego pilota będą działały dobrze - wystarczy wykonać kilka popchnięć i pociągnięć, aby wszystkie trzy były zsynchronizowane.
źródło