Можно ли в git создать тайник, перенести тайник в удаленный репозиторий, получить тайник на другом компьютере и применить тайник?
Или мои варианты:
- Создать патч и скопировать патч на другой компьютер, или
- Создать второстепенную ветвь и передать незавершенную работу этой ветке?
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
git stash apply some-remote/stash
Примечание: я только что переписал этот ответ с 24-часовым гитфу под моим поясом :) В моей истории с оболочкой весь шебанг теперь состоит из трех строк. Тем не менее, я не осуждаю их для вашего удобства.
Таким образом, я надеюсь, что вы сможете увидеть, как я это делал, вместо того, чтобы просто слепо копировать / вставлять вещи.
Вот шаг за шагом.
Предположим, что источник в ~ / OLDREPO содержит тайники. Создайте тестовый клон, не содержащий тайников:
Вставьте все тайники как временные ветви:
Цикл на приемном конце, чтобы преобразовать обратно в тайники:
Очистите ваши временные ветви, если хотите
Сделайте список git stash, и вы получите что-то вроде этого:
На исходном репозитории тоже самое выглядело как
источник
git add .
доgit stash save ...
шага, так какgit stash
отказывается хранить новые файлы, если они не были подготовлены. Кроме того, передача результатовgit rev-list ...
сквозной передачиtac
меняет порядок расположения тайников, чтобы они вышли в том же порядке.for
цикл с помощьюgit branch -D stash_$a
(очистите, когда создаются тайники), чтобы, если что-то пошло не так, и мы повторили попытку, мы не обрабатывали коммиты, уже успешно спрятанные.git stash save "$(git log --format='%s' -1 HEAD@{1})"
сgit update-ref --create-reflog -m "$(git show -s --format=%B $rev)" refs/stash $rev
вами получить оригинальное копить сообщение (update-ref
это то , чтоgit stash save
за кадром).Я немного опаздываю на вечеринку, но я считаю, что нашел что-то, что работает для меня в этом отношении, и это может быть для вас тоже, если ваши обстоятельства такие же или похожие.
Я работаю над функцией в своей собственной ветке. Ветвь не объединяется с мастером и не выдвигается до тех пор, пока она не будет завершена или пока я не совершу коммиты, которые мне удобно показывать публике. Итак, что я делаю, когда хочу перенести не поэтапные изменения на другой компьютер:
[non-commit] FOR TRANSFER ONLY
", содержащим контент, который вы хотите передать.Затем сделайте:
git pull ssh+git://<username>@<domain>/path/to/project/ rb:lb
URL может отличаться для вас, если вы обращаетесь к своему хранилищу другим способом. Это вытянет изменения из этого URL из удаленной ветви "rb" в локальную ветку "lb". Обратите внимание, что у меня есть сервер ssh, работающий на моем собственном компьютере, и я могу получить доступ к хранилищу таким образом.
git reset HEAD^
(подразумевает--mixed
)Это сбрасывает HEAD, чтобы он указывал на состояние перед фиксацией «[non-commit]».
Из git-reset (1): "
--mixed
: Сбрасывает индекс, но не рабочее дерево (т. Е. Измененные файлы сохраняются, но не помечаются для фиксации) [...]"Таким образом, в конце вы внесете свои изменения в файлы, но в мастере не будет зафиксировано никаких коммитов и нет необходимости в тайнике.
Это, однако, потребует от вас
git reset --hard HEAD^
в хранилище, в котором вы сделали «[non-commit]», так как этот коммит является мусором.источник
Уже немного поздно, но этот ответ может кому-то помочь. Я хотел знать это, потому что я хотел иметь возможность выдвигать текущую функцию / ошибку / что угодно и работать из той же точки на другом компьютере.
Для меня работает фиксация моего текущего кода (в ветке, над которой я работаю в одиночку). Когда я доберусь до моего другого компьютера, сделайте тягу, а затем отмените коммит с помощью:
Продолжайте работать, как вы, со всеми вашими изменениями, незавершенными и неподготовленными.
Надеюсь, поможет.
источник
Кажется, есть очень хороший трюк, чтобы решить эту проблему. Вы можете использовать
git diff > file.diff
(и зафиксировать файл), а затем восстановить изменения, используяgit apply file.diff
(из любого места) для достижения того же результата.Это было объяснено и здесь .
источник
Я бы выбрал второй подход, хотя понятия не имею, почему вы не можете зафиксировать его в основной / избранной ветке. Можно также собирать вишню.
источник
AFAIK вся идея тайника в том, чтобы спрятать что-то не столь важное под местным ковром. Никто не должен знать о вашем любимом дерьме ;-) Единственное «но» - это: а если я буду работать на паре рабочих станций? Тогда
scp
это намного лучше.источник
В настоящее время принятый ответ является технически правильным, вы не можете напрямую сказать Git, чтобы он перенес все ваши тайники на удаленный компьютер, а затем перенес все в свои локальные тайники на другом компьютере.
И хотя в настоящее время ответ с наивысшим рейтингом должен работать, мне не понравилось, что он создает кучу временных веток и требует ручного извлечения фиксации stash и сохранения его как stash, что может привести к таким проблемам, как этот комментарий. упоминается , и приводит к дублированию
On (no branch): On testing:
. Конечно, должен быть лучший способ!Таким образом, хотя вы не можете напрямую выдвигать тайники, тайник - это просто коммит (на самом деле это два коммита), и на
git push
странице man вы можете нажать коммиты:Я предпочел подтянуть крошку, чтобы
refs/stashes/*
не загромождать мой пульт дополнительными ветвями. Так что я могу сделать это с:(Команда
rev-parse
получает короткий хэш тайника, который будет уникальным для репо.)Затем мне нужно получить тайник с другого компьютера. Git по умолчанию выбирает только ветки, так что мне нужно специально выбирать тайники:
Теперь, чтобы преобразовать тайник коммит обратно в реальный тайник. Как уже упоминалось, хотя я мог просто проверить фиксацию, сброс и сохранение тайника, как обычно, мне не нравится, что для этого требуются дополнительные шаги или что он может не поддерживать состояние индекса для тайника. Я искал в Интернете способ сделать это автоматически, но мой поиск не помог мне. Наконец, я просмотрел страницу руководства для
git stash
, где я нашел это:Поскольку у меня уже есть коммит,
store
звучит как то, что я хочу. Так что я могу сделать:Замена
<SHA>
на тайник, который был только что извлечен.(Команда
git show
получает сообщение о коммите из коммита stash, которое используется в качестве сообщения для журнала тайников.)Тайник теперь отображается как обычно в моем локальном репо:
Для очистки пульта можно удалить тайники с пульта следующим образом:
Этот метод также имеет то преимущество, что он является идемпотентом: если вы
push
снова запустите команду, она сообщитEverything up-to-date
.fetch
Команда также может быть безопасно запустить повторно. Несмотря на то, чтоstash store
он пропустит сохранение тайника, если он совпадает с последним тайником, он не предотвратит дублирование старых тайников. Это можно обойти, хотя, как я делаю в моемgit-rstash
сценарии, см. Ниже.Для завершения, вы также можете легко нажать на все тайники (с удар):
или импортировать все извлеченные тайники:
Я создал ударсценарий, который может быть вызван как подкоманда (например
git rstash push 0
), поэтому мне не нужно все это помнить.git-rstash
можно найти здесь.источник
Следующее не работает с тайником, но с незафиксированными изменениями в рабочем каталоге. Он создает ветку, автоматически фиксирует все текущие изменения и отправляет на удаленный:
Используйте как:
источник
Я просто создал бы новую ветку stash и удалял всякий раз, когда эта ветка не требуется.
источник
Просто используйте Dropbox, как этот парень. Таким образом, вам не нужно беспокоиться о загрузке тайников, поскольку весь ваш код будет сохранен.
http://blog.sapegin.me/all/github-vs-dropbox
источник