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 push
stronie 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-parse
Polecenie 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, store
brzmi 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 show
Polecenie 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 push
ponownie uruchomisz polecenie, zgłosi to Everything up-to-date
. fetch
Komenda może być również bezpiecznie uruchamiać wielokrotnie. Chociaż stash store
pominie przechowywanie skrytki, jeśli jest taka sama jak najnowsza skrytka, nie zapobiega duplikatom starszych skrytek. Można to obejść, tak jak w moim git-rstash
skrypcie, 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-rstash
można znaleźć tutaj.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
git stash apply some-remote/stash