Câu hỏi Làm thế nào để sao chép tất cả các nhánh từ xa trong Git?


tôi có một master và một development chi nhánh, cả hai đều được đẩy vào GitHub. tôi có cloned, pulled, và fetched, nhưng tôi vẫn không thể có được bất cứ điều gì khác hơn là master chi nhánh trở lại.

Tôi chắc chắn rằng tôi đang thiếu một cái gì đó hiển nhiên, nhưng tôi đã đọc hướng dẫn sử dụng và tôi không nhận được niềm vui nào cả.


3560
2017-09-15 22:42


gốc


Câu trả lời được chấp nhận ở đây (git branch -a) cho bạn thấy các nhánh trong điều khiển từ xa, nhưng nếu bạn cố gắng kiểm tra bất kỳ nhánh nào trong số đó, bạn sẽ ở trạng thái 'tách rời'. Câu trả lời tiếp theo (câu trả lời thứ hai) trả lời một câu hỏi khác (để wit: làm thế nào để kéo tất cả các chi nhánh, và, một lần nữa, điều này chỉ hoạt động cho những người bạn đang theo dõi tại địa phương). Một số ý kiến ​​chỉ ra rằng bạn có thể phân tích cú pháp git branch -a kết quả với một kịch bản lệnh shell sẽ theo dõi cục bộ tất cả các nhánh từ xa. Tóm tắt: Không có cách nào để làm những gì bạn muốn và nó có thể không phải là một ý tưởng tuyệt vời. - Day Davis Waterbury
Có lẽ chỉ cần sao chép toàn bộ thư mục theo cách cũ? scp some_user@example.com:/home/some_user/project_folder ~ Không chắc chắn nếu giải pháp đó làm việc cho github mặc dù .. - snapfractalpop
Thay vì nói "Tôi đã nhân bản, kéo và lấy," tốt hơn để cho chúng ta thấy lệnh chính xác mà bạn đã thực hiện. - Bob Gilmore
Nó luôn luôn boggles tôi tại sao "bản sao" không phải là trong ý nghĩa của một bản sao chính xác. Nếu đó là một bản sao chính xác, không phải tất cả các chi nhánh sẽ là một phần của kho lưu trữ cục bộ? Tôi có nghĩa là không phải là một trong những điểm được phân phối? Vì vậy, khi một cái gì đó kho lưu trữ đã biến mất, bạn vẫn có một bản sao hoàn chỉnh của tất cả mọi thứ. Hoặc là nó được gọi là "từ xa" thực sự là một phần của kho lưu trữ địa phương đã? - huggie
Nhìn thấy tất cả các upvotes, câu trả lời, ý kiến ​​về câu trả lời và số lượng quan điểm boggling, tôi nghĩ rằng đó là thời gian git thêm một lệnh để làm điều này. Và đúng, bạn là @huggie, suy nghĩ của tôi chính xác. - Sнаđошƒаӽ


Các câu trả lời:


Đầu tiên, sao chép từ xa Git kho lưu trữ và CD vào nó:

$ git clone git://example.com/myproject
$ cd myproject

Tiếp theo, hãy xem các chi nhánh địa phương trong kho lưu trữ của bạn:

$ git branch
* master

Nhưng có những nhánh khác ẩn trong kho của bạn! Bạn có thể thấy chúng bằng cách sử dụng -a cờ:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Nếu bạn chỉ muốn xem nhanh chi nhánh ở thượng nguồn, bạn có thể xem trực tiếp:

$ git checkout origin/experimental

Nhưng nếu bạn muốn làm việc trên nhánh đó, bạn sẽ cần tạo một nhánh theo dõi cục bộ được thực hiện tự động bằng cách:

$ git checkout experimental

và bạn sẽ thấy

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Đó là dòng cuối cùng ném một số người: "Chi nhánh mới" - huh? Điều thực sự có nghĩa là nhánh được lấy từ chỉ mục và được tạo cục bộ cho bạn. Các Trước dòng thực sự là nhiều thông tin hơn vì nó cho bạn biết rằng chi nhánh đang được thiết lập để theo dõi nhánh từ xa, thường có nghĩa là nhánh origin / branch_name

Bây giờ, nếu bạn nhìn vào các chi nhánh địa phương của bạn, đây là những gì bạn sẽ thấy:

$ git branch
* experimental
  master

Bạn thực sự có thể theo dõi nhiều hơn một kho lưu trữ từ xa bằng cách sử dụng git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

