여러 원격 위치에서 풀 / 푸시


743

짧은 : git repo가 ​​원격 저장소 목록 (단일 "원본"이 아닌)에서 푸시하고 가져 오는 방법이 있습니까?

길다 : 연결이 다른 여러 컴퓨터에서 앱을 개발할 때 종종 상황이 발생합니다. 전송중인 노트북, 특정 위치에있을 때는 컴퓨터 "A", 다른 컴퓨터는 "B" 다른 동안. 또한 랩톱은 "A"또는 "B"중 하나만 연결하고 때로는 둘 다와 연결할 수 있습니다.

내가 원하는 것은 git이 현재 연결할 수있는 모든 컴퓨터에서 항상 "풀"하고 "푸시"하는 것이므로 한 컴퓨터에서 다른 컴퓨터로 쉽게 건너 뛰고 원활하게 작업을 계속할 수 있습니다.


39
2016 년 현재 신규 방문자 참고 사항 : 일류 git기능으로 승인 된 현재 올바른 방법 은 아래malvineous답변에 포함되어 있습니다 . 수락 된 답변이 잘못되었습니다.
ELLIOTTCABLE

@ Zorzella : 당신은 이것에 대해 받아 들여진 대답을 업데이트 할 수 있습니까, 그것은 현재의 방식과 다소 혼란 스럽습니다.
ntninja

답변:


503

다음 git remote명령을 사용하여 여러 원격 저장소를 구성 할 수 있습니다 .

git remote add alt alt-machine:/path/to/repo

구성된 모든 원격에서 가져오고 추적 분기를 업데이트하지만에 병합하지 않으려면 다음 HEAD을 수행하십시오.

git remote update

현재 리모컨 중 하나에 연결되어 있지 않으면 시간이 초과되거나 오류가 발생하고 다음으로 넘어갑니다. 가져온 리포지토리에서 또는를 cherry-pick수집 변경 사항 구성 방법에 따라 수동으로 병합해야합니다 .

alt에서 마스터 브랜치를 가져와 현재 헤드로 가져 오려면 다음을 수행하십시오.

git pull alt master

실제로 실제로 git pull는 줄임말입니다 git pull origin HEAD(실제로 구성 파일에서이를 확인하지만 아이디어를 얻습니다).

업데이트를 푸시하려면 각 리포지토리에 수동으로 업데이트해야합니다.
제 생각에 중앙 리포지토리 워크 플로를 염두에두고 설계되었습니다.


그래서 당신이 말하는 것은 "git remote add foo ssh : //foo.bar/baz"는 속기 형식을 만들지 만 여전히 "git pull"로 루프하거나 "git pull"로 루프해야합니다. merge "("git remove update "이후의 구문은 무엇입니까?)이 속기 이름도"git push "에 적용되지 않습니까? 즉, "git push foo"등 (루프)을 할 수 없습니까? 감사합니다
Zorzella는

8
"git pull"은 기본적으로 "git fetch"다음에 "git merge"입니다. "git remote update"는 많은 "git fetch"호출을 수행합니다. 남아있는 것은 "git merge"비트를하는 것입니다. "git merge origin / master"라고 말하면 origin의 master 버전이 현재 HEAD에 병합됩니다. "git pull origin master"는 동일한 작업을 수행하지만 먼저 가져 오기를 수행합니다 (git remote update를 이미 수행 한 경우 더 이상 가져올 항목이 없으므로 중복됩니다). 예, "git push foo"라고 말하면 일치하는 모든 분기를 "foo"라는 원격으로 푸시합니다.
araqnid

IIUC는 작업 저장소에 넣을 수 없습니다 (결국 호환되지 않거나 예상치 못한 / 원하지 않는 변경 사항을 푸시 할 수 있음). 베어 리포지토리로 푸시해야하며 끌어 올 때만 업데이트를받습니다. 따라서 솔루션에는 각 머신마다 작동하는 저장소가 필요합니까?
joeytwiddle

2
분명히 당신은 또한 여러 repos에 대한 하나의 푸시를 가질 수 있습니다, 자세한 내용은이 답변을 확인 stackoverflow.com/questions/14290113/…
manei_cc

797

최신 버전에서는 이 작업을 더 이상 수동으로 수행 할 필요가 없습니다git ! 아래의 Malvineous 솔루션을 참조하십시오 .

여기에서 재현 :

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

원래 답변 :

이것은 내가 나쁜 결과없이 꽤 오랫동안 사용하고 git 메일 링리스트 에서 Linus Torvalds가 제안한 것 입니다.

