숨김을 다른 컴퓨터로 내보내기


296

숨김 변경 사항을 다른 컴퓨터로 내보내는 방법이 필요합니다.

Computer1에서 내가 한

$ git stash save feature

숨김 패치를 파일로 가져온 다음 다른 컴퓨터로 가져 오려고합니다.

$ git stash show -p > patch

이 명령은이 저장소가 복제 된 다른 컴퓨터로 이동할 수있는 파일을 제공하지만 문제는 다시 숨김 파일로 가져 오는 방법입니다.

감사


6
fyi git stash save는 이제 더 이상 사용되지 않습니다git stash push
Ewan

답변:


290

간단하게 실행하여 패치 파일을 적용 할 수 있습니다 (변경 사항을 아직 커밋하지 않고).

git apply patchfile

그런 다음 현재 작업 디렉토리에서 새 숨김을 만들 수 있습니다.

git stash

2
@Marcelo A : 들리지만 답변의 투표 번호 아래에있는 큰 확인 표시를 클릭하여 수락 된 답변을 표시하십시오. 그렇게하면 질문이 해결 된 것으로 표시됩니다.
찌르다

2
시스템은 질문을 한 시점으로부터 일정 시간 (15 분)이 경과 할 때까지 OP가 답변을 "수락 됨"으로 표시하게하지 않습니다.
Greg Hewgill

23
이 답변을 읽은 후 궁금한 점은 모든 숨김에서 특정 숨김을 선택하는 방법이었습니다. 이에 대한 대답은 여기에 있습니다 : stackoverflow.com/a/1910142/1148702 . 이 경우 git stash show "stash@{0}" -p > patchOP의 두 번째 쉘 명령 대신 다음과 같이했습니다.
Tim Camber

1
@ TimCamber 난 당신이 주위에 큰 따옴표가 필요하다고 생각하지 않습니다 stash@{0}..
ari gold

2
@arigold 사용중인 쉘에 따라 다릅니다. 예를 들어 PowerShell에서는 중괄호가 특별한 구문이므로 필요합니다.
찌르다

18

또는 다음을 사용하여 숨김 컴퓨터 (컴퓨터 1)에서 분기를 만들 수 있습니다.

git stash branch stashed_changes_branch

변경 사항을 커밋하십시오.

git commit -a

그런 다음 컴퓨터 2에서 원격으로 추가하십시오.

git remote add pc1 user@computer1:/path/to/repo

지금 당신은 사용하여 원격 정보를 검색 할 수 있습니다

git fetch pc1

이제 커밋을 원하는 방식으로 가져올 수 있습니다. 사용하여 자식 체리 - 선택 , 자식 REBASE 또는 같은 ... 당신이 방금 않았다처럼 보이게하려는 경우 당신이 무엇을 자식 숨긴 적용을 ; git cherry-pick --no-commit을 사용할 수 있습니다 .


computer1과 computer2를 직접 연결하지 않은 경우; 원격을 사용할 수 있습니다 (github 또는 이와 유사한 것) :

git push origin stashed_changes_branch

컴퓨터 2 :

git fetch

1
이것은 소스 시스템 (computer1)이 외부 연결을 수신하기 위해 개방되어 있으며 여기에 착륙하는 대부분의 사람들에게는 사실이 아닐 것입니다. 지점 경로로 가고 싶다면 임시 지점을 원격 원점으로 푸시하고 computer2에서 가져 오십시오. 원격 지점을 유지하지 않으려면 당기면 즉시 원격 지점을 삭제할 수 있습니다. git의 브랜치는 너무 저렴하여 일반적으로 사용하지 않는 이유는 거의 없습니다.
불가분 한

