Git Clone: ​​Chỉ các tập tin, xin vui lòng?


141

Tôi muốn sao chép một repo GIT và KHÔNG kết thúc với một .gitthư mục. Nói cách khác, tôi chỉ muốn các tập tin. Có cách nào để làm việc này không?

git clone --no-checkoutđã làm ngược lại chính xác những gì tôi muốn (chỉ cho tôi .gitthư mục).

Tôi đang cố gắng làm điều đó cho một repo từ xa , không phải là một địa phương, có nghĩa đây không phải là một bản sao của " Cách thực hiện một xuất khẩu git xuất khẩu (như xuất khẩu svn xuất khẩu) " (mặc dù giải pháp cuối cùng có thể là tương tự).



@Greg Hewgill Tôi đang cố gắng thực hiện việc này từ một repo từ xa. Không chắc chắn nếu điều đó làm cho câu hỏi này độc đáo, mặc dù.
Dan Rosenstark

1
Mặc dù đây là một câu hỏi mới hơn, nhưng tôi nghĩ rằng đây là giá trị để kiểm tra: stackoverflow.com/questions/11497457/
mẹo

1
Xem câu trả lời cập nhật của tôi : git archivebây giờ (Q4 2017) chính xác hơn và sẽ không bao gồm các thư mục trống.
VonC

1
Không có gì. Rõ ràng, nhận xét của bạn đã được gắn cờ và xóa ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

Câu trả lời:


75

Lệnh git sẽ gần nhất với những gì bạn đang tìm kiếm git archive.
Xem sao lưu dự án sử dụng git : nó sẽ bao gồm trong một kho lưu trữ tất cả các tệp (bao gồm cả các mô hình con nếu bạn đang sử dụng git-archive-alltập lệnh)

Sau đó, bạn có thể sử dụng kho lưu trữ đó ở bất cứ đâu, chỉ cung cấp cho bạn các tệp, không có .gitthư mục.

git archive --remote=<repository URL> | tar -t

Nếu bạn cần các thư mục và tệp chỉ từ cấp độ đầu tiên:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

Để chỉ liệt kê các thư mục cấp đầu tiên của một repo từ xa:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

Lưu ý: điều đó không hoạt động đối với GitHub (không được hỗ trợ)

Vì vậy, bạn sẽ cần sao chép (nông để nhanh chóng bước nhân bản), và sau đó lưu trữ cục bộ :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

Một tùy chọn khác là tạo một bản sao nông (như được đề cập dưới đây), nhưng định vị thư mục .git ở nơi khác.

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

Thư mục repo sẽ chỉ bao gồm các tập tin, không có .git.

Lưu ý: git --git-dir là một tùy chọn của lệnhgit , không git clone.


Cập nhật với Git 2.14.X / 2.15 (Q4 2017): sẽ đảm bảo tránh thêm các thư mục trống .

" git archive", đặc biệt là khi được sử dụng với pathspec, đã lưu trữ một thư mục trống trong đầu ra của nó, mặc dù chính Git không bao giờ làm như vậy.
Điều này đã được sửa chữa.

Xem cam kết 4318094 (ngày 12 tháng 9 năm 2017) của René Scharfe (``) .
Gợi ý: Jeff King ( peff) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 62b1cb7 , ngày 25 tháng 9 năm 2017)

archive: không thêm các thư mục trống vào kho lưu trữ

Trong khi git không theo dõi các thư mục trống, git archivecó thể bị lừa đưa một số vào kho lưu trữ.
Mặc dù được hỗ trợ bởi cơ sở dữ liệu đối tượng, nhưng nó không thể được biểu diễn trong chỉ mục và do đó không có khả năng xảy ra trong tự nhiên.

Vì các thư mục trống không được git hỗ trợ, chúng cũng không nên được ghi vào tài liệu lưu trữ.
Nếu một thư mục trống thực sự cần thiết thì nó có thể được theo dõi và lưu trữ bằng cách đặt một .gitignoretệp trống trong đó.


4
Điều này làm việc cho tôi. Tôi sẽ thêm một điều nữa. Nếu bạn không quan tâm đến thư mục .git, thì tôi sẽ sử dụng lệnh này:git --git-dir=/dev/null clone --depth=1 /url/to/repo
HumanSky

Điều này không xóa thư mục .git
aliasav

@VonC Tôi đã thử: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav 17/03/2016

1
Chạy git archive --remote=https://github.com/pornel/dssim.git @ | tar -ttôi nhận được tar: This does not look like a tar archive. Nó không hoạt động với GitHub? Ngoài ra, @có nghĩa là gì?
André Werlang

2
@ AndréWerlang 7 năm sau ... Tôi không chắc lắm về điều này @: Tôi đã gỡ bỏ nó. Ngoài ra GitHub không hỗ trợ điều khiển từ xa git archive: Tôi đã chỉnh sửa câu trả lời để đề xuất một giải pháp thay thế.
VonC

59
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

lấy từ đây


2
--format=tarlà không cần thiết "tar" là đầu ra mặc định, không cần chỉ định.
VasiliNovikov