Tại thời điểm này, mọi thứ đang trở nên khá điên rồ, vì vậy hãy chạy gitk để xem điều gì đang xảy ra:

$ gitk --all &

4024
2017-09-16 13:28



Làm thế nào ai đó có thể tự động tạo tất cả các nhánh từ xa, ví dụ: thử nghiệm cho nguồn gốc / thử nghiệm? - Cristian Ciupitu
Cristian: Tôi thường tạo ra một nhánh 'foo' cho mỗi nhánh 'origin / foo', nhưng điều này dẫn đến hai vấn đề: (1) Tôi đã làm rất nhiều nhánh theo dõi cũ. và (2) trong các phiên bản cũ hơn của git, chạy 'git push' sẽ cố gắng đẩy tất cả các nhánh cục bộ của tôi đến một điều khiển từ xa, ngay cả khi những nhánh đó đã cũ. Vì vậy, bây giờ tôi chỉ giữ các chi nhánh địa phương cho những thứ mà tôi đang tích cực phát triển, và truy cập trực tiếp vào các nhánh gốc / * nếu tôi cần thông tin về chúng. (Điều đó nói rằng, bạn có thể sử dụng một kịch bản lệnh shell để phân tích cú pháp 'git branch -a'.) - emk
"git fetch <origin-name> <branch-name>" mang chi nhánh xuống địa phương cho bạn. - Orange Box
Tốt câu trả lời, nhưng kinda bỏ lỡ câu hỏi. Tôi đang tìm kiếm một lớp lót để kiểm tra tất cả các nhánh từ xa. - cmcginty
Câu hỏi đặt ra là nhân bản tất cả các nhánh xa, không kiểm tra chúng. Và, như tôi đã nói ở trên, bạn thực sự không muốn tạo thêm chi nhánh theo dõi địa phương nào hơn mức cần thiết, bởi vì khi chúng thực sự cũ, chúng có thể gây đau đầu. - emk


Nếu bạn có nhiều nhánh từ xa mà bạn muốn tìm nạp cùng một lúc, hãy làm:

$ git pull --all

Bây giờ bạn có thể kiểm tra bất kỳ chi nhánh nào bạn cần, mà không cần nhấn kho lưu trữ từ xa.


745
2018-01-13 16:42



Nếu tôi làm git clone, tôi có nhánh chính tại địa phương và 10 nhánh "remote". Câu trả lời này của Gabe rất hữu ích và trả lời câu hỏi. - basZero
điều này chỉ tìm nạp các nhánh từ xa đã được thêm cục bộ chứ không phải bất kì từ xa chi nhánh - jujule
Lệnh đầu tiên là dư thừa. Đơn giản git pull --all sẽ làm như vậy - nó sẽ không tìm nạp hai lần. Và infosec812 đúng là điều này không trả lời câu hỏi. Tôi tự hỏi làm thế nào điều này có rất nhiều upvotes. - Sven Marnach
Sau khi tôi đã làm git remote update, sau đó thử git branch, Tôi chỉ thấy các chi nhánh địa phương. Nhưng nếu tôi làm git branch -a Bây giờ tôi có thể thấy các nhánh từ xa và tôi có thể làm git pull <branchname> để có được chi nhánh tôi muốn. - Tôi đã đặt câu hỏi này từ tìm kiếm của Google và câu trả lời này giải quyết được vấn đề của tôi. - Jazzerus
Đây không phải là hữu ích cả, không kéo bất kỳ chi nhánh nào khác ngoài các nhánh đang tồn tại. - Avinash R


Điều này Bash kịch bản đã giúp tôi:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

Nó sẽ tạo ra các nhánh theo dõi cho tất cả các nhánh từ xa, trừ master (mà bạn có thể nhận được từ lệnh bản sao gốc). Tôi nghĩ bạn có thể vẫn cần phải làm

git fetch --all
git pull --all

để chắc chắn.

Lót: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs Như thường lệ: thử nghiệm trong thiết lập của bạn trước khi sao chép vũ trụ rm-rf như chúng ta biết

Tín dụng cho một lớp lót chuyển đến người dùng cfi


379
2018-01-21 02:18



