Cách tìm nạp tất cả các nhánh Git


1507

Tôi đã nhân bản một kho lưu trữ Git, chứa khoảng năm chi nhánh. Tuy nhiên, khi tôi làm git branchtôi chỉ thấy một trong số họ:

$ git branch
* master

Tôi biết rằng tôi có thể làm git branch -ađể xem tất cả các chi nhánh, nhưng làm thế nào tôi có thể kéo tất cả các chi nhánh tại địa phương để khi tôi làm git branch, nó hiển thị như sau?

$ git branch
* master
* staging
* etc...

1
Cũng được thảo luận tại stackoverflow.com/questions/67699/ Cách
gliptak

2
Câu hỏi này cho biết cách nhận tất cả các chi nhánh sau khi sử dụng --single-branchcài đặt khi nhân bản: stackoverflow.com/questions/17714159/ mẹo ( git fetch --allsẽ không bao giờ hoạt động nếu bạn chỉ định một chi nhánh!)
Matthew Wilcoxson

2
Bạn sẽ không thấy đầu ra đó bao giờ vì dấu hoa thị đại diện cho chi nhánh hiện đang thanh toán. Vì bạn chỉ có thể có một chi nhánh được kiểm tra cùng một lúc, bạn chỉ có thể có một dấu hoa thị ở bên trái danh sách chi nhánh của mình.
Robino

5
Tôi đã thấy rất nhiều câu trả lời nhưng không ai trong số họ đề cập đến những gì tôi nghĩ có lẽ là cách dễ nhất để làm những gì bạn muốn: git clone --bare <repo url> .git (chú ý bạn cần thêm "--bare" và ".git" vào cuối để sao chép repo như một Repo "trần"), sau đó git config --bool core.bare false(đặt cờ "trần" thành false), sau đó git reset --hard(di chuyển ĐẦU sang ĐẦU hiện tại trên repo). Bây giờ nếu bạn git branchsẽ thấy tất cả các chi nhánh từ repo bạn đã nhân bản.
Gabriel Ferraz

4
@GabrielFerraz Sau đó, bạn đang lạm dụng chức năng bình luận trên Stack Overflow. Người dùng có thể upvote bình luận của bạn nhưng không downvote.
ống

Câu trả lời:


2051

Bạn có thể tìm nạp tất cả các nhánh từ tất cả các điều khiển từ xa như thế này:

git fetch --all

Về cơ bản, đó là một động thái sức mạnh .

fetchcập nhật các bản sao cục bộ của các chi nhánh từ xa để điều này luôn an toàn cho các chi nhánh địa phương của bạn NHƯNG :

  1. fetchsẽ không cập nhật các chi nhánh địa phương ( theo dõi các chi nhánh từ xa); nếu bạn muốn cập nhật các chi nhánh địa phương của bạn, bạn vẫn cần phải kéo mọi chi nhánh.

  2. fetchsẽ không tạo các nhánh cục bộ ( theo dõi các nhánh từ xa), bạn phải làm điều này bằng tay. Nếu bạn muốn liệt kê tất cả các chi nhánh từ xa: git branch -a

Để cập nhật các chi nhánh địa phương theo dõi các chi nhánh từ xa:

git pull --all

Tuy nhiên, điều này vẫn có thể không đủ. Nó sẽ chỉ hoạt động cho các chi nhánh địa phương của bạn theo dõi các chi nhánh từ xa. Để theo dõi tất cả các chi nhánh từ xa thực hiện oneliner này TRƯỚC git pull --all :

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

Phiên bản TL; DR

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Có vẻ như pull lấy tất cả các nhánh từ tất cả các điều khiển từ xa, nhưng tôi luôn tìm nạp trước để đảm bảo.)

Chỉ chạy lệnh đầu tiên nếu có các nhánh từ xa trên máy chủ không được theo dõi bởi các nhánh cục bộ của bạn.

PS AFAIK git fetch --allgit remote updatetương đương.



