it-swarm-vi.tech

Làm thế nào để sao chép tất cả các chi nhánh từ xa trong Git?

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

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

3746
Peter Coulton

Đầu tiên, sao chép một điều khiển từ xa Gitcd vào nó:

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

Tiếp theo, hãy xem các nhánh cục bộ 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 những điều này bằng cách sử dụng cờ -a:

$ 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 tại một chi nhánh thượng nguồn, bạn có thể kiểm tra 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'

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à chi nhánh được lấy từ chỉ mục và được tạo cục bộ cho bạn. Dòng trước thực sự có nhiều thông tin hơn vì nó cho bạn biết rằng 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 &
4191
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.

763
Gabe Kopley

Điều này Bash script đã giúp tôi hiểu:

#!/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 các nhánh theo dõi cho tất cả các nhánh từ xa, ngoại trừ master (mà bạn có thể đã nhận được từ lệnh clone gốc). Tôi nghĩ rằng bạn có thể vẫn cần phải làm một 

git fetch --all
git pull --all

để chắc chắn.

Một lớp 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 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 cho người dùng cfi

388
bigfish

Sử dụng tùy chọn --mirror dường như sao chép các nhánh theo dõi remote đúng cách . Tuy nhiên, nó thiết lập kho lưu trữ dưới dạng kho lưu trữ trần, do đó bạn phải biến nó trở lại thành 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

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?

300
Dave

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

Nếu không tìm thấy <nhánh> nhưng có tồn tại 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 tên trùng khớp, coi là tương đương với

$ git checkout -b <branch> --track <remote>/<branch>
208
Nikos C.

Về,

$ git checkout -b thử nghiệm Xuất xứ/thử nghiệm

sử dụng

$ git checkout -t Origin/experimental

hoặc dài dòng hơn nhưng dễ nhớ hơn

$ git checkout --track Origin/experimental

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

90
murphytalk

Việc tìm nạp mà bạn đang làm 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 cục bộ 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à "điều khiển từ xa/Xuất xứ/dev" hoặc một cái gì đó tương tự.

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

kiểm tra git -b dev refs/điều khiển từ xa/Xuất xứ/dev

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

Chi nhánh dev được thiết lập để theo dõi các ref/điều khiển từ xa/Origin/dev .
 Chuyển sang một nhánh mới "dev"

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

78
Luuk Paulussen

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

Để hoạt động trên một nhánh từ xa cụ thể, giả sử đó là điều khiển từ xa gốc:

git checkout -b branch Origin/branchname
57
elmarco

Sử dụng bí danh. Mặc dù không có bất kỳ lớp lót Git riêng nào, bạn có thể định nghĩa riêng của mình là

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ư là

git clone-branches
49
nobody

Điều này không quá phức tạp, các bước rất đơn giản và đơn giản như sau;

git fetch Origin Điều này sẽ mang tất cả các chi nhánh từ xa đến địa phương của bạn.

git branch -a Điều này sẽ cho bạn thấy tất cả các chi nhánh từ xa.

git checkout --track Origin/<branch you want to checkout>

Xác minh xem bạn có ở nhánh mong muốn bằng lệnh sau không;

git branch

Đầu ra sẽ như thế này;

*your current branch 
some branch2
some branch3 

Lưu ý dấu * biểu thị nhánh hiện tại.

44
Sam

Tại sao bạn chỉ thấy "chủ"

git clone tải xuống tất cả các chi nhánh từ xa nhưng vẫn coi chúng là "từ xa", mặc dù các tệp được đặt trong kho lưu trữ mới của bạn. Có một ngoại lệ cho điều này, đó là quá trình nhân bản tạo ra một nhánh cục bộ gọi là "master" từ nhánh từ xa gọi là "master". Theo mặc định, git branch chỉ hiển thị các nhánh cục bộ, đó là lý do tại sao bạn chỉ thấy "chính chủ".

git branch -a hiển thị tất cả các nhánh, bao gồm các nhánh từ xa .


Làm thế nào để có được chi nhánh địa phương

Nếu bạn thực sự muốn làm việc trên một chi nhánh, có lẽ bạn sẽ muốn có một phiên bản "cục bộ" của nó. Để chỉ cần tạo các nhánh cục bộ từ các nhánh từ xa (mà không cần kiểm tra chúng và do đó thay đổi nội dung của thư mục làm việc của bạn) , bạn có thể làm như thế này:

