На даний момент прийнята відповідь технічно правильно, ви не можете безпосередньо сказати Git , щоб підштовхнути всі ваші кубла на пульті дистанційного керування, а потім тягнути все в ваших місцевих схованках на іншому комп'ютері.
І хоча відповідь, що наразі отримує все необхідне, має працювати, мені не сподобалось, що вона створює купу тимчасових гілок, і що для цього потрібно вручну перевірити скрийнш-скрипт і зберегти його як приховування, що може призвести до таких проблем, як цей коментар згаданий і веде до дубліката On (no branch): On testing:
. Звичайно, має бути кращий шлях!
Тому, поки ви не можете безпосередньо натиснути скриньки, сховище - це лише зобов’язання (фактично два коміти), і на сторінці git push
man ви можете надсилати коміти:
<src>
Часто назва галузі ви хотіли б, щоб штовхати, але він може бути будь-яким довільним «SHA-1 вираз» ...
Я вирішив підштовхнути скриньки, щоб refs/stashes/*
я не захаращував свій пульт додатковими гілками. Тож я можу це зробити за допомогою:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
( rev-parse
Команда отримує короткий хеш скрипту, який буде унікальним для репо.)
Далі мені потрібно забрати сховище з іншого комп'ютера. Git отримує лише гілки за замовчуванням, тому мені потрібно отримати конкретні дані:
git fetch origin refs/stashes/*:refs/stashes/*
Тепер конвертувати приховану скриньку назад у фактичну сховку. Як уже згадувалося, хоча я можу просто перевірити приховану фіксацію, скидання та сховище як завжди, мені не подобається, що для цього потрібні додаткові кроки або що він може не підтримувати стан індексу для сховища. Я шукав в Інтернеті спосіб зробити це автоматично, але мій пошук-фу зірвав мене. Нарешті я переглянув сторінку чоловіка для git stash
, де я знайшов це:
створити
Створити приховану скриньку (яка є звичайним об'єктом фіксації) і повернути її ім'я об'єкта, не зберігаючи його ніде в просторі імен ref. Це покликане бути корисним для сценаріїв. Це, мабуть, не команда, яку ви хочете використовувати; див. "Зберегти" вище.
store
Зберігати заданий скринь, створений за допомогою git stash create (який є звисаючим злиттям комісії) у скриньці ref, оновивши рефлектор скриньки. Це покликане бути корисним для сценаріїв. Це, мабуть, не команда, яку ви хочете використовувати; див. "Зберегти" вище.
Оскільки я вже маю на себе зобов’язання, це store
звучить як те, що я хочу. Тож я можу зробити:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Заміна <SHA>
щойно зібраного сховища.
( git show
Команда отримує повідомлення про фіксацію з комісії прихованої скриньки для використання в якості повідомлення для журналу зберігання.)
Сховище тепер відображається як нормальне в моїй місцевій репо:
$ git stash list
stash@{0}: On master: temp
...
Щоб очистити пульт, сховища можна видалити з пульта так:
git push origin :refs/stashes/<SHA>
Цей метод також має перевагу бути ідентичним: якщо ви push
знову запустите команду, він звітує Everything up-to-date
. fetch
Команда також може бути безпечно запустити повторно. Незважаючи на те, що stash store
заповіт пропустить, зберігаючи сховище, якщо він такий самий, як останній, він не перешкоджає дублікатам старих даних. Це можна вирішити, хоча, як це я роблю в своєму git-rstash
сценарії, див. Нижче.
Для завершення ви також можете легко натиснути всі скриньки (з баш):
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
або імпортувати всі отримані сховища:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
Я створив башскрипт, який можна назвати підкомандою (наприклад git rstash push 0
), тому мені не потрібно пам’ятати все це. git-rstash
можна знайти тут.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
доgit stash apply some-remote/stash
. Але ви не можете отримати старі скрині, тому що вони зберігаються в рефлогу, який неможливо придбати. Див stackoverflow.com/questions/2248680 / ...