1
đường ống vào tar xlà đủ
Jens Bannmann

42

bạn có thể tạo một bản sao nông để chỉ nhận được một vài sửa đổi cuối cùng:

 git clone --depth 1 git://url

sau đó chỉ cần xóa thư mục .git hoặc sử dụng git archiveđể xuất cây của bạn.


Làm thế nào để ngăn chặn lỗi này khi tôi cập nhật nó bằng cách lặp lại bản sao: "fatal: Destination path 'XYZ' đã tồn tại và không phải là một thư mục trống."
Sohail Si

1
@SohailSi: hoặc sao chép vào một vị trí mới hoặc xóa thư mục cũ. Có lẽ bạn nên tìm nạp các bản sửa đổi mới, nếu bạn muốn cập nhật bản sao cục bộ của mình.
knittl

3

Tại sao không thực hiện một bản sao và sau đó xóa .gitthư mục để bạn chỉ có một bản sao làm việc trần?

Chỉnh sửa: Hoặc trong thực tế tại sao sử dụng bản sao? Hơi khó hiểu khi bạn nói rằng bạn muốn có một repo git nhưng không có .gitthư mục. Nếu bạn có nghĩa là bạn chỉ muốn một bản sao của một số trạng thái của cây thì tại sao không làm cp -Rtrong vỏ thay vì git clone và sau đó xóa .gitsau đó.


Cảm ơn vì điều đó. Các tập tin trong một repo git. Tôi đã hy vọng có thể hướng người dùng Mac lấy một bản sao của repo trong một dòng, mà không trở thành repo GIT.
Dan Rosenstark

Bạn không nên có người trực tiếp nhận mã từ repo nếu họ không thể sử dụng nó (tức là không có kho Git).
thay thế vào

@Amoss Phát hành tarball để mọi người không liên tục lấy mã mới nhất?
thay thế

1
@mathepic: và để phát hành tarball, bạn cần một cách để có một bản sao hoạt động sạch ra khỏi kho lưu trữ - đó chính xác là câu hỏi được đặt ra.
Andrew

1
Đọc câu trả lời dưới đây và sau đó làm một chút googling dẫn đến một câu hỏi khác: stackoverflow.com/questions/160608/. Nếu bạn xem việc sử dụng kho lưu trữ git - hãy đọc chính xác những gì bạn (và áp phích gốc ) đang tìm. Chỉnh sửa: đó là những gì Jon trả lời thấp hơn.
Andrew

2

Có vẻ như bạn chỉ muốn một bản sao của mã nguồn. Nếu vậy tại sao không chỉ sao chép thư mục và loại trừ thư mục .git khỏi bản sao?


5
Đó là những gì tôi đang hỏi: làm thế nào để làm điều đó với git ... Tôi đã có thể nói rằng không có cách tích hợp nào để làm điều đó từ các câu trả lời mà tôi nhận được, mặc dù. Dẫu sao cũng xin cảm ơn!
Dan Rosenstark

2

kiểm tra git -f

Có một cách khác để làm điều này bằng cách tách repo khỏi cây làm việc.

Phương pháp này rất hữu ích nếu bạn cần cập nhật các tệp git không có git này một cách thường xuyên. Chẳng hạn, tôi sử dụng nó khi tôi cần kiểm tra các tệp nguồn và xây dựng một tạo phẩm, sau đó sao chép tạo phẩm vào một repo khác chỉ để triển khai cho máy chủ và tôi cũng sử dụng nó khi đẩy mã nguồn vào máy chủ khi tôi muốn mã nguồn để kiểm tra và xây dựng vào thư mục www.

Chúng tôi sẽ tạo hai thư mục, một cho git một cho các tệp đang hoạt động:

mkdir workingfiles
mkdir barerepo.git

khởi tạo một repo git trần:

cd barerepo.git
git --bare init 

Sau đó tạo một hook post-receive:

touch hooks/post-receive
chmod ug+x hooks/post-receive

Chỉnh sửa bài nhận trong trình chỉnh sửa yêu thích của bạn:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

Thêm điều này như một điều khiển từ xa:

git remote add myserver ssh://user@host:/path/to/barerepo.git

Bây giờ mỗi khi bạn đẩy lên repo trần này, nó sẽ kiểm tra cây làm việc /workingfiles/. Nhưng /workingfiles/bản thân nó không thuộc quyền kiểm soát phiên bản; chạy git statusvào /workingfiles/sẽ báo lỗi fatal: Not a git repository (or any parent up to mount point /data). Nó chỉ là các tập tin đơn giản.

Không giống như các giải pháp khác rm -r .gitlà không cần thiết, vì vậy nếu /workingfiles/một số git repo khác, bạn không phải lo lắng về lệnh được sử dụng để xóa các tệp git của repo khác.


1
Đã đồng ý. Một cái móc sau nhận trên một repo trần có thể ở đây. +1
VonC

rất nhiều công việc nếu bạn chỉ đang cố lấy các tập tin
Rainb

Sẽ không có nhiều việc nếu bạn chỉ muốn các tệp một cách thường xuyên.
Slam
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.