Экспорт тайника на другой компьютер

296

Мне нужен способ экспортировать сохраненные изменения на другой компьютер.

На компьютере1 я сделал

$ git stash save feature

Я пытаюсь получить патч для сохранения в файл, а затем импортировать его на другой компьютер

$ git stash show -p > patch

Эта команда дает мне файл, который я могу переместить на другой компьютер, на котором клонировано это хранилище, но вопрос в том, как снова импортировать его в качестве тайника.

Спасибо

Марсело А
источник
6
К сожалению, в git stash saveнастоящее время устарела в пользуgit stash push
Ewan

Ответы:

290

Вы можете применить файл патча (без внесения изменений), просто запустив

git apply patchfile

Затем вы можете просто создать новый тайник из текущего рабочего каталога:

git stash
совать
источник
2
@Marcelo A: Приятно слышать, но, пожалуйста, отметьте ответы, которые вы приняли в качестве таковых, нажав на большую галочку под номером ответа. Таким образом, ваш вопрос будет помечен как решенный.
тыкай
2
Обратите внимание, что система не позволит ОП пометить ответ как «принятый», пока не пройдет какое-то время (думаю, 15 минут) с момента, когда был задан вопрос.
Грег Хьюгилл
23
Прочитав этот ответ, мне стало интересно, как выбрать тот или иной тайник из всех моих тайников. Ответ на этот вопрос здесь: stackoverflow.com/a/1910142/1148702 . В этом случае я сделал: git stash show "stash@{0}" -p > patchвместо второй команды оболочки OP.
Тим Камбер
1
@TimCamber Я не думаю, что вам нужны двойные кавычки stash@{0}..
ари золото
2
@arigold Зависит от используемой вами оболочки. Например, в PowerShell они вам нужны, поскольку фигурные скобки - это особый синтаксис.
совать
18

В качестве альтернативы вы можете создать ветку из вашего тайника (на компьютере 1), используя

git stash branch stashed_changes_branch

зафиксировать ваши изменения:

git commit -a

затем добавьте его в качестве удаленного на компьютере 2:

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

Теперь вы можете получить удаленную информацию, используя

git fetch pc1

теперь вы можете импортировать коммит так, как вы хотите; используя git cherry-pick , git rebase или все что угодно ... Если вы хотите, чтобы это выглядело так, как будто вы только что применили git stash ; Вы можете использовать git cherry-pick --no-commit.


Если у вас нет прямой связи между компьютером1 и компьютером2; Вы можете использовать пульт (например, GitHub или что-то подобное):

git push origin stashed_changes_branch

и на компьютере2:

git fetch
Крис Мэйс
источник
1
Это предполагает, что исходная система (компьютер1) открыта для приема внешних соединений, что для большинства людей, приземляющихся здесь, вряд ли будет верным. Если вы хотите пойти по пути ветвления, почему бы просто не переместить временную ветку в удаленный источник и не извлечь ее из компьютера2? Вы можете удалить удаленную ветку, как только потянете, если не хотите ее оставлять. Ветви в git настолько дешевы, что обычно мало причин не использовать их.
неделимый
@indivisible Я не согласен, есть много возможностей для подключения двух компьютеров в Интернете сегодня. Техника, описанная в ответе, может быть полезна для переноса незавершенной работы с ноутбука на компьютер в локальной сети. Даже виртуальный сервис vpn, такой как Hamachi, будет использоваться для передачи файлов через Интернет в любом месте непосредственно между компьютерами, на которых работает git.
steampowered
1
@steampowered, конечно, это может быть правдой для некоторых людей / ситуаций, но я подумал, что это стоит отметить будущим читателям, так как это решение является трудным требованием для работы этого решения, и изменение вашей локальной среды / системы для приема входящего трафика требует нетривиальной конфигурации это, на мой взгляд, является «излишним» для такой задачи, как эта. Если ваша система (-ы) уже открыта, тогда обязательно используйте этот ответ - он не неправильный. Я просто чувствую, что большинство пользователей, попадающих сюда, не будут в такой ситуации.
неделимый
Шкатулки являются объектами коммитов и, таким образом, уже имеют хэш коммитов (см. git stash list --oneline), Так что вам технически не нужно применять тайник к новому объекту коммитов. Другими словами, создание новой ветки не обязательно. Тем не менее, перенести тайник непосредственно на пульт управления сложно, если не сказать больше.
Тайлер Кромптон
15

В качестве альтернативы вы можете экспортировать все локальные тайники в другой компьютер следующим образом

  • git pull как в старом, так и в новом каталоге git, чтобы последние имели последние изменения.
  • скопировать папку .git из старого каталога git в новый репозиторий