git branch branchone Origin/branchone
git branch branchtwo Origin/branchtwo
git branch branchthree Origin/branchthree

Trong ví dụ này, branchone là tên của một nhánh cục bộ bạn đang tạo dựa trên Origin/branchone; thay vào đó, nếu bạn muốn tạo các nhánh cục bộ với các tên khác nhau, bạn có thể làm điều này:

git branch localbranchname Origin/branchone

Khi bạn đã tạo một chi nhánh địa phương, bạn có thể thấy nó với git branch (hãy nhớ rằng, bạn không cần -a để xem các chi nhánh địa phương).

43
Cerran

Muộn còn hơn không, nhưng đây là cách tốt nhất để làm điều này:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

Tại thời điểm này, bạn có một bản sao hoàn chỉnh của repo từ xa với tất cả các nhánh của nó (xác minh bằng git branch). Bạn có thể sử dụng --mirror thay vì --bare nếu repo từ xa của bạn có điều khiển từ xa.

42
Jacob Fike

Chỉ cần làm điều này:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from Origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/Origin/HEAD -> Origin/master
  remotes/Origin/branchxyz
  remotes/Origin/branch123

Bạn thấy, 'git clone git: //example.com/myprojectt' tìm nạp mọi thứ, ngay cả các nhánh, bạn chỉ cần kiểm tra chúng, sau đó nhánh địa phương của bạn sẽ được tạo.

38
rapher

Bạn chỉ cần sử dụng "git clone" để có được tất cả các chi nhánh.

git clone <your_http_url>

Mặc dù bạn chỉ nhìn thấy nhánh chính, bạn có thể sử dụng "nhánh git -a" để xem tất cả các nhánh.

git branch -a

Và bạn có thể chuyển sang bất kỳ chi nhánh nào bạn đã có.

git checkout <your_branch_name>

Đừng lo lắng rằng sau khi bạn "git clone", bạn không cần kết nối với repo từ xa, "git Branch -a" và "git checkout" có thể chạy thành công khi bạn đóng wifi. Vì vậy, nó đã được chứng minh rằng khi bạn thực hiện "git clone", nó đã sao chép tất cả các nhánh từ repo từ xa. Sau đó, bạn không cần repo từ xa, địa phương của bạn đã có tất cả các mã của chi nhánh. 

23
Haimei

Một git clone được cho là sao chép toàn bộ kho lưu trữ. Hãy thử nhân bản nó, rồi chạy git branch -a. Nó nên liệt kê tất cả các chi nhánh. Nếu sau đó bạn muốn chuyển sang nhánh "foo" thay vì "master", hãy sử dụng git checkout foo.

22
MattoxBeckman

Sử dụng công cụ của tôi git_remote_branch (bạn cần cài đặt Ruby trên máy của mình). Nó được xây dựng đặc biệt để làm cho các thao tác chi nhánh từ xa trở nên dễ dàng.

Mỗi lần nó thực hiện một thao tác thay mặt bạn, nó sẽ in nó màu đỏ tại bàn điều khiển. Theo thời gian, cuối cùng chúng dính vào não bạn :-)

Nếu bạn không muốn grb chạy các lệnh thay mặt bạn, chỉ cần sử dụng tính năng 'giải thích'. Các lệnh sẽ được in ra bàn điều khiển của bạn thay vì thực thi cho bạn.

Cuối cùng, tất cả các lệnh đều có bí danh, để làm cho việc ghi nhớ dễ dàng hơn.

Lưu ý rằng đây là phần mềm alpha ;-)