Nhận xét của Kamil Szot , mà mọi người đã thấy hữu ích.

Tôi đã phải sử dụng:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

bởi vì mã của bạn đã tạo các nhánh cục bộ có tên origin/branchnamevà tôi đã nhận được "refname 'origin / Branchname" là mơ hồ mỗi khi tôi nhắc đến nó.


42
Lấy làm tiếc. Tôi không thể tưởng tượng rằng đây là những gì OP thực sự muốn. Lệnh 'pull' là 'fetch + merge' và phần hợp nhất sẽ chồng tất cả các nhánh lên nhau - để lại một mớ hỗn độn khổng lồ.
GoZoner

10
rằng tìm nạp sẽ không tạo ra một chi nhánh từ xa mới mà bạn vẫn cần kiểm tra vớigit checkout -b localname remotename/remotebranch
Learath2

125
Tôi đã phải sử dụng for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done vì mã của bạn đã tạo các nhánh cục bộ có tên là origin / Branchname và tôi nhận được "refname 'origin / Branchname" là mơ hồ mỗi khi tôi nhắc đến nó.
Kamil Szot

22
Tôi không biết nếu tôi đang sử dụng một phiên bản GIT khác, nhưng tôi đã phải sửa đổi tập lệnh thành git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. Sự thay đổi dải ra ĐẦU.
kim3er

16
Dành cho dân Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Tối đa

719

Để liệt kê các chi nhánh từ xa:
git branch -r

Bạn có thể kiểm tra xem chúng như các chi nhánh địa phương với:
git checkout -b LocalName origin/remotebranchname


88
Đây chính xác là những gì tôi đang tìm kiếm khi tôi tìm thấy câu hỏi ở trên. Tôi nghi ngờ nhiều người đang tìm cách kéo một chi nhánh từ xa chắc chắn không muốn hợp nhất chi nhánh vào bản sao làm việc hiện tại của họ, nhưng họ thực sự muốn một chi nhánh địa phương giống hệt với chi nhánh từ xa.
Frug

12
Ngay cả khi chi nhánh không thể nhìn thấy tại địa phương, tôi có thể làm git checkout remotebranchnamevà nó hoạt động. sự khác biệt với giải pháp của bạn là gì?
François Romain

12
Hành vi mặc định của nó bây giờ. Không phải là trường hợp trên các phiên bản git cũ. Sử dụng git checkout remotebranchnameđược sử dụng để chỉ tạo một nhánh không liên quan mới được đặt tên là remotebranchname .
Learath2

12
Câu trả lời được chấp nhận làm điều gì đó khác biệt cơ bản và thành thật mà nói tôi thậm chí không hiểu tại sao câu trả lời được chấp nhận
Learath2

8
OP yêu cầu tất cả các chi nhánh. Câu trả lời này chỉ làm một.
Ted Bigham

193

Bạn sẽ cần tạo các nhánh cục bộ theo dõi các nhánh từ xa.

Giả sử rằng bạn chỉ có một điều khiển từ xa được gọi origin, đoạn mã này sẽ tạo các nhánh cục bộ cho tất cả các mục theo dõi từ xa:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Sau đó, git fetch --allsẽ cập nhật tất cả các bản sao địa phương của các chi nhánh từ xa.

Ngoài ra, git pull --allsẽ cập nhật các nhánh theo dõi cục bộ của bạn, nhưng tùy thuộc vào các cam kết cục bộ của bạn và cách đặt tùy chọn cấu hình 'hợp nhất', nó có thể tạo ra một cam kết hợp nhất, chuyển tiếp nhanh hoặc thất bại.


5
Điều này củng cố giải pháp chống lại các tên nhánh chứa ký tự đại diện shell (theo nhận xét của pinkeen về câu trả lời khác) và tránh đầu ra lỗi giả: git Branch -r | grep -v - '->' | Trong khi đọc từ xa; làm chi nhánh git --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'đã tồn tại'; xong
Daira Hopwood