araqnid 의 솔루션은 코드 저장소 가져 오는 데 적합한 솔루션입니다 .하지만 나와 같은 권한을 가진 여러 개의 업스트림을 보유한 경우 (중요한 프로젝트 중 일부는 개인 업스트림, GitHub 및 Codaset에 복제됩니다) 매일 변경 사항을 푸시해야하는 고통이 될 수 있습니다.

간단히 말해서, git remote add모든 리모컨을 개별적으로 ... 그리고 git config -e병합 된 원격을 추가하십시오. 이 저장소가 있다고 가정합니다 config.

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

"Paws""Codaset"에 대한 병합 된 원격을 생성하기 위해 모든 다음에 다음을 추가 할 수 있습니다.

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

나는이 때이를 수행하면 git push Origin Master, 그것은 모두 밀어 버린다 Paws/MasterCodaset/Master좀 더 쉽게 생활을 순차적으로.


104
git config -e.git/config선호하는 편집기에서 파일을 엽니 다 .
Richard

3
만일을 위해서. URL이 2 개인 리모컨이 여전히 1.7.12.4에서 작동하는지 확인 감사.
foobar

26
나는 원격 "기원" "모든"을 제공하기 위해 약간 청소기 의미 이름
ErichBSchulz

1
@JamesWomack 아래 @Malvineous의 답변을 참조하십시오. git의 명령 줄에서이 기능을 기본적으로 지원하므로 이제 "보다 정확합니다" git remote set-url ... --add.
ELLIOTTCABLE

1
아래 [branch "Master"]설정 remote = Origingit pull모두 리모컨을 사용합니다.
Bengt

264

git 1.8 (2012 년 10 월)부터는 명령 행에서이를 수행 할 수 있습니다.

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

그런 다음 git pushuser1 @ repo1로 푸시 한 다음 user2 @ repo2로 푸시합니다.


19
이 솔루션을 강력히 권장합니다. 우리는 그것을 회사에서 사용했으며 하나의 저장소에서 실패한 후크로 심각한 문제를 겪었지만 다른 저장소에서는 실패했습니다. 그런 다음 변경 세트는 하나의 저장소에만 존재했습니다.
Michael Schmeißer 2016 년

4
@ MichaelSchmeißer : 아마도 밀어 넣을 때 오류 메시지를보고 문제를 해결 한 다음 다시 밀어 모든 것을 깨끗한 상태로 되돌릴 수 있습니까?
Malvineous 2016 년

7
문제는 거부 된 푸시를 수정하면 이미 다른 리포지토리로 푸시 된 커밋을 변경하는 것입니다. 따라서 누군가가 이미 고칠 때까지 커밋을 기반으로 작업을 수행했다면 상황이 정말 불쾌 해집니다.
Michael Schmeißer 2016 년

9
아 네, 까다로울 수 있습니다. 그러나 나에게는 후크를 다시 디자인 해야하는 것처럼 보입니다. 실패한 푸시는 git을 정상적으로 중단시키지 않으므로 새로운 실패 지점을 도입하는 것도 좋은 해결책이 아닙니다. 물론 나는 당신의 요구 사항이 무엇인지 모른 채 이것을 말합니다 ...
Malvineous

3
아니요. 내 질문을 작성한 후 다른 웹 게시물을 읽은 다음이 내용을 테스트했습니다. 다른 게시물을 읽음으로써 첫 번째 줄만 사용된다는 의혹을 얻었습니다. 방금 이것을 테스트했습니다. 실제로 첫 번째 줄의 URL 만 검사됩니다 git fetch. (이것으로, 나는 그것의 목적 git remote set-url --add이 없이는 무엇인지 이해할 수 없다 --push.)
imz-Ivan Zakharyaschev

34

~ / .bashrc에 다음 별칭을 추가했습니다.

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

6
대단해! : 나는 망할 놈의 별명을 가진 결국 git config alias.pushall '!for i in 원격 자식을; do git push $i; done;'
치로 틸리冠状病毒审查六四事件法轮功

새 리모컨을 만드는 것보다 별칭 솔루션을 선호한다고 생각합니다. 참조 stackoverflow.com/questions/41372919/...
donquixote

1
작은 제안 조정 :alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'
Scott C Wilson

25

다음을 사용하여 리모컨을 추가 할 수 있습니다.

git remote add a urla
git remote add b urlb

그런 다음 모든 저장소를 업데이트하려면 다음을 수행하십시오.

git remote update

15

다음은 .gitconfig별칭 섹션 안에 bash 스크립트가있는 예입니다.

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

7

.git congfig 파일의 원격 "origin"에 두 개의 별도 pushurl을 추가했습니다. 내가 실행하면 git push origin "branchName"다음 URL이 통과하고 각 URL로 푸시됩니다. 더 쉬운 방법이 있는지 확실하지 않지만 Github 소스 코드로 푸시하고 My.visualStudio 소스 코드로 동시에 푸시하는 것이 좋습니다.

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

