Wyeksportuj skrytkę na inny komputer

296

Potrzebuję sposobu na wyeksportowanie ukrytej zmiany na inny komputer.

Zrobiłem to na Computer1

$ git stash save feature

Próbuję pobrać łatkę ukrytą do pliku, a następnie zaimportować ją na inny komputer

$ git stash show -p > patch

To polecenie daje mi plik, który mogę przenieść na inny komputer, na którym klonowane jest to repozytorium, ale pytanie brzmi, jak ponownie zaimportować go jako skrytkę.

Dzięki

Marcelo A.
źródło
6
fyi git stash savejest teraz przestarzałe na korzyśćgit stash push
Ewan

Odpowiedzi:

290

Możesz zastosować plik łatki (bez zatwierdzania zmian), po prostu uruchamiając

git apply patchfile

Następnie możesz po prostu utworzyć nową skrytkę z bieżącego katalogu roboczego:

git stash
szturchać
źródło
2
@Marcelo A: Dobrze słyszeć, ale proszę zaznaczyć odpowiedzi, które zaakceptowałeś, klikając duży znacznik wyboru poniżej liczby głosów w odpowiedzi. W ten sposób twoje pytanie zostanie oznaczone jako rozwiązane.
poke
2
Zauważ, że system nie pozwoli OP oznaczyć odpowiedzi jako „zaakceptowanej”, dopóki nie upłynie jakiś czas (15 minut, jak sądzę) od momentu zadania pytania.
Greg Hewgill
23
Po przeczytaniu tej odpowiedzi zastanawiałem się, jak wybrać konkretną skrytkę ze wszystkich moich skrytek. Odpowiedź na to pytanie znajduje się tutaj: stackoverflow.com/a/1910142/1148702 . W tym przypadku skończyłem: git stash show "stash@{0}" -p > patchzamiast drugiego polecenia powłoki OP.
Tim Camber,
1
@TimCamber nie sądzę, że potrzebujesz podwójnych cudzysłowów wokół stash@{0}...
ari gold
2
@arigold Zależy od używanej powłoki. Na przykład w PowerShell potrzebujesz ich, ponieważ nawiasy klamrowe są tam specjalną składnią.
poke
18

alternatywnie możesz utworzyć gałąź ze swojego skrytki (na komputerze 1), używając

git stash branch stashed_changes_branch

zatwierdzić zmiany:

git commit -a

następnie dodaj go jako pilota na komputerze 2:

git remote add pc1 user@computer1:/path/to/repo

teraz możesz pobrać zdalne informacje za pomocą

git fetch pc1

teraz możesz zaimportować zatwierdzenie w dowolny sposób; używając git cherry-pick , git rebase lub cokolwiek zechcesz ... Jeśli chcesz, aby wyglądało to tak, jakbyś właśnie zastosował git stash ; możesz użyć git cherry-pick - no-commit.


Jeśli nie masz bezpośredniego połączenia między komputerem1 a komputerem2; możesz użyć pilota (takiego jak github lub coś podobnego):

git push origin stashed_changes_branch

i na komputerze2:

git fetch
Chris Maes
źródło
1
Zakłada się, że system źródłowy (komputer1) jest otwarty na odbieranie połączeń zewnętrznych, co dla większości osób lądujących tutaj jest mało prawdopodobne. Jeśli chcesz przejść ścieżkę oddziału, dlaczego nie po prostu przesunąć gałęzi tymczasowej do zdalnego źródła i pobrać ją z komputera2? Możesz usunąć zdalną gałąź natychmiast po jej wyciągnięciu, jeśli nie chcesz jej trzymać. Gałęzie w git są tak tanie, że zwykle nie ma powodów, aby z nich nie korzystać.
niepodzielny
@indivisible Nie zgadzam się, że dziś istnieje wiele możliwości połączenia dwóch komputerów w Internecie. Technika opisana w odpowiedzi może być przydatna do przeniesienia prac w toku z laptopa na komputer stacjonarny w sieci LAN. Nawet wirtualna usługa VPN, taka jak Hamachi, byłaby używana do przesyłania plików przez Internet w dowolnym miejscu bezpośrednio między komputerami z uruchomionym programem git.
steampowered 18.07.17
1
@steampowered, to może być prawda dla niektórych osób / sytuacji, ale pomyślałem, że warto zwrócić uwagę na przyszłych czytelników, ponieważ jest to trudne wymaganie, aby to rozwiązanie działało i modyfikowanie lokalnego systemu env / systemu w celu akceptowania ruchu przychodzącego wymaga konfiguracji niebanalnej moim zdaniem jest to „przesada” w przypadku takiego zadania. Jeśli twój system (systemy) są już otwarte, skorzystaj z tej odpowiedzi - to nie jest niepoprawne. Po prostu czuję, że większość użytkowników lądujących tutaj nie będzie w takiej sytuacji.
niepodzielny
Skrytki są obiektami zatwierdzającymi, a zatem mają już skrót zatwierdzający (patrz git stash list --oneline), więc technicznie nie musisz stosować ukrytej skrytki do nowego obiektu zatwierdzającego. Innymi słowy, utworzenie nowego oddziału nie jest konieczne. Jednak przekazanie skrytki bezpośrednio do pilota jest co najmniej trudne.
Tyler Crompton
15

Alternatywnie możesz wyeksportować całe lokalne skrytki do innego komptera w następujący sposób

  • git pull zarówno w starym, jak i nowym katalogu git, aby mieć pewność, że oba zawierają najnowsze zmiany.
  • skopiuj folder .git ze starego katalogu git do nowego repozytorium
