Có thể đẩy tất cả các điều khiển từ xa git với một lệnh?


Câu trả lời:


252

Để đẩy tất cả các chi nhánh đến tất cả các điều khiển từ xa:

git remote | xargs -L1 git push --all

Hoặc nếu bạn muốn đẩy một nhánh cụ thể đến tất cả các điều khiển từ xa:

Thay thế masterbằng nhánh bạn muốn đẩy.

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

(Phần thưởng) Để tạo bí danh git cho lệnh:

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

Chạy git pushallbây giờ sẽ đẩy tất cả các chi nhánh đến tất cả các điều khiển từ xa.


1
Giải pháp rất tốt và đơn giản. BTW bạn có thể sử dụng xargs -l thay vì -L 1, tùy chọn -l giống như -L 1. Ngoài ra, đôi khi tôi thêm --all vào git đẩy. git từ xa | xargs -l git đẩy --all
Tony

2
Tôi nhận được xargs: illegal option -- ltrên OSX. Tìm ra nó, bạn cầngit remote | xargs -L1 git push
balupton

4
Git cho phép bạn thực hiện cuộc gọi đó thành một lệnh tùy chỉnh. Chỉ cần đặt nó trong một tệp có 1) trên đường dẫn của bạn, 2) bạn có quyền thực thi và 3) được gọi là "git- [tên tùy chỉnh]" (ví dụ: git-foo, git-push-all) và bạn sẽ có thể chỉ cần gõ "git [tên tùy chỉnh]" (ví dụ: git foo, git push-all).
Andrew Martin

2
@Tony Trên Ubuntu, man xargscho biết tùy chọn -lkhông được chấp nhận vì nó không nằm trong thông số POISX.
wjandrea

2
@kyb Trong cú pháp bí danh git, !có nghĩa sau đây không phải là lệnh git nội bộ, mà là lệnh shell bên ngoài.
yếu

285

Tạo một allđiều khiển từ xa với một số URL repo theo tên của nó:

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

Sau đó chỉ là git push all --all.


Đây là cách nó nhìn vào .git/config:

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

5
Thủ thuật cực hay! Nhược điểm duy nhất là nó không di chuyển đầu từ xa. Bạn cần chạy git fetch --allngay sau khi thực hiện động tác đẩy như vậy.
madhead

8
Ông Torvalds (người tạo ra Git) đề cập rằng ông sử dụng phương pháp này, nhưng ông nói rằng nó chỉ đơn thuần là để thuận tiện và không cung cấp lợi thế kỹ thuật marc.info/?l=git&m=116231242118202&w=2 "Và cuối cùng, thậm chí là một" git đẩy tất cả "đẩy đến nhiều kho lưu trữ thực sự sẽ kết nối một lần cho mỗi kho lưu trữ, vì vậy nó thực sự chỉ là một tốc ký để thực hiện nhiều" git đẩy "es. Không có lợi thế kỹ thuật thực sự, chỉ là sự tiện lợi."
Matt

14
Một vấn đề với cách tiếp cận này là bạn phải thêm URL mới vào allđiều khiển từ xa khi chúng có sẵn, trong khi đó git remote | xargs -L1 git push --allsẽ tự động nhận bất kỳ điều khiển từ xa mới.
Raffi Khatchadourian

2
Mẹo: Để không cần nhập allbất cứ khi nào bạn gửi cam kết, chỉ cần sử dụng "nguồn gốc" thay vì "tất cả":git remote set-url --add origin nodester-host:path/proj.git
Macabeus

quên đặt các url đẩy nếu không git pushsẽ không cập nhật tất cả các url. câu trả lời được cập nhật tương ứng
user3338098

88

Nếu bạn muốn luôn luôn đẩy sang repo1, repo2 và repo3 nhưng luôn chỉ kéo từ repo1, hãy thiết lập 'nguồn gốc' từ xa như

[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/*

Cấu hình tại dòng lệnh:

$ 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

Nếu bạn chỉ muốn kéo từ repo1nhưng đẩy đến repo1repo2 cho một nhánh cụ thể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
    ...

Xem https://git-scm.com/docs/git-config#git-config-branchltnamegtremote .


4
Tôi không chắc tại sao điều này không có nhiều phiếu hơn. Điều này thực sự rất tiện lợi vì nó cho phép bạn chỉ cần thực hiện git pushmà không có bất kỳ đối số nào.
Husky

1
Hãy bình chọn cho tôi!
Mạnh Lữ

1
Đây dường như là cách thích hợp hơn để làm điều này. Nên có số phiếu cao nhất.
Ahmad

Nó rất hữu ích. Có thể giới hạn Pushurl để chỉ chi nhánh?
fbucek

17

Là một thay thế CLI để chỉnh sửa tệp .git / config, bạn có thể sử dụng các lệnh sau:

# 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

Giống nhau git push all --all công trình ở đây là tốt.

Bạn đã hoàn thành giống như câu trả lời số 1. Bạn vừa thực hiện nó với Command Line thay vì chỉnh sửa thô tệp cấu hình.


2

Tôi đã viết một hàm bash ngắn để đẩy đến nhiều điều khiển từ xa trong một cuộc gọi. Bạn có thể chỉ định một điều khiển từ xa duy nhất làm tham số, nhiều điều khiển từ xa được phân tách bằng dấu cách hoặc không chỉ định bất kỳ điều khiển nào để điều khiển từ xa đến tất cả các điều khiển từ xa.

Điều này có thể được thêm vào .bashrc hoặc .bash_profile của bạn.

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
}

Ví dụ: Giả sử repo của bạn có 3 điều khiển từ xa: rem1, rem2 và rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush

0

Bạn có thể sử dụng móc git - đặc biệt pre-push: thêm các lần đẩy không có nguồn gốc vào .git/hooks/pre-push.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.