2010-02-12 24 views
19

Tôi nhân bản một kho lưu trữ git từ một máy tính sẽ bị xóa.Nhân bản một kho lưu trữ mà không làm cho nó xuất phát từ xa

Có thể sao chép kho lưu trữ mà không tạo kho lưu trữ gốc origin/master không? Hoặc tôi có cần phải sao chép nó, và sau đó xóa các chi nhánh từ xa (được thực hiện với git remote rm origin)?

Chỉnh sửa: Kho lưu trữ chỉ có một nhánh và không có thẻ.

Trả lời

18

Không cần thiết phải đặt kho gốc ban đầu từ xa "nguồn gốc" để sao chép nhánh chính.

Trên máy mới, tạo ra một kho lưu trữ mới:

git init foo 

Sau đó kéo kho cũ vào cái mới, mà không cần tạo một từ xa:

cd foo 
git pull <reference to old repository> 

Tuy nhiên, cần lưu ý rằng cách dễ nhất để lưu kho lưu trữ sẽ là chỉ cần zip thư mục của kho lưu trữ lên và di chuyển các tệp đến một máy mới. Điều đó sẽ lưu giữ bất kỳ và tất cả điều khiển từ xa, thẻ, v.v.

Như đã lưu ý bên dưới, khi sao chép kho lưu trữ, hãy cẩn thận khi đi từ các hệ thống tệp phân biệt chữ hoa chữ thường (ví dụ: Linux, Mac, NTFS). ví dụ: Fat32).

+1

Thật tuyệt, tôi không biết bạn có thể làm điều đó. Bạn có thể nhân bản các nhánh không phải là người chủ theo cách đó không? – ebneter

+0

Nếu áp dụng sau, không sao chép một cái gì đó từ một phân vùng không FAT32 đến FAT32 và ngược lại. http://stackoverflow.com/questions/1754108/i-backed-up-a-git-project-and-got-fatal-not-a-git-repository –

+0

Bạn có làm trước đây có hoặc không có 'tệp:/// ', tức là sử dụng' git pull/home/username/blah' so với 'git pull file: /// home/username/blah'? –

1

Tôi tin rằng bạn sẽ cần phải xóa chi nhánh từ xa.

+0

Nếu bạn muốn tên khác, bạn có thể làm git clone -o not_origin –

+0

Vấn đề là khi bạn xóa từ xa (không phải nhánh từ xa), bạn cũng xóa tất cả các nhánh từ xa/. – ebneter

+0

@ netnet: ý của bạn là gì bằng cách "xóa từ xa (không phải nhánh từ xa)"? –

1

Repo từ xa có nhiều nhánh hơn chỉ là chính không? Nó phức tạp hơn nếu nó có; bạn cũng cần tạo bản sao cục bộ của tất cả các nhánh vì khi bạn xóa từ xa, tất cả các nhánh từ xa/gốc sẽ biến mất. (Tôi chỉ cố gắng nó!)

Vì vậy, bạn có thể làm một cái gì đó như thế này:

git clone <remote_url> 
cd <repo> 
for b in $(git branch -r | grep -v HEAD | grep -v master);do 
    git branch $(basename $b) $b 
done 
git remote rm origin 

Tất nhiên, như Jess Bowers nói, nó thậm chí còn dễ dàng hơn để chỉ tar hoặc zip nó lên và di chuyển các tập tin, nếu bạn có quyền truy cập vào máy để thực hiện điều đó.

Bạn cũng có thể chỉ cần thực hiện một bản sao trần:

git clone --bare <remote_url> 

và sau đó làm nhái mới từ đó.

2

Cách chung để xử lý một bộ chuyển tiếp như vậy là git bundle. Xem Backup of github repo.

Từ thứ hai (mới) máy tính để bàn của bạn:

git bundle create file:///\\oldDesktop/share/myGitRepo --all 

để tạo ra một tập tin địa phương mà từ đó bạn sẽ có thể nhân bản một git repo địa phương.

Lưu ý: giao thức file:/// sẽ hỗ trợ UNC (quy ước đặt tên Universal) con đường Windows, với phần còn lại của con đường sử dụng '/' thay vì '\'. Xem Git on a Windows Lan.

6

Trước tiên, bạn có thể sử dụng tùy chọn --origin <name>git clone

--origin < tên >, -o < tên >

Thay vì sử dụng tên từ xa gốc để theo dõi kho lưu trữ ngược dòng, sử dụng < tên >.

Thứ hai, bạn có thể sử dụng git remote add để thêm kho để lấy từ kho lưu trữ để tồn tại (do đó bạn có thể sử dụng git init, sau đó git remote add <name> <url>).


Nếu bạn muốn tạo một tấm gương của kho lưu trữ, với refs/heads/* đi vào refs/heads/* trong clone, bạn có thể init kho, thiết lập refspec thích hợp, và sau đó fetch ...

Hoặc bạn có thể sử dụng git clone --mirror, sẽ trả lời phiên bản hiện tại của câu hỏi OP.

Điều này sẽ không bảo vệ cấu hình (bao gồm điều khiển từ xa), trạng thái worktree, reflog, v.v. Cho điều này, bạn cần phải sao chép toàn bộ kho, dưới dạng Jess Bowers said.

+0

Sự cố khi sử dụng '--origin' là *** bạn phải chỉ định nguồn gốc từ xa ***, đúng không? Tôi đang cố gắng tìm một cách đơn giản để sao chép (hoặc sao chép hiệu quả) sao cho bản sao không có bất kỳ bí danh từ xa nào được định cấu hình. Tất nhiên bạn luôn có thể làm 'git remote rm origin', nhưng tôi đã hy vọng tìm được thứ gì đó sẽ làm điều này trong một bước thay thế. –

+2

@Cupcake: Thật không may có (theo như tôi biết) không có giải pháp một bước. Bạn có thể sao chép (1) sau đó loại bỏ thông tin từ xa 'nguồn gốc' (2), hoặc khởi tạo kho lưu trữ (1) và tìm nạp tất cả các chi nhánh và thẻ bằng cách sử dụng URL thay vì tên từ xa (2). –

+0

Câu trả lời của bạn dành cho một câu hỏi khác với câu hỏi được hỏi. –

Các vấn đề liên quan