git stash를 원격 저장소로 푸시 할 수 있습니까?


205

자식에서 숨김을 생성하고, 원격 저장소로 숨김을 푸시하고, 다른 컴퓨터에서 숨김을 검색하고, 숨김을 적용 할 수 있습니까?

또는 내 옵션은 다음과 같습니다.

  • 패치를 작성하고 다른 컴퓨터에 패치를 복사하십시오. 또는
  • 부 지점을 만들고 해당 지점에 불완전한 작업을 수행 하시겠습니까?

답변:


68

가져 오기 등을 통해 가져올 수 없으며 미러 참조 스펙은 fetch = +refs/*:refs/*이며 숨김 상태이지만 refs/stash전송되지 않습니다. 명시적인 refs/stash:refs/stash것도 효과가 없습니다!

어쨌든 모든 스 태쉬를 가져 오지 않고 최신 스 태쉬 만 가져 오기 때문에 혼란 스럽습니다. 숨겨 놨다의 목록이입니다 reflog 심판의 refs/stashes.


4
git remote에서 최신 스 태쉬를 가져올 수 있지만 스태 쉬는 아닌 다른 참조로 가져올 수 있습니다. 같은 git fetch some-remote +refs/stash:refs/remotes/some-remote/stashgit stash apply some-remote/stash. 그러나 오래된 스 태시는 가져 오기 할 수없는 참조 로그에 저장되어 있기 때문에 얻을 수 없습니다. stackoverflow.com/questions/2248680/…을
sj26

75

참고 : 방금 벨트 아래에 24 시간 더 많은 git-fu 로이 답변을 다시 작성했습니다. 그러나 귀하의 편의를 위해 압축하지 않았습니다.

이런 식으로, 나는 당신이 맹목적으로 복사 / 붙여 넣기 대신에 내가 한 일들을 어떻게 볼 수 있기를 바랍니다.


여기 단계적으로 있습니다.

~ / 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_)

자식 숨김 목록을 작성하면 다음과 같이됩니다.

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

1
나는 짧은 시간에 많은 것을 배우고 있으며, 이전의 접근 방식에서 단순히 많은 명령 사용법을 사용해야한다고 생각합니다. 나중에 시도 할 것입니다.
sehe

9
새 파일이 준비되지 않은 경우 새 파일을 숨기지 않기 때문에 단계 git add .이전에 필요한 것을 제외하고는 잘 작동했습니다 . 또한 관통 결과를 파이프하면 스 태쉬의 순서가 반대로되어 동일한 순서로 나옵니다. git stash save ...git stashgit rev-list ...tac
Alan Krueger

1
@sehe 우수한 스크립트 !! 두 가지 제안 : 1)-마지막 레포지토리에서 원본과 동일한 순서로 스테이시가되도록 최종 레퍼리-리스트를 반대로합니다. 2) (스 태쉬가 생성 될 때 정리 )로 최종 for루프를 종료 하여 git branch -D stash_$a문제가 발생하여 재 시도하면 이미 커밋 된 커밋을 다시 처리하지 않습니다.
키이스 로버트슨

1
"솔루션 게시"대신 시간을내어 설명해 주셔서 감사합니다.
Marjan Venema

1
이 솔루션은 더욱 향상 될 수있다 : 당신이 교체하는 경우 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무대 뒤에서).
Sebastian Schrader

31

나는 파티에 조금 늦었지만, 나는 이것에 관해 나에게 도움이되는 것을 발견했다고 믿으며, 귀하의 상황이 같거나 비슷한 경우에도 당신에게도 도움이 될 수 있습니다.

자체 지사에서 기능을 작성 중입니다. 지점은 마스터로 합병되지 않고 완료 될 때까지 푸시되거나 대중에게 편안하게 보여줄 수 있다고 커밋했습니다. 따라서 비 단계적 변경 사항을 다른 컴퓨터로 전송하려고 할 때 수행하는 작업은 다음과 같습니다.

  • " [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)

    이것은 "[commit-commit]"commit 이전의 상태를 가리 키도록 HEAD를 재설정합니다.

git-reset (1)에서 : " --mixed: 인덱스를 재설정하지만 작업 트리는 재설정하지 않습니다 (즉, 변경된 파일은 유지되지만 커밋으로 표시되지 않음) [...]"

따라서 결국 파일을 변경하지만 마스터를 커밋하지 않고 숨김이 필요하지 않습니다.

그러나 git reset --hard HEAD^커밋은 가비지이므로 "[커밋하지 않은]"을 만든 리포지토리에 있어야합니다 .


이것은 매우
더러워서

@Taegost는 내가 생각하는 환경에 달려 있습니다. CI / CD에 일부 영향을 미쳐 브랜치를 업스트림으로 밀지 못하게 할 수 있습니다. 그러나 네, 선호하는 것에 따라 같은 것을 달성하기 위해 지점을 만들려고 할 수도 있습니다.
Victor Zamanian

22

조금 늦었지만이 답변이 누군가에게 도움이 될 수 있습니다. 나는 진행중인 기능 / 버그 / 무엇이든 푸시하고 다른 컴퓨터의 동일한 지점에서 작업하기를 원했기 때문에 이것을 알고 싶었습니다.

나를 위해 일하는 것은 진행중인 코드를 커밋하는 것입니다 (내가 혼자서 작업하는 지점에서). 다른 컴퓨터에 도착하면 당긴 다음 커밋을 실행 취소하십시오.

git reset --soft HEAD^

진행중인 모든 변경 사항이 커밋되지 않은 상태에서 진행중인 상태로 계속 작업하십시오.

도움이 되길 바랍니다.


이 작업을 시도 할 때 Origin은 커밋되지 않은 커밋을 계속 유지합니다. 닫지 만 시가는 없습니다.
rezwits

@ rezwits 그래, 리모컨은 그것을 유지하지만, 임시 지점을 원점에서 간단하게 삭제하는 것은 쉽습니다.
Sir Robert

사실 그것은 내가 한 일입니다!
rezwits

19

이것을 해결하는 매우 깔끔한 트릭이있는 것 같습니다. 을 사용 git diff > file.diff하고 파일을 커밋 한 다음 git apply file.diff어디서나 사용하여 변경 사항을 복원 하여 동일한 결과를 얻을 수 있습니다.

이것도 여기 에 설명 되었습니다 .


5
추적되지 않은 파일이있는 경우 : 1. git add. 2. git diff HEAD> file.diff
trickpatty

diff를 자신에게 메시지를 보내면 repo에 커밋 / 풋 프린트가 전혀 없습니다! (예 : Signal 데스크톱 앱을 통한 메모) 또는 이메일.
John Mee

9

왜 당신이 그것을 마스터 / 피처 브랜치에 커밋 할 수 없는지 모르겠지만 두 번째 접근 방식으로 갈 것입니다. 체리 따기도 가능합니다.


27
"이것은 실제 커밋이 아니며 작업 내용을 저장하여 다른 컴퓨터로 가져올 수 있습니다"라고 말하고 싶을뿐입니다.
Andrew Grimm

4

AFAIK 스 태쉬의 모든 아이디어는 로컬 카펫 아래에 중요하지 않은 것을 숨기는 것 입니다. 아무도 당신이 가장 좋아하는 쓰레기에 대해 알아야합니다. ;-) 유일한 "그러나"는 다음과 같습니다. 그렇다면 scp더 좋습니다.


9
이 재밌는 것은 논평이되어야합니다. ;-)
앤드류 그림

2
여기 총 git-ssh-newbie이지만 github과 함께 scp를 사용할 수 있습니까?
Koen

아니요, github의 git-ssh 프론트 엔드는 프로그래밍되어 있으므로 ssh 쉘 / 콘솔이 없습니다. 서버 측 git 프로세스 만 실행할 수 있습니다.
argent_smith

1
마스터 브랜치가 github에있는 경우 scp는 실제로이 시나리오의 옵션이 아니십니까? 이 경우 숨김을 이전 할 다른 제안이 있습니까?
Koen

1
AFAIK는 숨김 전송이 전혀 불가능하다는 점을 강조하려고 노력했습니다.
argent_smith

2

현재 허용 대답은 기술적으로 정확, 당신은 직접 원격으로 모든 숨겨 놨다을 밀어 힘내에게 다음 다른 컴퓨터에서 해당 지역의 숨겨 놨다로 모든 것을 끌어 없습니다.

그리고 동안 현재 최고 upvoted 답이 작동해야 그것은 임시 가지의 무리를 생성하고, 수동으로 숨겨 놓은 커밋 체크 아웃과 같은 문제가 발생할 수있는 은닉,로 저장이 필요하다는처럼, 나는하지 않았다 이 댓글 언급하고 , 중복으로 이어집니다 On (no branch): On testing:. 더 좋은 방법이 있어야합니다!

따라서 숨김을 직접 푸시 할 수는 없지만 숨김은 커밋 (실제로 두 개의 커밋)이며 git push매뉴얼 페이지 당 커밋을 푸시 할 수 있습니다.

<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 .

창조하다
(객체를 커밋 정기적 인) 은닉을 만들고 심판 네임 스페이스에 어디를 저장하지 않고, 그 개체 이름을 반환합니다. 스크립트에 유용합니다. 사용하려는 명령이 아닐 수도 있습니다. 위의 "저장"을 참조하십시오.

저장
git stash create (매달린 병합 커밋)를 통해 생성 된 지정된 숨김을 숨김 참조에 저장하고 숨김 참조 로그를 업데이트합니다. 스크립트에 유용합니다. 사용하려는 명령이 아닐 수도 있습니다. 위의 "저장"을 참조하십시오.

이미 커밋을 했으므로 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>

이 방법은 또한 dem 등원이라는 이점이 있습니다. 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여기에서 찾을 수 있습니다.


1

다음은 숨김에는 적용되지 않지만 작업 디렉토리의 커밋되지 않은 변경에는 적용되지 않습니다. 지점을 만들고 모든 현재 변경 사항을 자동 커밋하고 원격으로 푸시합니다.

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_

0

간단히 새 숨김 분기를 만들고 해당 분기가 필요하지 않을 때마다 제거합니다.

git add . // Add work-in-progress job
git checkout -b stash-branch // Create and checkout to stash-branch
git commit -m 'WIP: job description' // Commit message
git push origin stash-branch // Push to remote
git pull origin stash-branch // Pull the stash-branch
git checkout master // Checkout to working branch
git rebase stash-branch // Rebase the stash-branch
git reset --soft // Equivalent to stash!!
git branch -d stash-branch // Delete when not needed from local
git push -d origin stash-branch // Delete when not needed from remote

-9

이 사람처럼 Dropbox를 사용하십시오. 이렇게하면 모든 코드가 백업되므로 스 태시 푸시에 대해 걱정할 필요가 없습니다.

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


2
누군가 무릎을 꿇고 반응하기 전에 Github 대신 Dropbox를 사용하는 것이 아니라 Dropbox에서 커밋 할 준비가되지 않은 코드를 로컬에서 여전히 버전 제어하에 저장하려고합니다.
NYC 기술 엔지니어

4
모든 프로젝트를 원격 클라우드로 복사하는 데 너무 많은 시간이 걸립니다.
Stav Alfi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.