Експортуйте сховище на інший комп'ютер


296

Мені потрібен спосіб експортувати приховану зміну на інший комп'ютер.

На Computer1 я зробив

$ git stash save feature

Я намагаюся дістати патч сховища до файлу, а потім імпортувати його на інший комп'ютер

$ git stash show -p > patch

Ця команда дає мені файл, який я можу перенести на інший комп'ютер, де це репоноване клонування, але питання полягає в тому, як імпортувати його знову як скриньку.

Дякую


6
fyi git stash saveтепер застарілий на користьgit stash push
Еван

Відповіді:


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
Це передбачає, що джерельна система (computer1) відкрита для прийому зовнішніх з'єднань, що для більшості людей, які приземляються тут, швидше за все, не відповідає дійсності. Якщо ви хочете пройти маршрут гілки, чому б не просто натиснути тимчасову гілку на віддалене походження і не витягнути її з computer2? Ви можете видалити віддалену гілку, як тільки ви потягнули, якщо не хочете тримати її. Гілки в git такі дешеві, що зазвичай мало причин не використовувати їх.
неподільний

@indivisible Я не погоджуюся, сьогодні існує багато можливостей підключити два комп'ютери в Інтернеті. Техніка, описана у відповіді, може бути корисною для перенесення незавершеного виробництва з ноутбука на робочий стіл в локальній мережі. Навіть віртуальний сервіс vpn, як Hamachi, буде використовуватися для передачі файлів через Інтернет будь-де безпосередньо між комп'ютерами, на яких працює git.
парі

1
@steampowered, впевнений, що це може бути правдою для деяких людей / ситуацій, але я вважав, що це важливо відзначити майбутнім читачам, оскільки це важка вимога для цього рішення працювати і змінювати локальну env / систему для прийняття вхідного трафіку, займає нетривіальну конфігурацію що, на мою думку, є «надмірним» для подібного завдання. Якщо ваші системи вже відкриті, використовуйте цю відповідь - це невірно. Я просто відчуваю, що більшість користувачів, які прибувають тут, не опиняться у такій ситуації.
неподільний

Stashes - це об’єкти фіксації, і тому вони вже мають хеш фіксування (див. git stash list --oneline), Тому технічно вам не доведеться застосовувати скриньку до нового об’єкта фіксації. Іншими словами, створювати нову гілку не потрібно. Тим не менш, штовхати приховування безпосередньо до пульта - це найменше.
Тайлер Кромптон

15

Крім того, ви можете експортувати цілий локальний пристрій на інший комп’ютер наступним чином

  • git pull як у вашому старому, так і в новому каталозі git, щоб переконатися, що в обох є останні зміни.
  • скопіюйте папку .git зі старого каталогу git у новий сховище

1
Хоча стиснута смола .git становила 700 М +, це виявилося набагато простіше, ніж інші запропоновані рішення, тим більше, що у мене було кілька прихованих процедур.
Кріс

5

Як експортувати приховування в SourceTree:

  1. Створіть нову гілку "StashTransfer" з гілки, де ви збираєтесь використовувати свій приклад
  2. Нанесіть на нього свою сховище і візьміть на себе зобов'язання

  3. Клацніть на свою комісію і зробіть з неї патч, візьміть файл патча з собою.

  4. Перейдіть до іншого сховища, виберіть ту саму батьківську гілку, яку ви тільки що використовували в 1)

  5. Дії / Застосувати патч, виберіть Режим: Змініть файли робочої копії, натисніть кнопку Застосувати патч, тепер у вас є невиправлені зміни з патча у вашому поточному робочому середовищі

  6. Зробіть нову скриньку для поточного репо


4

Ви можете створити схований файл як патч-файл на одній машині, а потім поділитися цим патч-файлом на інших машинах.

Створення скриньки як латки

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

"Стек @ {0}" - це посилання на скриньку. Він створить файл виправлення з останнім сховищем. Якщо ви хочете, щоб інша команда використання $ 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

за кожну скриньку, яку я хотів передати. Потім я помістив "батьківський" репост у файл: /// досяжності "дочірнього" репо, і зробив наступне для кожного прихованого вчинення:

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

Це більш складно, але зробив трюк для мене.


0

Якщо ви хочете перемістити свої зміни з однієї машини на іншу, ви завжди можете зробити свої зміни на вашій машині, а потім виконати плавне скидання на їх машині.

Офіс

git commit -m "-stash-"

Кухня

git reset --soft HEAD~1


0

Схована скринька - це спеціальне об'єднання об'єднання робочого дерева між базовою коміткою та індексом. Одним із способів може бути збереження кожного окремого виправлення, перевірка першої батьківської скриньки, відновлення індексу та робочого дерева з двох патчів і, нарешті, відновлення сховища (здається, одна відповідь іде саме таким чином).

Це потрібно для повного відтворення всієї інформації з сховища, і якщо вам це не важливо, вам слід принаймні перевірити перший батьківський приклад, перш ніж відновити його, щоб уникнути конфліктів і відслідковувати, де створено сховище.

Це я зробив, щоб повністю відновити всі сховища від одного репо до іншого. Якщо ви не можете мати їх на одному комп’ютері, ви можете зберегти сховані теги в пакеті після їх створення та скопіювати список посилань та пакет на цільовий комп'ютер.

Від кореня вихідного репо:

  1. Отримайте список прихованих посилань
  2. Позначте свої скриньки, щоб ви могли їх отримати за допомогою git fetch (імена тегів не означають, змінити його, якщо є конфлікт. Я використав 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 should do ...) Ви також можете збільшити змінну, наприклад, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.