6
Bạn có chắc chắn git pull --allsẽ cập nhật tất cả các chi nhánh theo dõi địa phương? Theo như tôi có thể nói nó chỉ cập nhật chi nhánh hiện tại từ tất cả các điều khiển từ xa.
Andy

3
Đã làm điều này. Các nhánh cục bộ phù hợp với các nhánh từ xa đã không được tạo. Lệnh git chỉ đơn giản nói "kéo tất cả các nhánh từ xa tạo các nhánh cục bộ nếu chúng không tồn tại?"
JosephK

@JosephK có lẽ remote của bạn không được gọi origin? Xem câu trả lời này sẽ làm việc trên tất cả các tên từ xa.
Tom Hale

@TomHale Đó là "nguồn gốc", nhưng cảm ơn vì câu trả lời của bạn - mặc dù thật điên rồ khi cần phải làm một hoặc hai lá cờ. Bây giờ tôi đang cố gắng gitless, để cố gắng tránh sự điên rồ của một số khía cạnh của git.
JosephK

116

Nếu bạn làm:

git fetch origin

sau đó họ sẽ ở đó tại địa phương Nếu sau đó bạn thực hiện:

git branch -a

bạn sẽ thấy chúng được liệt kê dưới dạng từ xa / nguồn gốc / tên chi nhánh. Vì họ ở đó nên bạn có thể làm bất cứ điều gì bạn muốn với họ. Ví dụ:

git diff origin/branch-name 

hoặc là

git merge origin/branch-name

hoặc là

git checkout -b some-branch origin/branch-name

5
Chỉ cần tìm thấy trang này trên google ... đây là loại câu trả lời thực tế tôi đang tìm kiếm. Tôi đã thử lệnh đầu tiên nhưng nhận được lỗi: [$ git fetch --all origin fatal: fetch --all không nhận đối số kho lưu trữ] --- Sử dụng "git fetch --all" dường như để thực hiện thủ thuật. Cảm ơn đã dẫn!
longda

1
Đã sửa (loại bỏ --all)
GoZoner

12
git fetch -alllấy tất cả các nhánh của tất cả các điều khiển từ xa. git fetch originlấy về tất cả các chi nhánh của điều khiển từ xa origin. Sau đó là những gì OP đã yêu cầu.
GoZoner

3
--allcó nghĩa là "tất cả các điều khiển từ xa", không phải "tất cả các nhánh của một điều khiển từ xa". Cái sau được ngụ ý bởi bất kỳ tìm nạp từ xa.
spainediver

2
Đây không phải là cách để kéo tất cả các chi nhánh vào repo cục bộ, từ repo từ xa.
Vladimir Despotovic

69
$ git remote update
$ git pull --all

Điều này giả định tất cả các chi nhánh được theo dõi.

Nếu họ không, bạn có thể bắn nó trong Bash:

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

Sau đó chạy lệnh.


3
Khi tôi thử mà tôi vẫn nhận được kết quả như trên.
David542

4
Giống như @JacobLowe, tôi đã gặp lỗi, nhưng dù sao nó cũng hoạt động; 'fatal: Một nhánh có tên' origin / master 'đã tồn tại.'
AnneTheAgile

Điều này thật xấu xí vì nó sẽ cố gắng tạo ra một nhánh ->có khả năng tồn tại trong đầu ra git branch -rlà `origin / HEAD -> origin / master`
Tom Hale

Hơn nữa, nó không hoạt động. Tôi nhận đầu ra: Branch 'origin/quote-filenames' set up to track local branch 'master'. Đầu ra mong muốn là: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. Đây là ngược , đặt gốc để theo dõi từ xa. Xem câu trả lời này để sửa chữa.
Tom Hale

đúng thứ tôi cần. Kể từ khi tôi chuyển đổi máy Mac, ngay cả sau khi tôi nhân bản repo, tôi không thể kiểm tra các chi nhánh từ xa khác và git fetchsẽ không hoạt động. Vì vậy, bài học ở đây là bạn cần theo dõi các chi nhánh từ xa. Gracias!
Victor Ramos