@indivisible 오늘 인터넷에 두 대의 컴퓨터를 연결할 수있는 기회가 많다는 것에 동의하지 않습니다. 답변에 설명 된 기술은 진행중인 작업을 랩톱에서 LAN의 데스크톱으로 전송하는 데 유용 할 수 있습니다. Hamachi와 같은 가상 VPN 서비스조차도 git을 실행하는 컴퓨터간에 인터넷을 통해 파일을 전송하는 데 사용됩니다.
steampowered

1
@ steampowered, 일부 사람들 / 상황에 맞을 수도 있지만이 솔루션이 작동하기가 어렵고 들어오는 트래픽을 수락하도록 로컬 환경 / 시스템을 수정하는 것이 사소한 구성이 아니기 때문에 미래 독자에게 주목할 가치가 있다고 생각했습니다. 제 생각에는 이와 같은 작업에 대해 "과잉"입니다. 시스템이 이미 열려 있다면 반드시이 답변을 사용하십시오. 정확하지 않습니다. 나는 여기에 착륙하는 대다수의 사용자가 그런 상황에 처하지 않을 것이라고 생각합니다.
불가분 한

스 태시는 커밋 객체이므로 이미 커밋 해시를 가지고 있으므로 () 참조 git stash list --oneline하면 기술적으로 스 태쉬를 새로운 커밋 객체에 적용 할 필요가 없습니다. 다시 말해, 새로운 브랜치를 생성 할 필요가 없습니다. 그러나 스 태쉬를 리모콘에 직접 밀어 넣는 것은 가장 까다 롭습니다.
Tyler Crompton

15

또는 다음과 같이 전체 로컬 스 태쉬를 다른 compter로 내보낼 수 있습니다

  • git pull 이전 및 새 git 디렉토리 모두에서 최신 변경 사항이 있는지 확인하십시오.
  • 이전 git 디렉토리에서 새 저장소로 .git 폴더를 복사하십시오.

1
.git의 압축 tar가 700M + 이었지만, 특히 여러 스 태쉬가 있기 때문에 다른 제안 된 솔루션보다 훨씬 쉬운 것으로 판명되었습니다.
Chris Warth

5

SourceTree에서 Stash를 내보내는 방법 :

  1. Stash를 사용할 지점에서 새 지점 "StashTransfer"를 작성하십시오.
  2. 그것에 숨김을 적용하고 커밋

  3. 커밋을 클릭하고 패치를 작성하고 패치 파일을 가져 가십시오.

  4. 다른 저장소로 이동하여 방금 사용한 것과 동일한 상위 브랜치를 선택하십시오. 1)

  5. 작업 / 패치 적용, 모드 : 작업 복사본 파일 수정을 선택하고 패치 적용을 누르면 현재 작업 환경의 패치에서 커밋되지 않은 수정 사항이 있습니다.

  6. 현재 리포지토리에 대한 새로운 보관함 만들기


4

한 시스템에서 패치 파일로 숨김을 생성 한 다음 해당 패치 파일을 다른 시스템과 공유 할 수 있습니다.

숨김을 패치로 작성

$ git stash show "stash@{0}" -p > changes.patch

"stash @ {0}"은 숨김의 참조이며 최신 숨김으로 패치 파일을 작성합니다. 다른 명령 $ git stash list을 사용 하려면 스 태쉬 목록을보고 패치 할 패치를 선택하십시오.

패치 적용

이제 해당 숨김을 다른 시스템으로 전송하여 프로젝트의 루트 폴더에 붙여 넣습니다. 그런 다음이 명령을 실행하십시오.

$ git apply changes.patch

실수가 있고 변경을 취소하려는 경우

$ git apply changes.patch --reverse

3

다른 옵션은 한 컴퓨터에서 다른 컴퓨터 로 rsync.git폴더입니다. rsync파일 변경 만 처리합니다 (사본보다 빠름).

이 접근 방식의 한 가지 단점은 구성을 덮어 쓰는 것입니다. 두 시스템간에 서로 다른 .git 구성을 실행하는 경우 바람직하지 않을 수 있습니다. 그러나의 --exclude옵션으로 파일을 제외하면이를 극복 할 수 rsync있습니다.

