Obecnie akceptowane odpowiedź jest technicznie poprawne, nie można bezpośrednio powiedzieć Git naciskać wszystkie stashes na pilocie, a następnie wyciągnąć wszystko do lokalnych stashes na innym komputerze.
I chociaż aktualnie głosowana odpowiedź powinna działać, nie podobało mi się, że tworzy ona kilka tymczasowych gałęzi i że wymaga ręcznego sprawdzenia zatwierdzenia skrytki i zapisania jej jako skrytki, co może prowadzić do problemów takich jak ten komentarz wspomniane i prowadzi do duplikatu On (no branch): On testing:. Z pewnością musi być lepszy sposób!
Tak więc, chociaż nie możesz bezpośrednio wypychać skrytek, skrytka jest tylko zatwierdzeniem (w rzeczywistości dwa zatwierdzenia), a na git pushstronie podręcznika możesz wypychać zatwierdzenia:
<src>Jest często nazwa oddziału, co chcesz do pchania, ale może to być dowolny arbitralny „SHA-1 wyrażenie” ...
Zdecydowałem się popchnąć skrytki, aby refs/stashes/*nie zaśmiecać pilota dodatkowymi gałęziami. Więc mogę to zrobić za pomocą:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
( rev-parsePolecenie pobiera krótki skrót skrytki, który będzie unikalny dla repozytorium).
Następnie muszę pobrać skrytkę z drugiego komputera. Git domyślnie pobiera tylko gałęzie, więc muszę pobrać skrytki konkretnie:
git fetch origin refs/stashes/*:refs/stashes/*
Teraz, aby przekonwertować zatwierdzenie skrytki z powrotem na rzeczywistą skrytkę. Jak już wspomniano, chociaż mógłbym po prostu sprawdzić, jak zwykle zatwierdzić, zresetować i ukryć skrytkę, nie podoba mi się, że wymaga dodatkowych kroków lub że może nie utrzymywać stanu indeksu dla skrytki. Szukałem w Internecie sposobu na zrobienie tego automatycznie, ale zawiodło mnie moje wyszukiwanie. W końcu przejrzałem stronę man git stash, gdzie znalazłem to:
utwórz
Utwórz skrytkę (która jest zwykłym obiektem zatwierdzania) i zwróć nazwę tego obiektu, bez przechowywania go w dowolnym miejscu w przestrzeni nazw ref. Ma to być przydatne w skryptach. Prawdopodobnie nie jest to polecenie, którego chcesz użyć; patrz „zapisz” powyżej.
store
Przechowuj dane skrytki utworzone za pomocą git stash create (czyli wiszące zatwierdzenie scalania) w skrytce, aktualizując dziennik skrytki. Ma to być przydatne w skryptach. Prawdopodobnie nie jest to polecenie, którego chcesz użyć; patrz „zapisz” powyżej.
Ponieważ mam już zatwierdzenie, storebrzmi jak to, czego chcę. Więc mogę zrobić:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Zastąpienie <SHA>skrytką, która właśnie została pobrana.
( git showPolecenie pobiera komunikat zatwierdzenia z zatwierdzenia ukrytego, aby użyć go jako komunikatu do dziennika ukrytego.)
Skrytka pokazuje się teraz normalnie w moim lokalnym repozytorium:
$ git stash list
stash@{0}: On master: temp
...
Aby wyczyścić pilota, skrytki można usunąć z pilota w następujący sposób:
git push origin :refs/stashes/<SHA>
Ta metoda ma tę zaletę, że jest idempotentna: jeśli pushponownie uruchomisz polecenie, zgłosi to Everything up-to-date. fetchKomenda może być również bezpiecznie uruchamiać wielokrotnie. Chociaż stash storepominie przechowywanie skrytki, jeśli jest taka sama jak najnowsza skrytka, nie zapobiega duplikatom starszych skrytek. Można to obejść, tak jak w moim git-rstashskrypcie, patrz poniżej.
Aby zakończyć, możesz również z łatwością wepchnąć wszystkie skrytki (za pomocą grzmotnąć):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
lub zaimportuj wszystkie pobrane skrytki:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Stworzyłem grzmotnąćskrypt, który można wywołać jako podkomendę (np. git rstash push 0), więc nie muszę pamiętać tego wszystkiego. git-rstashmożna znaleźć tutaj.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stashgit stash apply some-remote/stash