58

forVòng lặp Bash không hoạt động với tôi, nhưng điều này đã làm chính xác những gì tôi muốn. Tất cả các chi nhánh từ nguồn gốc của tôi được nhân đôi cùng tên tại địa phương.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Xem bình luận của Mike DuPont bên dưới. Tôi nghĩ rằng tôi đã cố gắng làm điều này trên Máy chủ Jenkins để nó ở chế độ đầu tách rời.


6
Điều đó tạo ra fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositorysau một bản sao đơn giản. Phải tháo đầu ra. Tôi đã làm điều này vớigit checkout <SHA>
brannerchinese

6
Giải pháp của tôi sử dụng điều này là git checkout --detach # detach the headvà sau đógit fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont

1
Cái này hoạt động với tôi, ngoại trừ tôi cũng sử dụng tham số --tags. Tôi ước có một tiêu chuẩn, kết thúc đơn giản cho git, số lượng những điều đơn giản trong git cần câu trả lời tràn 10 ngăn xếp là vô lý!
kristianp

1
@kristianp Bạn đã kiểm tra Ungit hoặc GitKraken chưa?
dragon788

@ dragon788 Tôi đã sử dụng SourceTree cho GUI git, nhưng tôi thực sự đang nói về một dòng lệnh đơn giản hơn cho các tác vụ kịch bản.
kristianp

51

Sử dụng git fetch && git checkout RemoteBranchName.

Nó hoạt động rất tốt cho tôi...


6
Đây là câu trả lời mới tốt nhất, vâng. Tôi không biết có thể điều này không thể xảy ra trước đây không, nhưng ít nhất các phiên bản Git gần đây sẽ nhận thấy rằng bạn đang cố kiểm tra một chi nhánh từ xa và sẽ tự động thiết lập chi nhánh theo dõi cục bộ cho bạn (và bạn không cần để chỉ định origin/branch; nó chỉ đủ để nói branch).
Neil Traft

9
Điều này không trả lời câu hỏi ban đầu: "Làm thế nào tôi có thể kéo tất cả các chi nhánh địa phương?" Nó đang kéo chúng từng cái một, không thể mở rộng được.
trong

Đây là câu trả lời duy nhất cho phép tôi kéo các nhánh từ xa trong mọi tình huống tôi gặp phải
Emmanuel Buckshi

38

Khi bạn sao chép một kho lưu trữ, tất cả thông tin của các nhánh thực sự được tải xuống nhưng các nhánh bị ẩn đi. Với lệnh

$ git branch -a

bạn có thể hiển thị tất cả các nhánh của kho lưu trữ và với lệnh

$ git checkout -b branchname origin/branchname

sau đó bạn có thể "tải xuống" chúng theo cách thủ công một lần.


Tuy nhiên, có một cách nhanh hơn và nhanh hơn, mặc dù nó hơi phức tạp. Bạn cần ba bước để thực hiện điều này:

  1. Bước đầu tiên

    tạo một thư mục trống mới trên máy của bạn và sao chép một bản sao nhân bản của thư mục .git từ kho lưu trữ:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    kho lưu trữ cục bộ bên trong thư mục my numpo_folder vẫn trống, hiện tại chỉ có một thư mục .git ẩn mà bạn có thể thấy bằng lệnh "ls -alt" từ thiết bị đầu cuối.

  2. Bước thứ hai

    chuyển kho lưu trữ này từ kho lưu trữ trống (trống) sang kho lưu trữ thông thường bằng cách chuyển giá trị boolean "trần" của cấu hình git thành false:

    $ git config --bool core.bare false
    
  3. Bước thứ ba

    Lấy tất cả mọi thứ trong thư mục hiện tại và tạo tất cả các nhánh trên máy cục bộ, do đó làm cho nó trở thành một repo bình thường.

    $ git reset --hard
    

