Можно ли нажимать git stash на удаленный репозиторий?

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

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

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

Ответ 1

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

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

Ответ 2

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

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


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

Предположим, что источник находится в ~/OLDREPO, содержащем stashes. Создайте клон TEST, не содержащий штампов:

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 [email protected]{1})"
done

Очистите свои временные ветки, если вы

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

Сделайте список git, и вы сделаете следующее:

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

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

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

Ответ 3

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

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

  • Сделать фиксацию с сообщением фиксации например "[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, чтобы указать на состояние до того, как "[не совершить]" совершить.

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

Итак, у вас будут изменения в файлах в конце, но никаких коммитов не будет сделано для мастеринга и нет необходимости в тире.

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

Ответ 4

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

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

git reset --soft HEAD^

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

Надеюсь, что это поможет.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Это было объяснено здесь.

Ответ 8

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

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_

Ответ 9

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

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