전반적으로 네이티브 Git 솔루션이 더 깨끗하다고 ​​생각하지만이 rsync해킹은 git보다 rsync에 더 익숙한 서둘러 누군가에게 좋을 수 있습니다.


3

원래 게시물의 시작 명령 :

git stash show -p stash@{x} > patch_file

나를 위해 작동하지 않았습니다 (어떤 이유로 사용할 수없는 패치 파일을 만들었습니다). 대신 나는해야했다 :

git stash apply stash@{x}
git commit

내가 숨기고 싶은 각 은신처마다. 그런 다음 '부모'저장소를 '자식'저장소의 file : /// 도달 범위 내에 배치하고 각 숨김 커밋에 대해 다음을 수행했습니다.

git fetch file:///path_to_parent_git && git cherry-pick commit_sha
git reset --soft HEAD^
git stash save my_new_stash_on_child

이것은 더 복잡하지만 나를 위해 속임수를 사용했습니다.


0

한 컴퓨터에서 다른 컴퓨터로 변경 사항을 이동하려면 항상 컴퓨터에서 변경 사항을 커밋 한 다음 컴퓨터에서 소프트 리셋을 수행하십시오.

사무실

git commit -m "-stash-"

부엌

git reset --soft HEAD~1


0

스 태시는 기본 커밋과 인덱스 사이의 작업 트리의 특수 병합 커밋입니다. 한 가지 방법은 각각을 별도의 패치로 저장하고, 숨김 첫 번째 상위를 체크 아웃하고, 두 패치에서 인덱스와 작업 트리를 복원 한 다음, 숨김을 복원하는 것입니다 (하나의 답변이 이런 식으로 진행되는 것처럼 보입니다).

이것은 숨김에서 모든 정보를 완전히 재생성하는 데 필요하며, 걱정하지 않을 경우 충돌을 피하고 숨김이 생성 된 위치를 추적하기 위해 복원하기 전에 숨김의 첫 번째 부모를 최소한 체크 아웃해야합니다.

이것이 한 저장소에서 다른 저장소로 모든 숨김을 완전히 복원하기 위해 수행 한 작업입니다. 동일한 컴퓨터에 태그를 보유 할 수없는 경우 숨김 태그를 작성한 후 번들에 저장하고 참조 목록 및 번들을 대상 컴퓨터에 복사 할 수 있습니다.

원래 저장소의 루트에서 :

  1. 숨김 참조 목록 가져 오기
  2. 숨김 참조에 태그를 지정하여 git fetch로 검색 할 수 있습니다 (태그 이름은 문제가되지 않으며 충돌이 있으면 변경하십시오. stash_논리 숨김 참조의 숫자 + 사용 )
  3. 논리적 참조 를 역순 으로 sha1 해시 변환 -나중에 사용합니다
  4. 해당 리포지토리 경로 저장-나중에도
refs=$(git stash list|cut -d: -f1)
for ref in $refs; do tag stash_${ref//[^0-9]} $ref; done
refs=$(git rev-parse $refs|tac)
oldpath=$PWD

주의 : 이것은 bash 또는 호환 쉘이 필요합니다 (ksh, zsh should do ...) stash_$((i++))쉘이 지원하지 않는 경우 변수를 증가시킬 수도 있습니다${param//pattern}

이제 새로운 레포에서 각 심판에 대해 :

  1. 이전 리포지토리에서 참조를 가져옵니다 (태그 이름을 사용하기 때문에 태그 이름을 사용할 필요조차 없습니다 .git fetch로 가져올 수 있습니다)
  2. 심판의 메시지를 숨김 메시지로 사용하여 심판에서 숨김을 다시 가져옵니다.
for ref in $refs; do git fetch $oldpath $ref; git stash store -m "$(git show -s --pretty=%s $ref)" $ref; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.