Vì vậy, bây giờ bạn có thể chỉ cần gõ lệnh git branchvà bạn có thể thấy rằng tất cả các nhánh được tải xuống.

Đây là cách nhanh chóng để bạn có thể sao chép một kho lưu trữ git với tất cả các nhánh cùng một lúc, nhưng đó không phải là điều bạn muốn làm cho mỗi dự án theo cách này.


1
Upvote để đề cập đến các chi nhánh ẩn. đã giúp tôi hiểu chi nhánh theo dõi rất nhiều.
mburke05

Đó là một câu trả lời tốt, nhưng câu hỏi ngụ ý một cái gì đó cho mỗi ngày sử dụng. Nó không thực tế để sao chép kho lưu trữ mọi lúc.
Z. Khullah

Tại sao thiết lập lại tạo ra tất cả các chi nhánh địa phương?
Z. Khullah

@ Z.Khullah không phải là thiết lập lại tạo ra tất cả các nhánh, mà là bản sao --mirror. Thật không may cho chúng tôi, điều đó cũng tạo ra một repo trần, đó là những gì bước 2 và 3 thay đổi.
ScottJ

29

Bạn có thể tìm nạp tất cả các nhánh bằng cách:

git fetch --all

hoặc là:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

Các --depth=10000thông số có thể giúp đỡ nếu bạn đã shallowed kho.


Để kéo tất cả các nhánh, sử dụng:

git pull --all

Nếu ở trên không hoạt động, thì trước lệnh trên với:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

vì chỉ remote.origin.fetchcó thể hỗ trợ một chi nhánh cụ thể trong khi tìm nạp, đặc biệt là khi bạn nhân bản repo của mình với --single-branch. Kiểm tra điều này bằng cách : git config remote.origin.fetch.

Sau đó, bạn sẽ có thể kiểm tra bất kỳ chi nhánh.

Xem thêm:


Để đẩy tất cả các nhánh vào điều khiển từ xa, sử dụng:

git push --all

cuối cùng --mirrorđể phản ánh tất cả các ref.


Nếu mục tiêu của bạn là sao chép một kho lưu trữ, hãy xem: Sao chép một bài viết về kho lưu trữ tại GitHub.


1
Tuyệt vời ... Tôi đã thử mọi thứ khác trước khi giải pháp của bạn trong trang này. Cảm ơn rất nhiều!
Sujoy

2
Tôi đã sử dụng nhân bản nông ( depth=1) và cấu hình cũng chỉ định một nhánh cụ thể cho fetch- depth=1000tham số là bản sửa lỗi giúp tôi kiểm tra một nhánh từ xa cụ thể
Sandra

2
pull --allkhông kéo tất cả các nhánh, nhưng tất cả các điều khiển từ xa
Z. Khullah

Mặc dù vậy, mẹo hay với cấu hình! Sẽ lấy tất cả, mọi lúc
Z. Khullah

Tôi đã kiểm tra cấu hình như bạn đã viết, vẫn chỉ hoạt động với chi nhánh hiện tại. Có vẻ như tất cả các câu trả lời ở đây không phù hợp với tôi ...
Alexei Martianov

25

Tôi thường không sử dụng gì khác ngoài các lệnh như thế này:

git fetch origin
git checkout --track origin/remote-branch

Một phiên bản ngắn hơn một chút:

git fetch origin
git checkout -t origin/remote-branch

17

Tôi tin rằng bạn đã nhân bản kho lưu trữ bằng cách:

git clone https://github.com/pathOfrepository

Bây giờ hãy vào thư mục đó bằng cách sử dụng cd:

cd pathOfrepository

Nếu bạn gõ git statusbạn có thể thấy tất cả:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Để xem tất cả các loại nhánh ẩn:

 git branch -a

Nó sẽ liệt kê tất cả các chi nhánh từ xa.

Bây giờ nếu bạn muốn thanh toán trên bất kỳ chi nhánh cụ thể nào, chỉ cần gõ:

