Thiết lập git để kéo và đẩy tất cả các nhánh


616

Tôi muốn đẩy và kéo tất cả các nhánh theo mặc định, bao gồm cả các nhánh mới được tạo.

Có một thiết lập mà tôi có thể xác định cho nó?

Mặt khác, khi tôi thêm một nhánh mới, cục bộ và tôi muốn kéo nó từ máy chủ, cách đơn giản nhất để làm điều đó là gì?

Tôi đã tạo một nhánh mới có cùng tên và cố gắng kéo nhưng nó không hoạt động. Yêu cầu tôi cho tất cả các cấu hình từ xa của chi nhánh. Làm thế nào để tôi thiết lập nó.


4
"Và đã cố gắng để kéo nhưng nó không hoạt động". Chi tiết xin vui lòng. Chỉ cho chúng tôi những lệnh bạn đã cố gắng sử dụng.
Jakub Narębski

Câu trả lời:


1298

Cách đơn giản nhất là làm:

git push --all origin

Điều này sẽ đẩy các thẻ và chi nhánh.


10
Trong số hàng tá câu trả lời mà tôi tìm thấy trên SO và những nơi khác, đây là cách đơn giản nhất để đẩy một nhánh cục bộ mới được tạo, mà không cần chạm vào cấu hình. Cảm ơn!
András Szepesházi

174
Và nếu bạn thêm -umột lần, ví dụ: git push --all origin -utheo dõi là thiết lập và sau đó bạn chỉ cần sử dụng git push.
Alec

23
Đối với phiên bản git 1.7.12.3 tôi phải sử dụng git push --tags originđể đẩy tất cả các thẻ.
vào

17
Ngoài ra, hãy nhìn vào "--mirror" thay vì "--all" điều này thúc đẩy nhiều thứ hơn
Loda

21
CẢNH BÁO: Nếu bạn có một loạt các chi nhánh ĐỊA PHƯƠNG mà bạn chưa dọn dẹp (tính năng, hotfix) - hoặc không dọn dẹp đúng cách (tôi), điều này sẽ tràn ngập điều khiển từ xa của bạn. Chỉ trích. Và chúng tôi vừa mới cắt tỉa. Không chắc tại sao địa phương của tôi có rất nhiều chi nhánh còn sót lại.
Jack

147

