Tar một thư mục không có tập tin .git?


16

Nếu tôi tar một thư mục là một kho lưu trữ git, tôi có thể làm như vậy mà không bao gồm các .gittập tin liên quan? Nếu không, làm thế nào tôi có thể thực hiện điều đó thông qua một lệnh?

Câu trả lời:


23

Có một cái nhìn đầu tiên tại git help archive. archivelà một lệnh git cho phép tạo tài liệu lưu trữ chỉ chứa các tệp được theo dõi git. Có lẽ là những gì bạn đang tìm kiếm. Một ví dụ được liệt kê ở cuối trang man:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

6
Điều này chỉ lưu trữ gốc git repo. Nếu các mô hình con được sử dụng - thư mục của chúng sẽ trống.
Stann

@Stann: Cảm ơn, từ một người dùng mô hình con khác
Mark K Cowan

22

Câu trả lời đơn giản nhất: Thêm --exclude-vcs

--exclude-vcs

Điều này không bao gồm tất cả các thư mục hệ thống kiểm soát phiên bản

Cá nhân tôi sử dụng

tar -zcvf foo.tar.gz ./FOLDER_NAME --exclude-vcs

vì vậy tất cả những gì bạn cần làm là thêm --exclude-vcs vào cuối lệnh.


Tất cả những người được biết , tôi cho rằng? ;)
phk

3
Tất cả các tùy chọn cần phải được kết hợp với nhau trước các đối số trên GNU / Linux.
Josh Habdas

2
Như đã nêu cho GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey

20

Nếu bạn muốn kho lưu trữ bao gồm các tệp được theo dõi bởi git, nhưng không phải chính kho lưu trữ git hoặc bất kỳ tệp nào được tạo hoặc không được theo dõi, thì hãy sử dụnggit archive .

Nếu bạn đặc biệt muốn loại trừ .gitnhưng bao gồm mọi thứ khác, trong Linux hoặc FreeBSD hoặc OSX hoặc Cygwin, tar có một tùy chọn đơn giản để loại trừ một thư mục:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Với GNU tar (tức là theo Linux hoặc Cygwin), bạn có thể rút ngắn điều này thành tar czf foo.tgz --exclude .git foo.

Cách POSIX tạo tài liệu lưu trữ là pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz

gitbiên dịch trên bất kỳ hệ thống nào tarkhông có sẵn? :-)
Stéphane Gimenez

1
@ StéphaneGimenez Có lẽ là không. Nhưng nó biên dịch trên các hệ thống tarkhông có --excludetùy chọn, chẳng hạn như OpenBSD (thừa nhận trùng lặp stùy chọn của pax , nhưng đó không phải là một phần mở rộng cú pháp lệnh tar phổ biến).
Gilles 'SO- ngừng trở nên xấu xa'

0

Nhờ một câu trả lời mà tôi nhận được một trong những câu hỏi của mình, tôi đã tìm ra một giải pháp khác. Vì vậy, để hoàn thiện, đây là một giải pháp sử dụng find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Và nếu bạn muốn loại trừ .gitcác thư mục có thể có trong thư mục (phụ) +:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Latter cũng có thể đạt được thông qua:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Khá tiện nếu bạn có thể sử dụng các kỹ thuật lọc khác find, ví dụ: ngày sửa đổi, quyền, chế độ

(Như tên tập tin như vậy thường cũng như hình thành được giả định, nếu không bạn cần phải sử dụng rỗng byte như dải phân cách mà có thể có nghĩa là -print0cho find--nullcho tarnếu được hỗ trợ).

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.