git checkout -b localBranchName origin/RemteBranchName

16

Nếu bạn đang ở đây để tìm kiếm một giải pháp để có được tất cả các chi nhánh và sau đó di chuyển mọi thứ sang một máy chủ Git khác, tôi sẽ kết hợp quy trình dưới đây. Nếu bạn chỉ muốn nhận được tất cả các chi nhánh được cập nhật cục bộ, hãy dừng lại ở dòng trống đầu tiên.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
Rất hữu ích; chính xác những gì tôi cần Điều duy nhất tôi phải thay đổi là ở dòng thứ hai, thêm các trích dẫn đơn xung quanh 'ĐẦU' và 'chủ'; có lẽ bởi vì tôi đang sử dụng zsh. Cảm ơn!
sockmonk

Điều này về cơ bản là làm như sau: (1) Lấy tên thật của các nhánh từ xa [không phải đầu, không phải chủ]; (2) Hoàn toàn bảo Git theo dõi chúng [không phải tất cả các giải pháp đều làm điều này]; (3) Tìm nạp và kéo mọi thứ từ các nhánh này [bao gồm các thẻ]; (4) Thiết lập một nguồn gốc mới và thông qua việc đẩy hoàn toàn mọi thứ lên. Một lần nữa, hầu hết các giải pháp khác không thể di chuyển tất cả các mảnh. Điều này làm tất cả.
ingyhere

1
Tôi đã loại bỏ các antipotype chạy grep sau đó awk và cô đọng các lệnh grep vào lệnh awk. Cảm ơn ba !
ingyhere

Đọc này và không bao giờ viết git fetch git pull stackoverflow.com/a/292359/1114926
Green

Git pullkhông thực sự làm một fetchđầu tiên nhưng nó dễ dàng hơn để nói nếu vấn đề là từ fetchmột phần của pullhoặc sau mergemột phần của pullkhi fetchđược thực hiện một cách độc lập.
ingyhere

12

Sau khi bạn sao chép kho lưu trữ chính, bạn có thể thực thi

git fetch && git checkout <branchname>

1
đơn giản. và làm việc để có được một chi nhánh từ nguồn gốc từ xa
sirvon

3
Điều này không trả lời câu hỏi ban đầu: "Làm thế nào tôi có thể kéo tất cả các chi nhánh địa phương?" Nó đang kéo chúng từng cái một, không thể mở rộng được. Hãy xem xét trường hợp của 100 chi nhánh.
ingyhere

10

Đảm bảo rằng tất cả các nhánh từ xa có thể tìm nạp trong .git/configtệp.

Trong ví dụ này, chỉ có origin/productionnhánh có thể tìm nạp được, ngay cả khi bạn cố gắng không làm git fetch --allgì sẽ xảy ra ngoài việc tìm nạp productionnhánh:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Dòng này nên được thay thế bằng:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Sau đó chạy git fetchvv ...


3
Để kiểm tra: git config --get remote.origin.fetchvà sau đó (phá hủy) đặt nó:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

hoặc sửa đổi tệp văn bản cấu hình trong thư mục .git, làm việc cho tôi
FDIM

9

Looping dường như không làm việc cho tôi và tôi muốn bỏ qua nguồn gốc / chủ. Đây là những gì làm việc cho tôi.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Sau đó:

git fetch --all
git pull --all

1
Một biến thể của điều này là câu trả lời đúng, nhưng điều này không hoạt động trong tất cả các trường hợp cạnh. Ngoài ra, tên chi nhánh có thể là sôi nổi. Vì vậy, tôi đã làm như sau: git chi nhánh -r | grep -v TRỤ | chủ grep mậtv | awk -F'origin / '' {in $ 2 "" $ 1 "nguồn gốc /" $ 2} '| xargs -L 1 git nhánh -f --track; git lấy --all; git kéo --all; VÀ R DING DID THE TRICK!
ingyhere

3
Một cải tiến phong cách để tránh những grep | awk antipattern : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