Điều này thực sự gần như là một giải pháp hoàn hảo .. Điều duy nhất mà sẽ làm cho nó tốt hơn là nếu chức năng này được xây dựng trong như một lựa chọn trong git. - Deven Phillips
"Lót": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs   Như thường lệ: kiểm tra trong thiết lập của bạn trước khi sao chép rm -rf universe as we know it - cfi
Lệnh này tạo ra các chi nhánh tính năng từ xa như các nhánh bình thường (không phải là các nhánh đặc trưng) - cách sửa lỗi này? - Alex2php
nếu bạn gặp vấn đề với "/" trong tên chi nhánh, có giải pháp dưới đây sử dụng bí danh git. xem câu trả lời của "không ai" trên "trả lời ngày 15 tháng 5 'lúc 11:02" - wemu
Tôi đang cắt tỉa remotes/origin/ để bảo vệ không gian tên: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


Sử dụng --mirror tùy chọn dường như sao chép remote theo dõi các nhánh đúng cách. Tuy nhiên, nó thiết lập kho lưu trữ như là một kho lưu trữ trống, vì vậy bạn phải biến nó trở lại thành một kho lưu trữ bình thường sau đó.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

Tài liệu tham khảo: Câu hỏi thường gặp về Git: Làm cách nào để sao chép kho lưu trữ với tất cả các nhánh được theo dõi từ xa?


280
2017-08-27 17:49



Bạn biết điều này thực sự có vẻ là một câu trả lời khá tốt mặc dù nó không có phiếu bầu. Có bất kỳ cạm bẫy nào để làm theo cách đó không? Tôi đã phải thanh toán một chi nhánh một cách rõ ràng sau khi chạy các lệnh đó. - loop
Điều này kết hợp với git push --mirror là chính xác những gì tôi cần để tạo ra một bản sao chính xác của một repo git từ xa khi di chuyển từ github.com đến một doanh nghiệp github cài đặt. Cảm ơn! - Jacob Fike
@Dave: Thêm trận chung kết git checkout như lệnh cuối cùng để cuối cùng kiểm tra người đứng đầu của chi nhánh hiện tại trên repo nhân bản. Đây là một câu trả lời tuyệt vời, cho đến nay là tốt nhất. Hãy dũng cảm, cuối cùng chúng tôi sẽ đưa bạn đến đầu :-) - cfi
@Dave: Hm. Tôi đang có suy nghĩ thứ hai: --mirror không chỉ là thiết lập tất cả các chi nhánh đang được theo dõi. Nó sao chép tất cả các ref từ nguồn gốc và tiếp theo git remote update sẽ làm điều đó một lần nữa. Hành vi của sự thay đổi kéo. Tôi trở lại để tin rằng bản sao đầy đủ yêu cầu một kịch bản một dòng. - cfi
git clone --mirror rất tốt cho việc sao lưu kho lưu trữ git của bạn ^ _ ^ - TrinitronX


Bạn có thể dễ dàng chuyển sang một chi nhánh mà không cần sử dụng cú pháp "git checkout -b somebranch origin / somebranch" ưa thích. Bạn chỉ có thể làm:

git checkout somebranch

Git sẽ tự động làm điều đúng:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git sẽ kiểm tra xem một chi nhánh có cùng tên tồn tại trong chính xác một điều khiển từ xa hay không, và nếu có, nó sẽ theo dõi nó giống như khi bạn đã xác định rõ ràng rằng nó là một nhánh từ xa. Từ trang git-checkout man của Git 1.8.2.1:

Nếu không tìm thấy <branch> nhưng có tồn tại một nhánh theo dõi trong   chính xác một điều khiển từ xa (gọi nó là <remote>) với một tên phù hợp, coi như   tương đương với

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



Vì vậy, nếu tên của chi nhánh bạn checkout giống với tên của nhánh từ xa, mọi thứ sau "/", thì git sẽ tạo một nhánh có cùng tên, mọi thứ sau "/", "theo dõi" từ xa đó? Và bằng cách theo dõi, chúng tôi có nghĩa là: git push, git pull, vv sẽ được thực hiện trên điều khiển từ xa đó? Nếu điều này là chính xác, sau đó mở rộng câu trả lời của bạn với nhiều thông tin hơn, bởi vì tôi aggree với @Daniel, câu trả lời này xứng đáng hơn đại diện. - Gerard Roche
@BullfrogBlues, câu trả lời cho tất cả các câu hỏi của bạn dường như là có (tôi đang sử dụng git v1.7.7.4). Tôi đồng ý hành vi này nên được biết rõ hơn. (Nó không có trong hướng dẫn cho phiên bản này của git.) Tôi thực sự không thích hành vi này, tôi muốn có một lỗi và phải nói git checkout --track origin/somebranch một cách rõ ràng. - dubiousjim
@dubiousjim: Trên thực tế, đây là trong hướng dẫn sử dụng. git-checkout (1) nói: "Nếu không tìm thấy <branch> nhưng có một nhánh theo dõi trong chính xác một remote (gọi nó là <remote>) với một tên phù hợp, coi như tương đương với 'git checkout -b <branch > --track <remote> / <branch> '"(Git V.1.8.1.1). - sleske
Những gì chúng ta cần là $ git pull * <remote> / * - trong đó "*" là một ký tự đại diện, vì vậy nó kéo tất cả các nhánh, kể cả những nhánh chưa có trên hệ thống cục bộ. làm như thế nào? Chúng tôi có thực sự phải thanh toán / kéo từng chi nhánh chỉ để lấy mã được kéo vào hệ thống địa phương của chúng tôi không? - JosephK