shafeeq
źródło
1
Chociaż skompresowana smoła .git wynosiła 700 M +, okazało się to o wiele łatwiejsze niż inne proponowane rozwiązania, zwłaszcza, że ​​miałem wiele skrytek.
Chris Warth,
5

Jak zrobić eksport Stash w SourceTree:

  1. Utwórz nową gałąź „StashTransfer” z gałęzi, w której zamierzasz korzystać ze swojej Skrytki
  2. Zastosuj skrytkę i dokonaj zatwierdzenia

  3. Kliknij zatwierdzenie i stwórz z niego łatkę, zabierz ze sobą plik łaty.

  4. Przejdź do innego repozytorium, wybierz tę samą gałąź nadrzędną, której właśnie użyłeś w 1)

  5. Działania / Zastosuj łatkę, wybierz Tryb: Modyfikuj pliki kopii roboczej, wciśnij Zastosuj łatkę, teraz masz niezatwierdzone modyfikacje łatki w bieżącym środowisku roboczym

  6. Utwórz nową skrytkę dla bieżącego repozytorium

KEMBL
źródło
4

Możesz utworzyć ukryty plik łatki z jednego komputera, a następnie udostępnić ten plik łatki innym komputerom.

Tworzenie skrytki jako łatki

$ git stash show "stash@{0}" -p > changes.patch

„Stash @ {0}” to odnośnik do skrytki, który utworzy plik łatki z najnowszą skrytką. Jeśli chcesz użyć innego, użyj polecenia, $ git stash listaby wyświetlić listę skrytek i wybierz, który chcesz załatać.

Stosowanie poprawki

Teraz przenieś tę skrytkę na inną maszynę i wklej ją do folderu głównego swojego projektu. Następnie uruchom to polecenie

$ git apply changes.patch

Jeśli wystąpi błąd i chcesz cofnąć zmianę

$ git apply changes.patch --reverse
Sam
źródło
3

Inną opcją jest rsyncdo .gitfolderu z jednego komputera do innego komputera. rsyncprzetwarza tylko zmiany plików (szybsze niż kopia).

Wadą tego podejścia jest również zastąpienie konfiguracji, co może nie być pożądane, jeśli uruchomisz różne konfiguracje .git między dwoma komputerami. Ale można to rozwiązać, wykluczając pliki z --excludeopcją w rsync.

Ogólnie rzecz biorąc, myślę, że natywne rozwiązanie Git jest czystsze, ale ten rsynchack może być miły dla kogoś, kto się spieszy i może lepiej znać rsync niż git.

steampowered
źródło
3

Polecenie uruchomienia z oryginalnego postu:

git stash show -p stash@{x} > patch_file

nie działało dla mnie (z jakiegoś powodu stworzyło nieużywalne pliki łat). Zamiast tego musiałem:

git stash apply stash@{x}
git commit

za każdą skrytkę, którą chciałem przenieść. Następnie umieściłem repozytorium „nadrzędne” w pliku: /// zasięg repozytorium „podrzędnego” i wykonałem następujące czynności dla każdego zatwierdzenia ukrytego:

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

To jest bardziej skomplikowane, ale załatwiło sprawę.

pizon
źródło
0

Jeśli chcesz przenieść zmiany z jednego komputera na drugi, zawsze możesz zatwierdzić zmiany na swoim komputerze, a następnie wykonać miękki reset na jego komputerze.

Gabinet

git commit -m "-stash-"

Kuchnia

git reset --soft HEAD~1

Siriquelle
źródło
0

Skrytka jest specjalnym zatwierdzeniem scalania drzewa roboczego między zatwierdzeniem bazowym a indeksem. Jednym ze sposobów może być zapisanie każdego z nich jako oddzielnych łatek, pobranie pierwszego skrytki nadrzędnego, przywrócenie indeksu i drzewa pracy z dwóch poprawek i wreszcie przywrócenie skrytki (wydaje się, że jedna odpowiedź idzie w ten sposób).

Jest to potrzebne do pełnego odtworzenia wszystkich informacji ze skrytki, a jeśli nie przejmujesz się tym, powinieneś przynajmniej sprawdzić pierwszego rodzica skrytki przed jej przywróceniem, aby uniknąć konfliktów i śledzić, gdzie skrytka została utworzona.

To właśnie zrobiłem, aby w pełni przywrócić wszystkie skrytki z jednego repo do drugiego. Jeśli nie możesz mieć ich na tym samym komputerze, możesz zapisać tagi ukryte w pakiecie po ich utworzeniu i skopiować listę referencji i pakiet na komputer docelowy.

Z katalogu głównego oryginalnego repozytorium:

  1. Uzyskaj listę referencji ukrytych
  2. Oznacz swoje referencje skrytek, abyś mógł je pobrać za pomocą git fetch (nazwy znaczników nie mają znaczenia, zmień je, jeśli wystąpi konflikt. Użyłem stash_ + liczb (y) w logicznym oznaczeniu ukryć)
  3. Przekształć odniesienia logiczne w skróty sha1 w odwrotnej kolejności - wykorzystamy je później
  4. Zapisz tę ścieżkę repo - również na później
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD

Uwaga: To wymaga bash lub kompatybilnej powłoki (ksh, zsh powinny zrobić ...) Możesz również zwiększyć zmienną, np. stash_$((i++))Jeśli twoja powłoka nie obsługuje${param//pattern}

Teraz w nowym repozytorium dla każdego ref:

  1. Pobierz referencję ze starego repozytorium (nie musimy nawet używać nazw tagów, ponieważ oznaczyliśmy je tagami, możemy je odzyskać za pomocą git fetch)
  2. Ponownie zaimportuj skrytkę z referencji, używając tematu tej referencji jako wiadomości ukrytej.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Thomas Guyot-Sionnest
źródło