Chỉ cần ba lệnh này sẽ nhận được tất cả các nhánh:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

Đây thực sự là gốc rễ của vấn đề của OP. Nếu nhân bản đúng, anh ta sẽ không cần phải làm a pull --all. Nhưng nếu vẫn cần, thì câu trả lời khác dưới đây, bởi @Johnno Nola, giả sử tất cả các nhánh được theo dõi, trộn lẫn với câu trả lời này, là cách để đi.
Bác sĩ Beco

7

Tại sao không ai trả lời câu hỏi của các chàng trai và giải thích những gì đang xảy ra?

  1. Hãy chắc chắn rằng bạn đang theo dõi tất cả các chi nhánh từ xa (hoặc bất kỳ chi nhánh nào bạn muốn theo dõi) .
  2. Cập nhật các chi nhánh địa phương của bạn để phản ánh các chi nhánh từ xa.

Theo dõi tất cả các chi nhánh từ xa:

Theo dõi tất cả các chi nhánh tồn tại trong repo từ xa.

Làm thủ công:

Bạn sẽ thay thế <branch>bằng một nhánh được hiển thị từ đầu ra của git branch -r.

git branch -r
git branch --track <branch>

Làm điều đó với một kịch bản bash

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Cập nhật thông tin về các chi nhánh từ xa trên máy tính cục bộ của bạn:

Điều này tìm nạp các bản cập nhật trên các nhánh từ repo từ xa mà bạn đang theo dõi trong repo cục bộ của bạn. Điều này không làm thay đổi các chi nhánh địa phương của bạn. Repit git địa phương của bạn bây giờ nhận thức được những điều đã xảy ra trên các chi nhánh repo từ xa. Một ví dụ sẽ là một cam kết mới đã được đẩy đến chủ từ xa, thực hiện tìm nạp bây giờ sẽ cảnh báo bạn rằng chủ địa phương của bạn đứng sau 1 cam kết.

git fetch --all

Cập nhật thông tin về các chi nhánh từ xa trên máy tính cục bộ của bạn và cập nhật các chi nhánh địa phương:

Có một tìm nạp theo sau là một sự hợp nhất cho tất cả các chi nhánh từ xa đến chi nhánh địa phương. Một ví dụ là một cam kết mới đã được đẩy đến chủ từ xa, thực hiện thao tác kéo sẽ cập nhật repo cục bộ của bạn về các thay đổi trong nhánh từ xa và sau đó nó sẽ hợp nhất các thay đổi đó vào nhánh cục bộ của bạn. Điều này có thể tạo ra một mớ hỗn độn do xung đột hợp nhất.

git pull --all

4

Tôi đã viết một kịch bản nhỏ để quản lý nhân bản một repo mới và tạo các nhánh cục bộ cho tất cả các nhánh từ xa.

Bạn có thể tìm thấy phiên bản mới nhất tại đây :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Để sử dụng nó, chỉ cần sao chép nó vào thư mục git bin của bạn (đối với tôi, đó là C:\Program Files (x86)\Git\bin\git-cloneall), sau đó, trên dòng lệnh:

git cloneall [standard-clone-options] <url>

Nó nhân bản như bình thường, nhưng tạo các nhánh theo dõi cục bộ cho tất cả các nhánh từ xa.


4

Cách tìm nạp tất cả các chi nhánh Git Theo dõi từ xa duy nhất.

Điều này đã được thử nghiệm và các chức năng trên Red Hat và Git Bash trên Windows 10.


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Giải trình:

Một lớp lót kiểm tra và sau đó lấy tất cả các nhánh ngoại trừ CHÍNH.

Liệt kê các nhánh theo dõi từ xa.

git branch -r

Bỏ qua ĐẦU.

grep -v ' -> '

Lấy tên chi nhánh của điều khiển từ xa.

cut -d"/" -f2

Kiểm tra tất cả các chi nhánh theo dõi một điều khiển từ xa duy nhất.