Đây là sự giúp đỡ khi bạn chạy grb help:

 git_remote_branch phiên bản 0.2.6 

 Sử dụng:

 grb tạo nhánh_name [Origin_server] 

 grb xuất bản Branch_name [Origin_server] 

 grb đổi tên nhánh_name [Origin_server] 

 grb xóa nhánh_name [Origin_server] 

 grb theo dõi nhánh_name [Origin_server] 



 Ghi chú: 
 - Nếu Origin_server không được chỉ định, tên 'Origin' được giả sử 
 (mặc định của git) 
 - Chức năng đổi tên đổi tên chi nhánh hiện tại 

 Lệnh meta giải thích: bạn cũng có thể thêm bất kỳ lệnh nào với 
 Từ khóa 'giải thích'. Thay vì thực thi lệnh, git_remote_branch 
 Sẽ chỉ xuất ra danh sách các lệnh bạn cần chạy để thực hiện 
 Mục tiêu đó .

 Thí dụ: 
 grb giải thích tạo 
 grb giải thích tạo my_branch github 

 Tất cả các lệnh cũng có bí danh: 
 tạo: tạo, mới 
 xóa: xóa, hủy, hủy, xóa, rm 
 xuất bản: xuất bản, từ xa 
 đổi tên: đổi tên, rn, mv, di chuyển 
 theo dõi: theo dõi, theo dõi, lấy, lấy 
19
webmat

tất cả các câu trả lời tôi thấy ở đây là hợp lệ nhưng có một cách gọn gàng hơn nhiều để sao chép một kho lưu trữ và kéo tất cả các nhánh cùng một lúc. 

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, khi bạn muốn sao chép một repo với rất nhiều nhánh, tất cả các cách minh họa ở trên đều dài và tẻ nhạt đối với một cách nhanh hơn và nhanh hơn mà tôi sẽ trình bày, 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 bản sao 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.

  1. 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
  1. 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 Branch" và 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. 

15
FedericoCapaldo

Nhìn vào một trong những câu trả lời cho câu hỏi tôi nhận thấy rằng có thể rút ngắn nó:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

Nhưng hãy cẩn thận, nếu một trong những nhánh từ xa được đặt tên là ví dụ: admin_master nó sẽ không được tải xuống!

Cảm ơn bigfish cho ý tưởng ban đầu

12
Tebe

OK, khi bạn sao chép repo của mình, bạn có tất cả các chi nhánh ở đó ...

Nếu bạn chỉ làm git branch, chúng là loại ẩn ...

Vì vậy, nếu bạn muốn xem tất cả tên chi nhánh, chỉ cần thêm cờ --all như thế này:

git branch --all hoặc git branch -a

Nếu bạn chỉ kiểm tra chi nhánh, bạn sẽ có được tất cả những gì bạn cần.

Nhưng làm thế nào nếu nhánh được tạo bởi người khác sau khi bạn nhân bản?

Trong trường hợp này, chỉ cần làm:

git fetch

và kiểm tra lại tất cả các chi nhánh ...

Nếu bạn muốn tìm nạp và kiểm tra cùng một lúc, bạn có thể làm:

git fetch && git checkout your_branch_name

Cũng tạo ra hình ảnh dưới đây để bạn đơn giản hóa những gì tôi đã nói:

 git branch --all to get all branches

12
Alireza

Nhân bản từ một repo cục bộ sẽ không hoạt động với git clone & git fetch: rất nhiều nhánh/thẻ sẽ vẫn không được tải.

Để có được một bản sao với tất cả các chi nhánh và thẻ.

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

Để có được một bản sao với tất cả các chi nhánh và thẻ nhưng cũng có một bản sao hoạt động:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
11
raisercostin
#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/Origin/} $branch
done

Các mã này sẽ kéo tất cả các mã chi nhánh từ xa đến repo cục bộ.

11
Albert.Qing

Để sao chép-dán vào dòng lệnh:

git checkout master ; remote=Origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

Để dễ đọc hơn:

git checkout master ;
remote=Origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


Điều này sẽ:

  1. kiểm tra tổng thể (để chúng tôi có thể xóa chi nhánh chúng tôi đang ở trên)
  2. chọn từ xa để thanh toán (thay đổi thành bất kỳ điều khiển từ xa nào bạn có)
  3. lặp qua tất cả các nhánh của điều khiển từ xa trừ master và HEAD
    1. xóa nhánh cục bộ (để chúng ta có thể kiểm tra các nhánh được cập nhật lực lượng)
    2. kiểm tra chi nhánh từ xa
  4. kiểm tra chủ (vì lợi ích của nó)

Dựa trên câu trả lời của VonC .

10
ikaruss

Tôi đã viết các hàm Powershell nhỏ này để có thể kiểm tra tất cả các nhánh git của tôi, trên Remote remote.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "Origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Có thể tìm thấy nhiều chức năng git hơn trên repo cài đặt git của tôi

