Git clone không có thư mục .git


144

Có một lá cờ để vượt qua gitkhi thực hiện một bản sao, nói rằng không sao chép .gitthư mục? Nếu không, làm thế nào về một cờ để xóa .gitthư mục sau khi nhân bản?


41
Câu hỏi này không phải là một bản sao của Cách thực hiện "xuất git" (như "xuất svn") . Câu hỏi này hỏi về cách sao chép một (từ xa) kho mà không cần các .gitthư mục. Bản dupe bị cáo buộc hỏi làm thế nào để xuất kho lưu trữ hiện có nơi bạn đã có .gitthư mục.
mknaf

3
Đồng ý. Bạn không thể git archivelưu trữ từ xa như giải pháp "có thể trùng lặp".
Vladislav Rastrusny

Câu trả lời:


214

Sử dụng

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • Tùy chọn độ sâu sẽ đảm bảo sao chép ít nhất lịch sử có thể để có được repo đó.
  • Tùy chọn nhánh là tùy chọn và nếu không được chỉ định sẽ nhận được bản gốc.
  • Dòng thứ hai sẽ làm cho thư mục của bạn dirformynewrepokhông phải là kho lưu trữ Git nữa.
  • Nếu bạn đang thực hiện bản sao mô đun đệ quy, tham số độ sâu và nhánh không áp dụng cho các mô hình con.

19
!$/.gitnghĩa là gì
Jürgen Paul

15
Đối với những người quan tâm, đó là một trong những từ chỉ định , một phần của tính năng mở rộng lịch sử trong Bash và zsh.
Rufflewind

Có cách nào để có được độ sâu = 1 của tất cả các nhánh trong repo không? không chỉ là chủ hoặc chi nhánh được chỉ định
Gayan Pathirage 7/03/2016

2
bạn làm điều đó với tùy chọn --no-single-Branch, vì --depth ngụ ý --single-Branch, bạn có thể bỏ ẩn nó với --no-single-Branch. (Lấy từ trang git clone man)
Robert Stoddard

8
Sử dụng !$, trong khi đúng về mặt kỹ thuật trong trường hợp này, không có gì giúp những người không nhận ra cú pháp hiểu câu trả lời cho câu hỏi thực tế. Nó cũng dựa vào lệnh thứ hai ngay sau lệnh đầu tiên và trong cùng một shell. Nếu bất cứ ai bỏ qua những yêu cầu ngầm đó, cuối cùng họ có thể xóa một cái gì đó khác hoàn toàn. Do đó, tôi đề nghị câu trả lời của bạn có thể được cải thiện bằng cách chỉ định rõ ràng tên đó dirformynewrepolàm đối số cho rmlệnh vì nó sẽ làm cho kết nối giữa cả hai lệnh rõ ràng hơn nhiều.
davidA

29

vì bạn chỉ muốn các tập tin, bạn không cần phải coi nó như một repo git.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

và điều này chỉ hoạt động với đường dẫn cục bộ và đường dẫn ssh / rsync từ xa, nó có thể không hoạt động nếu máy chủ từ xa chỉ cung cấp quyền truy cập git: // hoặc https: //.


Điều đó sẽ không xem xét .gitignore?
JJ Roman

itub là đúng, đây chỉ là sao chép cây làm việc. kiểm tra git được sử dụng để làm điều đó đúng, bây giờ nó không còn nữa.
Sylvain

vậy, bạn sẽ làm gì nếu máy chủ chỉ cung cấp quyền truy cập git: //?
Rainb

3

Ngoài ra, nếu bạn đã cài đặt Node.js , bạn có thể sử dụng lệnh sau:

npx degit GIT_REPO

npxđi kèm với Node và nó cho phép bạn chạy các gói dựa trên nút nhị phân mà không cần cài đặt chúng trước (thay vào đó, trước tiên bạn có thể cài đặt degittrên toàn cầu bằng cách sử dụng npm i -g degit).

Degit là một công cụ được tạo bởi Rich Harris, người tạo ra Svelte và Rollup, anh ta sử dụng để nhanh chóng tạo một dự án mới bằng cách sao chép một kho lưu trữ mà không giữ thư mục git. Nhưng nó cũng có thể được sử dụng để sao chép bất kỳ repo nào một lần ...


-1

Bạn luôn có thể làm

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

44
tải về mọi thứ và xóa dir sau? ví dụ emacs có 95% của 1GB trong .git. vì vậy --depth = 1 là giải pháp ở đây rõ ràng.
RParadox

1
tôi vẫn thấy thư mục .git khi tôi làm sâu = 1
Aryeh Armon

@AryehArmon tất nhiên bạn nhìn thấy nó. Sử dụng --depth không ngăn chặn việc tạo .git, nó chỉ làm cho nó trở thành một bản sao nông, kích thước nhỏ hơn nhiều cho .git. Nhưng nếu bạn không muốn nó ở đó, bạn cần phải loại bỏ nó sau đó.
zeycus
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.