git checkout $branch

Tìm nạp cho chi nhánh đã kiểm tra.

git fetch

Về mặt kỹ thuật, việc tìm nạp là không cần thiết cho các chi nhánh địa phương mới.

Điều này có thể được sử dụng cho một trong hai fetchhoặc pullnhánh mà nó có cả mới và có những thay đổi trong điều khiển từ xa (s).

Chỉ cần chắc chắn rằng bạn chỉ kéo nếu bạn đã sẵn sàng để hợp nhất.


Kiểm tra cài đặt

Kiểm tra một kho lưu trữ với URL SSH.

git clone git@repository.git

Trước

Kiểm tra các chi nhánh tại địa phương.

$ git branch
* master

Lệnh thực thi

Thực hiện một lót.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Sau

Kiểm tra các chi nhánh địa phương bao gồm các chi nhánh từ xa.

$ git branch
  cicd
  master
* preprod

4

Đối với người dùng Windows sử dụng PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

Điều này hoạt động với các chi nhánh có / trong tên: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Markus

3

Đây là một cái gì đó tôi cho là mạnh mẽ:

  • Không cập nhật theo dõi từ xa cho các chi nhánh hiện có
  • Không cố cập nhật HEADđể theo dõiorigin/HEAD
  • Cho phép điều khiển từ xa có tên khác origin
  • Trích dẫn đúng vỏ
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Không cần thiết phải git fetch --allchuyển -allđể git pullchuyển tùy chọn này đến nội bộ fetch.

Tín dụng cho câu trả lời này .


2

Đây là phiên bản Perl của một lớp lót được cung cấp trong câu trả lời được chấp nhận:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

Bạn có thể chạy tệp đầu ra dưới dạng tập lệnh Shell nếu bạn muốn.

Chúng tôi đã vô tình xóa kho dự án Stash của chúng tôi. May mắn thay, ai đó đã tạo ra một ngã ba ngay trước khi mất mát vô tình. Tôi đã nhân bản ngã ba đến địa phương của tôi (sẽ bỏ qua các chi tiết về cách tôi đã làm điều đó). Khi tôi đã có ngã ba hoàn toàn tại địa phương, tôi đã chạy một chiếc lót. Tôi đã sửa đổi URL của điều khiển từ xa (nguồn gốc trong trường hợp của tôi) để trỏ đến kho lưu trữ đích mà chúng tôi đang khôi phục:

git remote set-url origin <remote-url>

Và cuối cùng đã đẩy tất cả các chi nhánh có nguồn gốc như vậy:

git push --all origin

và chúng tôi đã trở lại trong kinh doanh.


1

Chúng ta có thể đặt tất cả các tên nhánh hoặc thẻ trong một tệp tạm thời, sau đó thực hiện git pull cho mỗi tên / thẻ:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

Nếu bạn gặp vấn đề với fetch --allthì hãy theo dõi chi nhánh từ xa của bạn:

git checkout --track origin/%branchname%

1

Để tránh thông báo lỗi 'gây tử vong: Một nhánh có tên' origin / master 'đã tồn tại.', Bạn cần điều này:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Dựa trên câu trả lời của Learath2, đây là những gì tôi đã làm sau khi thực hiện git clone [...]cdvào thư mục đã tạo:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Làm việc cho tôi nhưng tôi không thể biết nó sẽ làm việc cho bạn. Hãy cẩn thận.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Bây giờ địa phương của bạn yourNewLocalBranchNamelà của bạn requiredRemoteBranch.


0

Đối với người dùng Visual Studio, trên bảng điều khiển Trình quản lý gói:

chi nhánh git | % {git tìm nạp ngược dòng; git merge ngược dòng / master}


0

Đã thử nhiều cách, chỉ có cách này là đơn giản và hiệu quả với tôi.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

Đặt bí danh: (dựa trên câu trả lời trên cùng)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Bây giờ để theo dõi tất cả các chi nhánh:

git track-all-branches

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.