Можно ли отправить git-тайник в удаленный репозиторий?


в git можно ли создать тайник, переместить тайник в удаленный репозиторий, получить тайник на другом компьютере и применить тайник?

или мои варианты:

  • создать патч и скопируйте патч на другой компьютер, или
  • создать второстепенную ветвь и передать незавершенную работу в эту ветвь?
9 154

9 ответов:

это не возможно, чтобы получить его через fetch или так, зеркало refspec составляет fetch = +refs/*:refs/*, и хотя заначка есть refs/stash он не отправляется. Явное refs/stash:refs/stash нет эффекта!

это было бы только запутанным в любом случае, так как это не принесло бы все тайники, только последний; список тайников-это reflog из ref refs/stashes.

Примечание: Я только что переписал этот ответ с 24 часами больше git-fu под моим поясом :) В моей истории shell весь shebang теперь состоит из трех однострочных лайнеров. Тем не менее, я их раскодировал для вашего удобства.

таким образом, я надеюсь, что вы сможете увидеть, как я делал вещи, вместо того, чтобы просто слепо копировать/вставлять вещи.


вот шаг за шагом.

предположим, что это источник в ~ / OLDREPO, содержащий тайники. Создание тестового клона не содержит никаких тайников:

cd ~/OLDREPO
git clone . /tmp/TEST

нажмите все тайники как временные ветви:

git send-pack /tmp/TEST $(for sha in $(git rev-list -g stash); \
    do echo $sha:refs/heads/stash_$sha; done)

цикл на приемном конце для преобразования обратно в тайники:

cd /tmp/TEST/
for a in $(git rev-list --no-walk --glob='refs/heads/stash_*'); 
do 
    git checkout $a && 
    git reset HEAD^ && 
    git stash save "$(git log --format='%s' -1 HEAD@{1})"
done

очистите ваши временные ветви, если вы будете

git branch -D $(git branch|cut -c3-|grep ^stash_)

сделайте список git stash, и вы получите что-то вроде этого:

stash@{0}: On (no branch): On testing: openmp import
stash@{1}: On (no branch): On testing: zfsrc
stash@{2}: On (no branch): WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue
stash@{3}: On (no branch): WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{4}: On (no branch): WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{5}: On (no branch): WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{6}: On (no branch): WIP on testing: db9f77e fuse_unmount_all could be starved for the mtx lock
stash@{7}: On (no branch): WIP on xattrs: db9f77e fuse_unmount_all could be starved for the mtx lock
stash@{8}: On (no branch): WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{9}: On (no branch): WIP on emmanuel: bee6660 avoid unrelated changes

в исходном репозитории то же самое выглядело

stash@{0}: WIP on emmanuel: bee6660 avoid unrelated changes
stash@{1}: WIP on testing: 28716d4 fixed implicit declaration of stat64
stash@{2}: WIP on xattrs: db9f77e fuse_unmount_all could be starved for the mtx lock
stash@{3}: WIP on testing: db9f77e fuse_unmount_all could be starved for the mtx lock
stash@{4}: WIP on testing: 3972694 removed braindead leftover -O0 flag
stash@{5}: WIP on xattrs: 3972694 removed braindead leftover -O0 flag
stash@{6}: WIP on debian-collab: c5c8037 zfs_pool_alert should be installed by default
stash@{7}: WIP on sehe: 7006283 fixed wrong path to binary in debianized init script (reported as part of issue #57)
stash@{8}: On testing: zfsrc
stash@{9}: On testing: openmp import

Я немного опоздал на вечеринку, но я считаю, что нашел что-то, что работает для меня в этом отношении, и это может быть для вас тоже, если ваши обстоятельства одинаковы или похожи.

Я работаю над функцией в своей ветке. Ветка не сливается в master и не нажимается до тех пор, пока она не будет завершена, или я сделал коммиты, которые мне удобно показывать публике. Так что я делаю, когда я хочу перевести не устроили изменения на другой компьютер:

  • сделать коммит, с сообщением фиксации как "[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)

    это сбрасывает головку, чтобы указать на состояние перед фиксацией" [non-commit]".

от git-reset(1): "--mixed: сброс индекса, но не рабочего дерева (т. е. измененные файлы сохраняются, но не помечены для фиксации) [...]"

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

этот однако потребуется вам git reset --hard HEAD^ в репозитории, в котором вы сделали "[non-commit]", так как эта фиксация является мусором.

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

то, что работает для меня,-это фиксация моего незавершенного кода (в ветке, над которой я работаю в одиночку). Когда я доберусь до своего другого компьютера, сделайте рывок, а затем отмените фиксацию с помощью:

git reset --soft HEAD^

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

надеюсь, что это помогает.

Я бы пошел со вторым подходом, хотя не знаю, почему вы не можете передать его в master/featured branch . Также можно заняться собиранием вишни.

там, кажется, очень аккуратный трюк, чтобы решить эту проблему. вы можете использовать git diff > file.diff (и зафиксировать файл), а затем восстановить изменения с помощью git apply file.diff (из любого места) для достижения того же результата.

об этом рассказал здесь как хорошо.

AFAIK вся идея тайника заключается в том, чтобы скрыть что-то не столь важное под local ковер. Никто не должен знать о вашем любимом дерьме ; -) единственное "НО": Но если я буду развиваться на нескольких рабочих станциях? Тогда scp лучше.

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

commit_and_push_ ( ) {
    # This will:
    #  1. checkout a new branch stash-XXX
    #  2. commit the current changes in that branch
    #  3. push the branch to the remote
    local locbr=${1:-autostash-XXX}
    git checkout -b $locbr
    git add .
    git commit -a -m "Automatically created commit"
    git push origin $locbr
    echo "Autocommitted changes in branch $locbr ..."
}

Как использовать:

commit_and_push_ my-temp-branch
commit_and_push_

просто используйте Dropbox, как это сделал этот парень. Таким образом, вам не нужно беспокоиться о том, чтобы толкать тайники, так как весь ваш код будет скопирован.

http://blog.sapegin.me/all/github-vs-dropbox