하나의 명령으로 모든 자식 리모컨을 푸시 할 수 있습니까?


답변:


253

모든 분기를 모든 리모컨에 밀어 넣으려면 :

git remote | xargs -L1 git push --all

또는 특정 분기를 모든 리모컨에 푸시하려는 경우 :

master푸시하려는 브랜치로 교체하십시오 .

git remote | xargs -L1 -I R git push R master

(Bonus) 명령에 자식 별칭을 만들려면 :

git config --global alias.pushall '!git remote | xargs -L1 git push --all'

실행 git pushall하면 이제 모든 분기가 모든 리모컨으로 푸시됩니다.


1
아주 좋고 간단한 해결책. BTW에서는 -L 1 대신 xargs -l을 사용할 수 있으며 -l 옵션은 -L 1과 동일합니다. 또한 때로는 git push에 --all을 추가합니다. 자식 원격 | xargs -l git push --all
Tony

2
내가 얻을 xargs: illegal option -- lOSX에. 그것을 알아 git remote | xargs -L1 git push
차렸다

4
힘내 당신이 그 명령을 사용자 정의 명령으로 만들 수 있습니다. 1) 경로에있는 파일에 2) 실행 권한이 있으며 3) "git- [custom name]"(예 : git-foo, git-push-all)이라는 파일에 넣으면됩니다. 단순히 "git [custom name]"을 입력 할 수 있습니다 (예 : git foo, git push-all).
Andrew Martin

2
@Tony 우분투에서는 man xargs옵션 -l이 POISX 사양에 없기 때문에 더 이상 사용되지 않는다고 말합니다 .
wjandrea

2
@kyb git alias 구문 !에서 다음은 내부 git 명령이 아니라 외부 셸 명령입니다.
약화

285

all이름에 여러 개의 리포 URL을 가진 리모트를 작성하십시오 .

git remote add all origin-host:path/proj.git
git remote set-url --add all nodester-host:path/proj.git
git remote set-url --add all duostack-host:path/proj.git

그럼 그냥 git push all --all.


이것이 어떻게 보이는지입니다 .git/config:

  [remote "all"]
  url = origin-host:path/proj.git
  url = nodester-host:path/proj.git
  url = duostack-host:path/proj.git

5
슈퍼 멋진 트릭! 유일한 단점은 원격 헤드를 움직이지 않는다는 것입니다. git fetch --all그런 푸시를 한 직후 에 달려야 합니다.
madhead

8
Mr. Torvalds (Git의 제작자)는이 방법을 사용한다고 언급했지만이 방법은 단지 편의상 기술적 인 이점이 없다고 말합니다. marc.info/?l=git&m=116231242118202&w=2 "그리고 결국" 여러 저장소로 푸시하는 git push all "은 실제로 각 저장소마다 한 번 연결되므로 실제로는 여러 개의"git push "를 수행하는 데 도움이됩니다. 실제 기술적 인 이점은 없으며 편의성도 있습니다."
Matt

14
이 접근 방식의 한 가지 문제점 all은 사용 가능한 새 URL을 리모트 에 추가해야 하지만 git remote | xargs -L1 git push --all새 리모트는 자동으로 선택한다는 것입니다.
Raffi Khatchadourian

2
팁 : all커밋을 보낼 때마다 타이핑을하지 않으려면 "all"대신 "origin"을 사용하십시오.git remote set-url --add origin nodester-host:path/proj.git
Macabeus

푸시 URL을 설정 git push하지 않으면 그렇지 않으면 모든 URL이 업데이트되지 않습니다. 이에 따라 답변이 업데이트 됨
user3338098 2016

88

항상 repo1, repo2 및 repo3으로 푸시하고 있지만 항상 repo1에서만 가져 오려면 원격 'origin'을 다음과 같이 설정하십시오.

[remote "origin"]
    url = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo2
    pushurl = https://exampleuser@example.com/path/to/repo3
    fetch = +refs/heads/*:refs/remotes/origin/*

명령 행에서 구성하십시오.

$ git remote add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo2
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo3

특정 지점 에서만 가져 오고 특정 분기로repo1 푸시 하려는 경우 :repo1repo2 specialBranch

[remote "origin"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[remote "specialRemote"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[branch "specialBranch"]
    remote = origin
    pushRemote = specialRemote
    ...

https://git-scm.com/docs/git-config#git-config-branchltnamegtremote를 참조 하십시오 .


4
왜 이것이 더 많은 표를 얻지 못했는지 모르겠습니다. 이것은 git push인수없이 그냥 할 수 있기 때문에 실제로 정말 편리합니다 .
Husky

1
제발 투표 해주세요!
Meng Lu

1
이것은 나를 위해 더 적절한 방법으로 보입니다. 가장 높은 표를 받았을 것입니다.
Ahmad

매우 유용합니다. pushurl을 마스터 브랜치로만 제한 할 수 있습니까?
fbucek

17

.git / config 파일을 편집하는 대신 CLI를 사용하여 다음 명령을 사용할 수 있습니다.

# git remote add all origin-host:path/proj.git
# git remote set-url --add all nodester-host:path/proj.git
# git remote set-url --add all duostack-host:path/proj.git

같은 git push all --all뿐만 아니라 여기에 작동합니다.

답변 # 1과 같은 결과를 얻었습니다. 구성 파일의 원시 편집 대신 명령 행을 사용하여 방금 완료했습니다.


2

한 번의 호출로 많은 리모컨을 푸시하는 짧은 bash 함수를 작성했습니다. 단일 리모컨을 매개 변수로 지정하거나 여러 리모컨을 공백으로 구분하거나 모든 리모컨에 푸시하도록 지정할 수는 없습니다.

.bashrc 또는 .bash_profile에 추가 할 수 있습니다.

function GitPush {
  REMOTES=$@

  # If no remotes were passed in, push to all remotes.
  if [[ -z "$REMOTES" ]]; then
    REM=`git remote`

    # Break the remotes into an array
    REMOTES=$(echo $REM | tr " " "\n")
  fi

  # Iterate through the array, pushing to each remote
  for R in $REMOTES; do
    echo "Pushing to $R..."
    git push $R
  done
}

예 : 리포지토리에 3 개의 리모컨 (rem1, rem2 및 rem3)이 있다고 가정합니다.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

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