Шафик
источник
1
Хотя сжатый tar-файл .git был 700M +, это оказалось намного проще, чем другие предложенные решения, тем более что у меня было несколько тайников.
Крис Варт
5

Как сделать экспорт Stash в SourceTree:

  1. Создайте новую ветку «StashTransfer» из ветки, где вы собираетесь использовать свой Stash
  2. Примените свой тайник к нему и сделайте коммит

  3. Нажмите на свой коммит и сделайте из него патч, возьмите файл патча с собой.

  4. Перейдите в другой репозиторий, выберите ту же родительскую ветку, которую вы только что использовали в 1)

  5. Действия / Применить патч, выберите Режим: Изменить файлы рабочей копии, нажмите «Применить патч», теперь у вас есть незафиксированные изменения из патча в текущей рабочей среде.

  6. Сделайте новый Stash для текущего репо

KEMBL
источник
4

Вы можете создать stash как файл исправления с одного компьютера, а затем поделиться этим файлом исправления с другими компьютерами.

Создание тайника в виде патча

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

«Stash @ {0}» - это ссылка на stash. Он создаст файл патча с последним тайником. Если вы хотите другую команду$ git stash list список, чтобы увидеть список ваших тайников и выбрать, какой из них вы хотите установить.

Применение патча

Теперь перенесите этот тайник на другой компьютер и вставьте его в корневую папку вашего проекта. Затем запустите эту команду

$ git apply changes.patch

Если есть ошибка, и вы хотите отменить изменение

$ git apply changes.patch --reverse
Сэм
источник
3

Другой вариант заключается в rsyncв .gitпапку с одного компьютера на другой компьютер. rsyncобрабатывает только изменения файла (быстрее, чем копия).

Недостатком этого подхода является то, что конфиги также будут перезаписаны, что может быть нежелательно, если вы запустите разные конфиги .git между двумя компьютерами. Но вы можете преодолеть это, исключив файлы с --excludeопцией в rsync.

В целом, я думаю, что нативное решение Git чище, но этот rsyncхак может быть полезен для спешащих, кто может быть лучше знаком с rsync, чем с git.

на паровой тяге
источник
3

Команда запуска из исходного поста:

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

не работал для меня (по какой-то причине он создал непригодные файлы патчей). Вместо этого я должен был:

git stash apply stash@{x}
git commit

за каждый тайник я хотел перенести. Затем я поместил репо «родителя» в файл: /// досягаемости репо «ребенка» и сделал следующее для каждой фиксации stash:

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

Это сложнее, но сделал свое дело для меня.

Pizon
источник
0

Если вы хотите перенести изменения с одного компьютера на другой, вы всегда можете зафиксировать изменения на своем компьютере, а затем выполнить программный сброс на их компьютере.

офис

git commit -m "-stash-"

Кухня

git reset --soft HEAD~1

Siriquelle
источник
0

Шкатулка - это специальный коммит слияния рабочего дерева между базовым коммитом и индексом. Одним из способов может быть сохранение каждого из них в виде отдельных исправлений, извлечение первого родителя хранилища, восстановление индекса и рабочего дерева из двух исправлений и, наконец, восстановление хранилища (кажется, что один ответ идет таким образом).

Это необходимо для полного воссоздания всей информации из хранилища, и, если вас это не волнует, вам следует как минимум проверить первого родителя хранилища перед его восстановлением, чтобы избежать конфликтов и отследить, где был создан хранилище.

Это то, что я сделал, чтобы полностью восстановить все тайники из одного репо в другой. Если у вас их нет на одном компьютере, вы можете сохранить теги stash в комплекте после их создания и скопировать список ссылок и пакет на целевой компьютер.

Из корня оригинального репо:

  1. Получить список тайников
  2. Пометьте свои ссылки на stash, чтобы вы могли получить их с помощью git fetch (имена тегов не имеют значения, измените их в случае конфликта. Я использовал stash_ + число (и) в логической ссылке на stash)
  3. Преобразуйте логические ссылки в хэши sha1 в обратном порядке. - мы будем использовать их позже
  4. Сохранить этот путь репо - также на потом
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

NB: для этого требуется bash или совместимая оболочка (ksh, zsh должен делать ...). Вы также можете увеличить значение переменной, например stash_$((i++)) если ваша оболочка не поддерживает${param//pattern}

Теперь в новом репо для каждого реф:

  1. Получить ссылку из старого репозитория (нам даже не нужно использовать имена тегов, потому что мы пометили их, мы можем получить их с помощью git fetch)
  2. Повторно импортируйте тайник из ссылки, используя тему этой ссылки в качестве сообщения тайника.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
Томас Гайот-Сионнест
источник