สามารถผลักดันรีโมตคอมไพล์ทั้งหมดด้วยคำสั่งเดียวได้หรือไม่


195

แทนที่จะทำ:

git push origin --all && git push nodester --all && git push duostack --all

มีวิธีทำอย่างนั้นเพียงคำสั่งเดียว?

ขอบคุณ :)


1
ดูเพิ่มเติมที่: stackoverflow.com/q/5620525/223092
Mark Longair

หากต้องการสร้างallรีโมตเพื่อผลักดันรีโมตทั้งหมดของคุณโปรดดู: stackoverflow.com/a/18637593/802365
Édouard Lopez

คำตอบ:


253

หากต้องการผลักสาขาทั้งหมดไปยังรีโมททั้งหมด:

git remote | xargs -L1 git push --all

หรือถ้าคุณต้องการที่จะผลักดันสาขาที่เฉพาะเจาะจงเพื่อรีโมททั้งหมด:

แทนที่masterด้วยสาขาที่คุณต้องการผลักดัน

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

(โบนัส) เพื่อสร้างนามแฝงคอมไพล์สำหรับคำสั่ง:

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

การทำงานgit pushallจะผลักสาขาทั้งหมดไปยังรีโมททั้งหมด


1
ทางออกที่ดีมากและเรียบง่าย BTW คุณสามารถใช้ xargs -l แทน -L 1 ตัวเลือก -l เหมือนกับ -L 1 นอกจากนี้บางครั้งฉันก็เพิ่ม - ไปที่ git push ทั้งหมด git remote | xargs -l git push
Tony

2
ฉันxargs: illegal option -- lใช้ OSX ได้ คิดออกคุณจะต้องgit remote | xargs -L1 git push
balupton

4
Git ช่วยให้คุณสามารถโทรออกไปยังคำสั่งที่กำหนดเองได้ เพียงแค่ใส่ไว้ในไฟล์ที่ 1) อยู่บนเส้นทางของคุณ 2) คุณมีสิทธิ์ดำเนินการและ 3) เรียกว่า "git- [ชื่อที่กำหนดเอง]" (เช่น git-foo, git-push-all) และคุณจะ สามารถพิมพ์ "git [ชื่อที่กำหนดเอง]" (เช่น git foo, git push-all)
Andrew Martin

2
@Tony บน Ubuntu man xargsบอกว่าตัวเลือก-lถูกคัดออกเนื่องจากไม่ได้อยู่ในข้อมูลจำเพาะ POISX
wjandrea

2
@kyb ในไวยากรณ์นามแฝง git !หมายถึงสิ่งต่อไปนี้ไม่ใช่คำสั่ง git ภายใน แต่เป็นคำสั่งเชลล์ภายนอก
อ่อนตัว

285

สร้างallรีโมตที่มี repo 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ทันทีหลังจากกดปุ่มดังกล่าว
บ้า

8
Mr. Torvalds (ผู้สร้าง Git) กล่าวว่าเขาใช้วิธีการนี้ แต่เขากล่าวว่ามันเป็นเพียงเพื่อความสะดวกและไม่มีข้อได้เปรียบทางเทคนิคmarc.info/?l=git&m=116231242118202&w=2 และในท้ายที่สุดแม้แต่ git push all "ที่พุชไปยังหลาย ๆ repository จะจบลงด้วยการเชื่อมต่อเพียงครั้งเดียวสำหรับแต่ละ repository ดังนั้นมันจึงเป็นเพียงชวเลขสำหรับการทำ" git push "หลาย ๆ อันไม่มีประโยชน์ทางเทคนิค
แมตต์

14
ปัญหาอย่างหนึ่งของวิธีนี้คือคุณต้องเพิ่ม URL ใหม่ไปยังallรีโมตเมื่อพร้อมใช้งานในขณะที่git remote | xargs -L1 git push --allจะรับรีโมตใหม่โดยอัตโนมัติ
Raffi Khatchadourian

2
เคล็ดลับ: หากไม่ต้องการพิมพ์allเมื่อใดก็ตามที่คุณส่งคำสั่งซื้อให้ใช้ "ต้นทาง" แทน "ทั้งหมด":git remote set-url --add origin nodester-host:path/proj.git
Macabeus

ลืมที่จะตั้งค่าการผลัก URL มิฉะนั้นgit pushจะไม่อัปเดต URL ทั้งหมด คำตอบอัปเดตตามนั้น
user3338098

88

หากคุณต้องการผลักไปที่ repo1, repo2 และ repo3 เสมอ แต่ดึงจาก repo1 เท่านั้นให้ตั้งค่า 'ต้นกำเนิด' ระยะไกลเป็น

[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แต่ดันrepo1และrepo2 สาขาที่เฉพาะเจาะจง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โดยไม่มีข้อโต้แย้งใด ๆ
ฮัสกี้

1
ลงคะแนนให้ฉันได้โปรด!
Meng Lu

1
นี่เป็นวิธีที่เหมาะสมกว่าสำหรับฉันในการทำสิ่งนี้ ควรได้รับคะแนนโหวตสูงสุด
Ahmad

มันมีประโยชน์มาก เป็นไปได้ไหมที่จะ จำกัด pushurl ไว้ที่สาขาหลักเท่านั้น
fbucek

17

ในฐานะที่เป็นทางเลือก CLI สำหรับแก้ไขไฟล์. git / config คุณสามารถใช้คำสั่งต่อไปนี้:

# 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 คุณเพิ่งทำมาพร้อมกับ Command Line แทนการแก้ไขไฟล์ config


2

ฉันเขียนฟังก์ชั่นทุบตีสั้น ๆ เพื่อผลักดันรีโมตจำนวนมากในการโทรครั้งเดียว คุณสามารถระบุรีโมตเดี่ยวเป็นพารามิเตอร์หลายรีโมตคั่นด้วยช่องว่างหรือไม่ระบุใด ๆ เพื่อให้รีโมตไปที่รีโมตทั้งหมด

สามารถเพิ่มลงใน. 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
}

ตัวอย่าง: สมมุติว่า repo ของคุณมี 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.