Với git hiện đại, bạn luôn tìm nạp tất cả các nhánh (dưới dạng các nhánh theo dõi từ xa vào refs/remotes/origin/*không gian tên, hiển thị bằng git branch -rhoặc git remote show origin).

Theo mặc định (xem tài liệu về push.defaultbiến cấu hình), bạn đẩy các nhánh khớp , điều đó có nghĩa là trước tiên bạn phải làm git push origin branchcho git để luôn bật nó git push.

Nếu bạn muốn luôn luôn đẩy tất cả các chi nhánh , bạn có thể thiết lập refspec đẩy. Giả sử rằng điều khiển từ xa được đặt tên, originbạn có thể sử dụng git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

hoặc trực tiếp chỉnh sửa .git/configtập tin để có cái gì đó như sau:

[từ xa "nguồn gốc"]
        url = user@example.com: /srv/git/repo.git
        tìm nạp = + refs / Heads / *: refs / điều khiển từ xa / origin / *
        tìm nạp = + refs / tags / *: refs / tags / *
        đẩy = + refs / Heads / *: refs / Heads / *
        đẩy = + refs / tags / *: refs / tags / *

3
@Merc: git push --all origintốt cho một lần xuất bản tất cả các chi nhánh và thẻ, mặc dù cho đến khi ngữ nghĩa 'khớp' phiên bản hiện tại có nghĩa là bạn sẽ đẩy tất cả các chi nhánh sau đó ... trừ khi bạn thêm chi nhánh hoặc thẻ mới. Các thiết lập để "đẩy [...] tất cả các chi nhánh theo mặc định" là như bằng văn bản.
Jakub Narębski

Bạn có thể cải thiện câu trả lời để thêm cách cấu hình lại Git theo cách này. Điều này hữu ích cho người dùng đã thiết lập chế độ đơn giản.
Dereckson

3
Điều này đã thay đổi kể từ git 2.0. Đẩy mặc định là đơn giản, không phù hợp nữa.
mike

Tôi đã thử điều này và gặp lỗi khi đẩy: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Lưu ý: Tôi đang sử dụng git 2.0. Tôi vẫn đang tìm cách khắc phục vấn đề này.)
Brian Lacy

2
Bây giờ giá trị mặc định cho push.defaultsimple.
hasanghaforian

32

Bao gồm dấu + trong thông số đẩy có lẽ là một ý tưởng tồi, vì điều đó có nghĩa là git sẽ vui vẻ thực hiện một cú đẩy không nhanh về phía trước ngay cả khi không có -f và nếu máy chủ từ xa được thiết lập để chấp nhận những điều đó, bạn có thể mất lịch sử.

Hãy thử điều này:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Bạn cũng có thể thêm --globaltùy chọn cho từng tùy chọn này để biến nó thành mặc định toàn cầu cho tất cả các kho lưu trữ của bạn.
Ether

Thật không may là + được thêm tự động bởi git khi thực hiện git remote add.
Ether

27

Tôi đã sử dụng các lệnh dưới đây để di chuyển tất cả các nhánh sang kho lưu trữ mới.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

LƯU Ý : Tôi đã phải sử dụng lệnh thứ hai cuối cùng (tức là đẩy chủ trước) trong khi sao chép một repo từ Atlassian Stash sang AWS CodeCommit (repo trống). Tôi không chắc chắn lý do, nhưng sau khi đẩy ( git push new-origin --mirror) nhánh mặc định đã đề cập đến một số nhánh khác hơn master.


1
Hoàn hảo để di chuyển một repo đến một máy chủ khác. Cảm ơn bạn!
Pelmered

2
Đây thực sự chỉ là phương pháp hữu ích. Sử dụng git push new_origin --allchỉ cần đẩy các chi nhánh địa phương hiện tại của bạn sang new_origin, không phải tất cả các chi nhánh xuất xứ.
yanzi1225627

Chỉ cần lưu ý rằng điều này tạo ra một --barekho lưu trữ, khác một chút so với kho lưu trữ thông thường, nó chỉ có các .gittệp chứ không phải các tệp của bạn. Nó hoàn toàn đủ nếu bạn sẽ không làm việc trong đó. Xem --bare--mirror git-scm.com/docs/git-clone .
jmmut

Tất cả mặc dù nó chỉ có các tệp .git chứ không phải mã nguồn thực tế, nếu bạn thực hiện cập nhật từ xa, nó sẽ tìm nạp lại mọi thứ từ gốc đến đích.
SanthoshM

Đây là một cứu cánh! Phương pháp "chính trước gương" này đã khắc phục sự cố với Bitbucket là đích đến và tin rằng một nhánh khác ngoài "chủ" là nhánh chính.
Toddius Zho

12

Nếu bạn đang chuyển các nhánh sang một repo mới từ một repo cũ và KHÔNG có tất cả các nhánh repo cũ cục bộ, bạn sẽ cần theo dõi chúng trước.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Sau đó thêm repo từ xa mới của bạn:

git remote add bb <path-to-new-repo>

Sau đó, bạn có thể đẩy tất cả bằng cách sử dụng lệnh này:

git push -u bb --all

Hoặc bạn có thể định cấu hình repo bằng các lệnh git config được ghi chú trong các phản hồi khác ở đây nếu bạn không thực hiện điều này một lần hoặc chỉ tìm cách di chuyển các nhánh cục bộ.

Điểm quan trọng, các phản ứng khác chỉ đẩy tất cả các chi nhánh ĐỊA PHƯƠNG. Nếu các nhánh chỉ tồn tại trên một kho lưu trữ XÓA thay thế, chúng sẽ không di chuyển mà không theo dõi chúng trước. Vòng lặp for được trình bày ở đây sẽ giúp với điều đó.


BTW, tôi đang sử dụng "bb" thay cho "origin" ở đây vì tôi cho rằng kho lưu trữ gốc / cũ của bạn được đặt tên là "origin" và có khả năng vẫn được gắn vào nhãn đó. "Bb" là dành cho Bitbucket, nơi tôi đã chuyển repo ban đầu của mình sang, nhưng bạn có thể gọi nó là một cái gì đó phù hợp hơn như "neworigin" nếu bạn thích.
Lance Cleveland

2
Điều đó đã không làm việc cho tôi. Kết thúc với tất cả các chi nhánh từ xa theo dõi cùng một chi nhánh địa phương: /
jhsowter 16/12/14

2
AFAIK này không hoạt động, theo nhận xét @jhsowter. lệnh đúng để tôi theo dõi một chi nhánh từ xa trong một repo mới được nhân bản là git branch --track reponame origin/reponamenếu không bạn sẽ nhận được tất cả các chi nhánh từ xa được theo dõi trên chi nhánh địa phương hiện tại
Pioneer Skies

Tôi đã thay đổi đoạn trích thu thập repo thành git branch -r | grep -v '\->' | sed 's/ origin\///' , chỉ cung cấp tên chi nhánh từ xa.
Paul Hicks

6

Để xem tất cả các nhánh không sử dụng, git branch -abạn nên thực hiện:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Bây giờ bạn có thể thấy tất cả các chi nhánh:

git branch

Để đẩy tất cả các chi nhánh hãy thử:

git push --all

1
git fetch --all origin fatal: fetch --all không lấy đối số kho lưu trữ
foxundermon

bạn đang cố gắng git fetch --allà
tokhi

4

Nếu bạn đang chuyển tất cả các nhánh sang một repo mới từ một repo cũ thì trong repo cục bộ của bạn, bạn cần thiết lập theo dõi từng nhánh đến các nhánh gốc hiện có, trước khi đẩy sang repo mới, nếu không tất cả các nhánh gốc của bạn sẽ không xuất hiện trong nguồn gốc mới. Làm điều này bằng tay bằng cách theo dõi hoặc kiểm tra từng chi nhánh hoặc sử dụng một lớp lót:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Lệnh một dòng này dựa trên các phiên bản của nó trong các câu trả lời khác trên trang này, nhưng được cho là tốt hơn bởi vì:

  1. nó thiết lập chính xác theo dõi nhánh, không giống như một số biến thể cũ hơn của lệnh này trên trang này chỉ cung cấp một tham số cho --track và do đó mỗi nhánh kết thúc theo dõi chính - không tốt
  2. đặt tên cho các chi nhánh địa phương mà không có tiền tố Xuất xứ / điều mà cá nhân tôi không muốn - và phù hợp với những gì xảy ra khi bạn kiểm tra một chi nhánh bình thường.
  3. bỏ qua chủ theo dõi vì điều đó đã xảy ra
  4. không thực sự kiểm tra bất cứ điều gì vì vậy là nhanh
  5. tránh vấp ngã trên -> trong đầu ra của nhánh git -r

Tiếp theo, nếu bạn đang chuyển đổi nguồn gốc, hãy thay thế liên kết đến nguồn gốc cũ và trỏ đến một điều khiển từ xa mới. Đảm bảo bạn tạo điều khiển từ xa mới trước, sử dụng GUI bitbucket / github, nhưng không thêm bất kỳ tệp nào vào đó hoặc sẽ có vấn đề hợp nhất. Ví dụ

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Bây giờ đẩy. Lưu ý lệnh thứ hai là cần thiết để đẩy các thẻ:

git push -u --all origin
git push --tags origin

0

Giải pháp không cần mã hóa cứng origintrong cấu hình

Sử dụng như sau trong gitconfig toàn cầu của bạn

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Điều này đẩy tất cả các chi nhánh và tất cả các thẻ

Tại sao bạn KHÔNG nên hardcode origintrong cấu hình?

Nếu bạn mã hóa cứng:

  1. Bạn sẽ kết thúc với originmột điều khiển từ xa trong tất cả các repos. Vì vậy, bạn sẽ không thể thêm nguồn gốc, nhưng bạn cần sử dụng set-url.
  2. Nếu một công cụ tạo một điều khiển từ xa với một tên khác, tất cả cấu hình sẽ không được áp dụng. Sau đó, bạn sẽ phải đổi tên điều khiển từ xa, nhưng đổi tên sẽ không hoạt động vì originđã tồn tại (từ điểm 1) :)

Fetching được chăm sóc bởi git hiện đại

Theo câu trả lời của Jakub Narębski:

Với git hiện đại, bạn luôn tìm nạp tất cả các nhánh (dưới dạng các nhánh theo dõi từ xa vào không gian tên refs / remote / origin / *

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.