В настоящее время принятый ответ является технически правильным, вы не можете напрямую сказать Git, чтобы он перенес все ваши тайники на удаленный компьютер, а затем перенес все в свои локальные тайники на другом компьютере.
И хотя в настоящее время ответ с наивысшим рейтингом должен работать, мне не понравилось, что он создает кучу временных веток и требует ручного извлечения фиксации stash и сохранения его как stash, что может привести к таким проблемам, как этот комментарий. упоминается , и приводит к дублированию 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
, где я нашел это:
create
Создает stash (который является обычным объектом коммита) и возвращает его имя объекта, не сохраняя его где-либо в пространстве имен ref. Это должно быть полезно для сценариев. Вероятно, это не та команда, которую вы хотите использовать; см. «сохранить» выше.
store
Сохраняет данный stash, созданный с помощью git stash create (который представляет собой висячий коммит слияния), в stash ref, обновляя stash reflog. Это должно быть полезно для сценариев. Вероятно, это не та команда, которую вы хотите использовать; см. «сохранить» выше.
Поскольку у меня уже есть коммит, store
звучит как то, что я хочу. Так что я могу сделать:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
Замена <SHA>
на тайник, который был только что извлечен.
(Команда git show
получает сообщение о коммите из коммита stash, которое используется в качестве сообщения для журнала тайников.)
Тайник теперь отображается как обычно в моем локальном репо:
$ 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