Về,

$ git checkout -b nguồn gốc thử nghiệm / thử nghiệm

sử dụng

$ git checkout -t origin/experimental

hoặc tiết kiệm hơn nhưng dễ nhớ hơn

$ git checkout --track origin/experimental

có thể tốt hơn, về theo dõi một kho lưu trữ từ xa.


88
2017-07-27 06:10





Việc tìm nạp mà bạn đang thực hiện sẽ nhận được tất cả các nhánh từ xa, nhưng nó sẽ không tạo ra các nhánh địa phương cho chúng. Nếu bạn sử dụng gitk, bạn sẽ thấy các nhánh từ xa được mô tả là "remote / origin / dev" hoặc một cái gì đó tương tự.

Để tạo một nhánh nội bộ dựa trên một nhánh từ xa, hãy làm một cái gì đó như:

git checkout -b dev refs / điều khiển từ xa / nguồn gốc / dev

Mà nên trả lại một cái gì đó như:

Chi nhánh dev thiết lập để theo dõi các chi nhánh từ xa refs / remotes / origin / dev.
Chuyển sang nhánh mới "dev"

Bây giờ, khi bạn đang ở nhánh dev, "git pull" sẽ cập nhật dev địa phương của bạn đến cùng điểm với nhánh dev từ xa. Lưu ý rằng nó sẽ lấy tất cả các nhánh, nhưng chỉ kéo nhánh bạn đang ở trên đỉnh của cây.


77
2017-09-15 22:52



Bạn không cần refs / remotes ở đây. git checkout -b dev origin / dev sẽ hoạt động tốt. - emk
Điều này sẽ luôn hoạt động: git checkout -b newlocaldev --track origin/dev. Nếu bạn muốn các chi nhánh địa phương có cùng tên như một từ xa, và từ xa không có một tên khôn lanh, bạn có thể bỏ qua -b newlocaldev. Với mặc định branch.autosetupmerge cài đặt cấu hình và giả sử bạn không có chi nhánh địa phương có tên dev, hai lệnh này có thể thực hiện tương tự: git checkout -b dev origin/dev và chỉ đơn giản git checkout dev. Cuối cùng, git checkout origin/dev không tạo ra một nhánh mới, nhưng chỉ đặt bạn vào trạng thái HEAD tách rời. - dubiousjim
Điều gì xảy ra khi điều khiển từ xa không còn tồn tại nhưng Git quá ngu ngốc để thừa nhận nó đã bị xóa? Điều này giả định bạn cập nhật và git branch -a tiếp tục liệt kê nó như một nhánh từ xa. - jww
Và chúng tôi làm điều này cho hàng chục chi nhánh? - JosephK


Khi bạn thực hiện "git clone git: // location", tất cả các nhánh và thẻ sẽ được tìm nạp.

Để làm việc trên một nhánh từ xa cụ thể, giả sử nó là nguồn gốc từ xa:

git checkout -b branch origin/branchname

57
2017-09-15 22:47



Tôi đánh giá cao lưu ý của bạn "tất cả các chi nhánh và thẻ được tìm nạp". Tôi sẽ bình luận về câu trả lời của bạn là sai, nhưng sau đó tôi đã kiểm tra nó và thấy, bạn hoàn toàn đúng. Vì vậy, trong một cách, bạn đã cung cấp câu trả lời ngắn nhất - nếu bạn nhân bản, bạn đã có nó. Tốt đẹp. Người ta có thể thử thêm: thử $ git branch -a để tìm hiểu, những nhánh xa nào đã có sẵn. - Jan Vlcinsky


Sử dụng bí danh. Mặc dù không có bất kỳ lớp lót Git gốc nào, bạn có thể xác định

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

và sau đó sử dụng nó như

git clone-branches

46
2018-05-15 11:02