답변:
가져 오기 등을 통해 가져올 수 없으며 미러 참조 스펙은 fetch = +refs/*:refs/*
이며 숨김 상태이지만 refs/stash
전송되지 않습니다. 명시적인 refs/stash:refs/stash
것도 효과가 없습니다!
어쨌든 모든 스 태쉬를 가져 오지 않고 최신 스 태쉬 만 가져 오기 때문에 혼란 스럽습니다. 숨겨 놨다의 목록이입니다 reflog 심판의 refs/stashes
.
참고 : 방금 벨트 아래에 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
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
)
이것은 "[commit-commit]"commit 이전의 상태를 가리 키도록 HEAD를 재설정합니다.
git-reset (1)에서 : " --mixed
: 인덱스를 재설정하지만 작업 트리는 재설정하지 않습니다 (즉, 변경된 파일은 유지되지만 커밋으로 표시되지 않음) [...]"
따라서 결국 파일을 변경하지만 마스터를 커밋하지 않고 숨김이 필요하지 않습니다.
그러나 git reset --hard HEAD^
커밋은 가비지이므로 "[커밋하지 않은]"을 만든 리포지토리에 있어야합니다 .
조금 늦었지만이 답변이 누군가에게 도움이 될 수 있습니다. 나는 진행중인 기능 / 버그 / 무엇이든 푸시하고 다른 컴퓨터의 동일한 지점에서 작업하기를 원했기 때문에 이것을 알고 싶었습니다.
나를 위해 일하는 것은 진행중인 코드를 커밋하는 것입니다 (내가 혼자서 작업하는 지점에서). 다른 컴퓨터에 도착하면 당긴 다음 커밋을 실행 취소하십시오.
git reset --soft HEAD^
진행중인 모든 변경 사항이 커밋되지 않은 상태에서 진행중인 상태로 계속 작업하십시오.
도움이 되길 바랍니다.
이것을 해결하는 매우 깔끔한 트릭이있는 것 같습니다. 을 사용 git diff > file.diff
하고 파일을 커밋 한 다음 git apply file.diff
어디서나 사용하여 변경 사항을 복원 하여 동일한 결과를 얻을 수 있습니다.
왜 당신이 그것을 마스터 / 피처 브랜치에 커밋 할 수 없는지 모르겠지만 두 번째 접근 방식으로 갈 것입니다. 체리 따기도 가능합니다.
AFAIK 스 태쉬의 모든 아이디어는 로컬 카펫 아래에 중요하지 않은 것을 숨기는 것 입니다. 아무도 당신이 가장 좋아하는 쓰레기에 대해 알아야합니다. ;-) 유일한 "그러나"는 다음과 같습니다. 그렇다면 scp
더 좋습니다.
현재 허용 대답은 기술적으로 정확, 당신은 직접 원격으로 모든 숨겨 놨다을 밀어 힘내에게 다음 다른 컴퓨터에서 해당 지역의 숨겨 놨다로 모든 것을 끌어 없습니다.
그리고 동안 현재 최고 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
여기에서 찾을 수 있습니다.
다음은 숨김에는 적용되지 않지만 작업 디렉토리의 커밋되지 않은 변경에는 적용되지 않습니다. 지점을 만들고 모든 현재 변경 사항을 자동 커밋하고 원격으로 푸시합니다.
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_
간단히 새 숨김 분기를 만들고 해당 분기가 필요하지 않을 때마다 제거합니다.
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
이 사람처럼 Dropbox를 사용하십시오. 이렇게하면 모든 코드가 백업되므로 스 태시 푸시에 대해 걱정할 필요가 없습니다.
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
것git stash apply some-remote/stash
. 그러나 오래된 스 태시는 가져 오기 할 수없는 참조 로그에 저장되어 있기 때문에 얻을 수 없습니다. stackoverflow.com/questions/2248680/…을