8
gringo_dave

Tôi cần phải làm chính xác như vậy. Đây là Ruby script của tôi.

#!/usr/bin/env Ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /Origin\//.match(line)
     remote[line.gsub(/Origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
8
user43685

Git thường (khi không được chỉ định) tìm nạp tất cả các nhánh và/hoặc thẻ (ref, xem: git ls-refs) từ một hoặc nhiều kho lưu trữ khác cùng với các đối tượng cần thiết để hoàn thành lịch sử của chúng. Nói cách khác, nó tìm nạp các đối tượng có thể truy cập được bởi các đối tượng đã được tải xuống. Xem: git fetch thực sự làm gì?

Đôi khi bạn có thể có các nhánh/thẻ không được kết nối trực tiếp với thẻ hiện tại, vì vậy git pull --allgit fetch --all sẽ không giúp ích trong trường hợp đó, nhưng bạn có thể liệt kê chúng bằng cách:

git ls-remote -h -t Origin

và lấy chúng bằng tay bằng cách biết tên ref.

Vì vậy, để _/lấy tất cả chúng, hãy thử:

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

Tham số --depth=10000 có thể hữu ích nếu bạn đã lưu trữ kho lưu trữ.

Sau đó kiểm tra lại tất cả các chi nhánh của bạn:

git branch -avv

Nếu ở trên không giúp được gì, bạn cần thêm các nhánh bị thiếu theo cách thủ công vào danh sách được theo dõi (vì chúng bị mất bằng cách nào đó):

$ git remote -v show Origin
...
  Remote branches:
    master      tracked

bởi git remote set-branches như:

git remote set-branches --add Origin missing_branch

vì vậy nó có thể xuất hiện dưới remotes/Origin sau khi tìm nạp:

$ git remote -v show Origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/Origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> Origin/missing_branch

Xử lý sự cố

Nếu bạn vẫn không thể nhận được bất cứ thứ gì ngoài nhánh chính, hãy kiểm tra các mục sau:

  • Kiểm tra kỹ từ xa của bạn (git remote -v), ví dụ .
    • Xác thực rằng git config branch.master.remoteOrigin.
    • Kiểm tra xem Origin trỏ đến đúng URL thông qua: git remote show Origin (xem phần này bài đăng ).
6
kenorb

Kể từ đầu năm 2017, câu trả lời trong bình luận này tác phẩm:

git fetch <Origin-name> <branch-name> mang chi nhánh xuống cho bạn. Trong khi điều này không kéo tất cả các nhánh cùng một lúc, bạn có thể thực hiện đơn lẻ trên mỗi nhánh này.

6
ashes999

Không có câu trả lời nào trong số này cắt giảm, ngoại trừ người dùng không ai đi đúng hướng.

Tôi gặp rắc rối với việc chuyển repo từ máy chủ/hệ thống này sang máy chủ khác. Khi tôi nhân bản repo, nó chỉ tạo một nhánh cục bộ cho master nên khi tôi đẩy sang remote mới, chỉ có nhánh master được đẩy.

Vì vậy, tôi thấy hai phương pháp RẤT hữu ích. Hy vọng họ giúp đỡ người khác.

Cách 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git Push --all newrepo
git Push --tags newrepo

Cách 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git Push --all newrepo
git Push --tags newrepo
6
Gaui

Sử dụng các lệnh mà bạn có thể nhớ

Tôi đang sử dụng Bitbucket, một dịch vụ lưu trữ lưu trữ của Atlassian. Vì vậy, tôi cố gắng làm theo tài liệu của họ. Và điều đó làm việc hoàn hảo cho tôi. Với các lệnh ngắn và dễ dàng sau đây, bạn có thể kiểm tra chi nhánh từ xa của mình.

Đầu tiên, sao chép kho lưu trữ của bạn, sau đó thay đổi vào thư mục đích. Và cuối cùng nhưng không kém phần tìm nạp và thanh toán:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

Đó là nó. Dưới đây là một ví dụ thực tế hơn thế giới:

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

Bạn sẽ tìm thấy thông tin chi tiết về các lệnh trong tài liệu: Lệnh Clone , Lệnh Fetch , Lệnh Checkout

6
Phil

Đây là một lệnh một lớp lót ngắn khác Tạo các nhánh cục bộ cho tất cả các nhánh từ xa:

(git branch -r | sed -n '/->/!s#^  Origin/##p' && echo master) | xargs -L1 git checkout

Nó cũng hoạt động đúng nếu theo dõi các nhánh cục bộ đã được tạo . Bạn có thể gọi nó sau git clone đầu tiên hoặc bất kỳ lúc nào sau đó.

Nếu bạn không cần phải kiểm tra chi nhánh master sau khi nhân bản, hãy sử dụng 

git branch -r | sed -n '/->/!s#^  Origin/##p'| xargs -L1 git checkout
5
jofel

Đây là một câu trả lời sử dụng awk. Phương pháp này sẽ đủ nếu được sử dụng trên một repo mới.

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

Các nhánh hiện có sẽ chỉ được kiểm tra hoặc khai báo như đã có trong đó, nhưng các bộ lọc có thể được thêm vào để tránh xung đột.

Nó cũng có thể được sửa đổi để gọi lệnh git checkout -b <branch> -t <remote>/<branch> rõ ràng.

Câu trả lời này theo sau Nikos C. 's ý tưởng .


Thay vào đó, chúng ta có thể chỉ định chi nhánh từ xa thay thế. Điều này dựa trên murphytalk 's câu trả lời .

git branch -r | awk '{ system("git checkout -t " $NF) }'

Nó ném các thông báo lỗi nghiêm trọng về xung đột nhưng tôi thấy chúng vô hại.


Cả hai lệnh có thể được đặt bí danh.

Sử dụng none 's answer làm tham chiếu, chúng ta có thể có các lệnh sau để tạo bí danh:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

Cá nhân tôi sẽ sử dụng track-all hoặc track-all-branches.

4
konsolebox

git clone --mirror trên repo gốc hoạt động tốt cho việc này.

git clone --mirror /path/to/original.git
git remote set-url Origin /path/to/new-repo.git
git Push -u Origin
3
Bernd Jungblut

Tôi sẽ thêm 2 xu của mình vào đây vì tôi đã đến đây để cố gắng tìm ra cách kéo xuống một chi nhánh từ xa mà tôi đã xóa tại địa phương. Nguồn gốc không phải của tôi và tôi không muốn gặp rắc rối khi sao chép lại mọi thứ 

Điều này làm việc cho tôi:

giả sử bạn cần tạo lại chi nhánh cục bộ:

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-Origin/recreated-branch-name

Vì vậy, nếu tôi rẽ nhánh từ gituser/master sang sjp và sau đó phân nhánh nó thành sjp/mynewbranch thì nó sẽ trông như thế này:

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch
2
Camwyn

Đến bữa tiệc muộn một chút, nhưng tôi nghĩ điều này thật khó

mkdir YourRepo
cd YourRepo
git init --bare .git                       # create a bare repo
git remote add Origin REMOTE_URL           # add a remote
git fetch Origin refs/heads/*:refs/heads/* # fetch heads
git fetch Origin refs/tags/*:refs/tags/*   # fetch tags
git init                                   # reinit work tree
git checkout master                        # checkout a branch

Nếu điều này làm điều gì đó không mong muốn, tôi muốn biết. Tuy nhiên, cho đến nay, điều này làm việc cho tôi.

0
Andy

Biến thể này sẽ sao chép một repo từ xa với tất cả các nhánh có sẵn tại địa phương mà không phải kiểm tra từng nhánh một. Không có kịch bản ưa thích cần thiết.

Tạo một thư mục có cùng tên của repo mà bạn muốn sao chép và cd vào ví dụ:

mkdir somerepo
cd somerepo

Bây giờ thực hiện các lệnh này nhưng với tên người dùng/reponame thực tế 

git clone --bare [email protected]:someuser/somerepo.git .git
git config --bool core.bare false
git reset --hard
git branch

Voiala! Bạn có tất cả các chi nhánh ở đó!

0
lacostenycoder

Dưới đây là tập lệnh bash để tìm nạp tất cả các nhánh và thẻ của dự án git dưới dạng ảnh chụp nhanh vào các thư mục riêng biệt. 

https://Gist.github.com/hfossli/7562257

Có thể không phải những gì được hỏi trực tiếp, nhưng một số người có thể đến đây để tìm giải pháp này.

0
hfossli