4

나는 nona-urbiz 의 답변 을 넓히기 위해 자유를 얻었습니다. ~ / .bashrc에 이것을 추가하십시오 :

git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }    
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

용법:

git-pullall master

git-pushall master ## or
git-pushall

git-pullall에 분기 인수를 제공하지 않으면 기본이 아닌 리모컨에서 가져 오기가 실패합니다. git와 비슷하기 때문에이 동작을 그대로 두었습니다.


3

그것들을 반복하려면 스크립트가 필요합니다. 힘내는 "모두 푸시"를 제공하지 않습니다. 이론적으로 여러 스레드를 푸시 할 수는 있지만 기본 방법은 사용할 수 없습니다.

가져 오기는 훨씬 더 복잡하므로 선형으로 수행하는 것이 좋습니다.

가장 좋은 대답은 가능한 한 모든 사람이 밀고 당기는 기계를 한 번 만드는 것입니다.


2
문제는 내가 설명한 것처럼 항상 사용 가능한 중앙 상자가 없다는 것입니다. 루핑 된 bash 스크립트를 작성해야한다면, 분산 VC가 더 이상 여기에 도움이되지 않을 것 같습니다.
Zorzella

2
분산되어 있기 때문에 모든 사람이 가용하거나 추진되고 싶지는 않다고 가정합니다. 또한 다른 상태의 다른 저장소 및 다른 사람들이 동시에 작업하고 있다는 가정과 관련이 있습니다. 리포지토리 세트에서 밀고 당기는 순서는 다른 리포지토리의 상태에 영향을 미치며 여러 패스를 만들어서 모두 동기화해야합니다. 이것이 "풀 / 푸시"가없는 이유입니다. 그렇다면 갈등이 있습니다 ...;)
Jeff Ferland

3

리모컨 (예 : pull케이스)을 업데이트하기 가 더 쉬워졌습니다.

리누스의 진술

슬프게도, git alias로 이것을 가짜로 만드는 방법조차 없습니다.

상기 참조 항목에 망할 놈의 메일 링리스트 에서 의 elliottcable 대답은 더 이상 사실입니다.

git fetch--all한 번에 모든 리모컨을 가져올 수 있도록 과거 어딘가에서 매개 변수를 배웠습니다 .

모든 것이 요청되지 않은 경우, --multiple여러 리모트 또는 그룹을 지정하기 위해 스위치를 사용할 수 있습니다 .


3

VSO / TFS에서 작업 한 다음 준비가되면 공개적으로 GitHub에 푸시하고 싶었습니다. 개인 VSO에서 생성 된 초기 리포지토리. GitHub에 추가 할 때가되었습니다 :

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master

챔피언처럼 일했다 ...

상태 점검의 경우 "git remote -v"를 발행하여 프로젝트와 연관된 저장소를 나열하십시오.

C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v
githubrepo      https://github.com/jhealy/kinect2.git (fetch)
githubrepo      https://github.com/jhealy/kinect2.git (push)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)

간단한 방법으로 저를 위해 일했습니다 ... 이것이 누군가를 돕기를 바랍니다.


4
git push -f실패한 git push것이나 정확히 무엇을하고 있는지 알 수 없는 이유없이 달리는 것은 잠재적으로 해로운 아이디어입니다. 이것은 또한 질문에 대답하지 않지만 두 번째 리모컨을 추가하는 방법입니다.
Karl Richter

2

아래 명령으로 전역 gitconfig (/home/user/.gitconfig)에 별칭을 추가하십시오.

git config --global alias.pushall '!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f'

코드를 커밋하면

자식 푸시

기본적으로 원점으로 푸시합니다. 위의 별칭 뒤에는 말할 수 있습니다.

자식 푸시

코드는 오리진 리모컨을 포함한 모든 리모컨으로 업데이트됩니다.


1

all리모컨을 추가 하면 사용하는 각 컴퓨터에서 설정해야하므로 약간 지루합니다.

또한 제공된 bashgit 별명 은 모두 모든 리모컨으로 푸시한다고 가정합니다 . (예 : sshagGitHub 및 GitLab에서 유지 관리 하는 포크가 있습니다. 업스트림 리모컨이 추가되어 있지만 푸시 권한이 없습니다.)

다음 은를 포함하는 푸시 URL을 사용하여 리모컨에만 푸시 하는 git 별칭 입니다 @.

psall    = "!f() { \
    for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
    git push $R $1; \
    done \
    }; f"

-3

새로운 리모컨 추가

git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv

여러 위치 가져 오기 양식

git fetch --all

위치로 푸시

git push -u upstream/dev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.