Câu hỏi Làm cách nào để thêm một thư mục trống vào kho lưu trữ Git?


Làm cách nào để thêm thư mục trống (không chứa tệp) vào kho lưu trữ Git?


3477
2017-09-22 16:41


gốc


Mặc dù nó không hữu ích, có một cách để hack một thư mục trống rỗng (thực sự trống) vào repo của bạn. Nó sẽ không checkout với các phiên bản hiện tại của Git, tuy nhiên. - tiwo
@tiwo Tôi cho một người không đồng ý rằng nó không hữu ích. Hệ thống phân cấp thư mục của bạn là một phần của dự án của bạn, vì vậy nó phải được kiểm soát phiên bản. - JBentley
Trong trường hợp của tôi, tôi muốn thêm một cấu trúc thư mục cho các tệp tmp, nhưng không phải là các tệp tmp. Bằng cách này, thử nghiệm của tôi có cấu trúc chính xác (nếu không có lỗi) nhưng tôi không làm tắc nghẽn các cam kết của tôi với dữ liệu tmp. Vì vậy, có, nó hữu ích cho tôi! - Adam Marshall
@AdamMarshall Tôi nghĩ rằng tiwo đã nói rằng hack không phải là hữu ích, vì nó được bỏ qua bằng cách kiểm tra. Tmp dirs làm âm thanh như một tính năng hữu ích cho một VCS. - Quantum7
Tại sao không có thủ tục tạo các tệp tmp cũng tạo thư mục tmp? - RyPeck


Các câu trả lời:


Một cách khác để làm cho một thư mục trống rỗng (trong kho lưu trữ) là tạo ra một .gitignore bên trong thư mục chứa bốn dòng này:

# Ignore everything in this directory
*
# Except this file
!.gitignore

Sau đó, bạn không cần phải có được thứ tự đúng cách mà bạn phải làm trong m104's dung dịch.

Điều này cũng mang lại lợi ích là các tệp trong thư mục đó sẽ không hiển thị là "không được theo dõi" khi bạn thực hiện trạng thái git.

Chế tạo @GreenAsJadeNhận xét của người dùng liên tục:

Tôi nghĩ đáng chú ý là giải pháp này thực hiện chính xác những gì câu hỏi được yêu cầu, nhưng có lẽ không phải là điều mà nhiều người nhìn vào câu hỏi này sẽ tìm kiếm. Giải pháp này đảm bảo thư mục vẫn trống. Nó nói "Tôi thực sự không bao giờ muốn các tập tin được kiểm tra ở đây". Trái ngược với "Tôi chưa có bất kỳ tệp nào để đăng ký tại đây, nhưng tôi cần thư mục ở đây, tệp có thể đến sau".


3365
2018-05-31 22:10



Tôi nghĩ đáng lưu ý là giải pháp này đúng những gì các câu hỏi được yêu cầu, nhưng có lẽ không có gì nhiều người nhìn vào câu hỏi này sẽ được tìm kiếm. Giải pháp này đảm bảo rằng thư mục vẫn trống. Nó nói "Tôi thực sự không bao giờ muốn các tập tin được kiểm tra ở đây". Trái ngược với "Tôi chưa có bất kỳ tệp nào để đăng ký tại đây, nhưng tôi cần thư mục ở đây, tệp có thể đến sau". - GreenAsJade
Tôi nghĩ rằng giải pháp README do @JohnMee đề xuất nên được sử dụng cùng với giải pháp này; tệp .gitignore cung cấp một giải thích về những gì chúng ta muốn loại bỏ việc kiểm soát phiên bản, trong khi tệp README giải thích mục đích của thư mục là những thông tin rất quan trọng. - pedromanoel
@pedromanoel Tôi viết tài liệu bạn sẽ đưa vào README bên trong .gitignore tệp (dưới dạng nhận xét). - Carlos Campderrós
phát hiện sự khác biệt 1: 1.) một thư mục trống, 2.) một thư mục có tệp .gitignore trong đó. ;-) - Peter Perháč
Về mặt kỹ thuật, đây không phải là thư mục trống ... - Arash Saidi


Bạn không thể. Xem Câu hỏi thường gặp về Git.

Hiện tại thiết kế của chỉ mục git   (khu vực dàn dựng) chỉ cho phép tệp   được liệt kê, và không ai đủ thẩm quyền   để thực hiện thay đổi cho phép trống   các thư mục đã quan tâm đủ về   tình huống này để khắc phục nó.

Thư mục được thêm tự động   khi thêm tệp bên trong chúng. Cái đó   là, các thư mục không bao giờ phải được thêm vào   vào kho lưu trữ và không được theo dõi   một mình.

Bạn có thể nói "git add <dir>" và nó   sẽ thêm tệp vào đó.

Nếu bạn thực sự cần một thư mục để   tồn tại trong các lần kiểm tra, bạn nên tạo   trong đó. .gitignore hoạt động tốt cho   Mục đích này; bạn có thể để trống,   hoặc điền vào tên của các tập tin bạn   mong muốn hiển thị trong thư mục.


983
2017-09-22 16:42



Câu trả lời dưới đây là MUCH tốt hơn. Thực tế là git phần mềm cấp thấp không cho phép nó không quan trọng với tôi nhiều như CÁCH để thực sự sử dụng Git khi tôi cần một thư mục trống. Thêm một dòng .gitignore dường như chấp nhận được với tôi. - Amala
Vâng, nếu một người muốn di chuyển các tập tin vào một thư mục mới, họ không thể làm điều đó thông qua git mv như git sẽ phàn nàn rằng thư mục mới không nằm dưới sự kiểm soát phiên bản - lulalala
Bạn có thể đọc "không thể, bạn không thể, v.v."trên Internet cho câu hỏi thường gặp này. .gitignore lừa là một câu trả lời thường xuyên, và đáp ứng nhiều nhu cầu. Tuy nhiên điều đó là có thể để làm cho git theo dõi một thật sự trống rỗng danh mục, xem câu trả lời của tôi - ofavre
Mặc dù tôi càng nghĩ về nó, nó càng giống như "băm SHA của chuỗi rỗng", nếu nó tồn tại, thực sự sẽ là một định danh được xác định rõ ràng cho một cây trống, trừ khi nó sẽ không thể nói cho dù đối tượng đó là một cây hay một đốm màu. - Emil Lundberg
Tôi đã nhìn thấy rất nhiều repos sử dụng một tập tin rỗng gọi là .gitkeep vì mục đích này. - Sukima


Tạo một tệp rỗng có tên .gitkeep trong thư mục và thêm vào đó.


598
2017-12-07 16:03



+1 đây là lý do tại sao tệp có ở vị trí đầu tiên - djhaskin987
Tôi đã thêm một câu trả lời khuyến khích tạo .keep thay thế. - A-B-B
.gitkeep chưa được Git quy định và sẽ khiến mọi người đoán ý nghĩa của nó, điều này sẽ dẫn họ đến các tìm kiếm trên google, điều này sẽ dẫn họ đến đây. Các .git quy ước tiền tố nên được dành riêng cho các tệp và thư mục mà Git tự sử dụng. - t-mart
@ t-mart "The .git nên đặt trước quy ước tiền tố ... "Tại sao? git có yêu cầu đặt chỗ này không? - Limited Atonement
Nó không. Vấn đề là nó có thể gây nhầm lẫn. - szablica


Bạn luôn có thể đặt một tập tin README trong thư mục với một lời giải thích lý do tại sao bạn muốn điều này, nếu không có sản phẩm nào, thư mục trong kho lưu trữ.


368
2018-03-14 23:38



1, Đề xuất tốt, một thư mục trống không có ý nghĩa gì trừ khi nó sẽ được sử dụng trong tương lai. Vì vậy, hãy tạo một tệp README bên trong nó và viết thư mục này là gì, và những tệp nào sẽ được đặt ở đó trong tương lai. Điều đó giải quyết cả hai vấn đề. - saeedgnu
Tôi đồng ý. Các thư mục trống sẽ gây phiền nhiễu và nên được giải thích trong tất cả các kho lưu trữ được xử lý đúng cách thuộc bất kỳ loại nào. - Sold Out Activist
@ilius Vô nghĩa. Cấu trúc thư mục chứa các thư mục trống có thể rất mong muốn trong nhiều tình huống (như một ứng dụng MVC nơi bạn muốn một thư mục mô hình nhưng chưa tạo ra bất kỳ mô hình nào hoặc thư mục chia sẻ lượt xem mà bạn định thêm lượt xem được chia sẻ ). Hơn nữa, đặt một README trong mỗi một trong số này là quá mức cần thiết vì nó rõ ràng những gì họ đang có cho, và thật dễ dàng để quên để đặt một README trong mỗi một trong số họ. Và bạn phải nhớ để loại bỏ README khi bạn thêm một số tập tin khác cho họ. Về cơ bản, git chắc chắn nên cho phép các thư mục trống. - Jez
@ Jez: Tôi không đồng ý. Vấn đề là git được thiết kế để kiểm soát (và lập chỉ mục) mã nguồn. Quan trọng hơn, id của cam kết là một hàm băm của nội dung. Đó là để nói, nó phải có nội dung. Bạn không cần một README trong mỗi một phần của cây, chỉ có các nút lá. Nếu bạn có những nơi bạn dự định đặt mã, nhưng không có mã, và bạn thậm chí sẽ không dành thời gian để lặp lại "nơi cho các mô hình" >> README, sau đó những gì bạn có là một ý tưởng không phải là một cam kết. Nó không quan tâm đến git. Nói "Tôi muốn ứng dụng đang chạy có thư mục rỗng XYZ" là một thời gian chạy vấn đề, không phải là một vấn đề nguồn. Xử lý nó với trình cài đặt của bạn. - Joe Atzberger
@ jbo5112 Vâng, "mã đặc biệt" mà bạn gọi là "trình cài đặt" tôi đã đề cập. Cài đặt webapp của bạn đã có để xử lý việc tạo cơ sở dữ liệu, cấu hình cục bộ, kéo phụ thuộc hoặc 100 hoạt động khác, nhưng một vài thư mục trống nằm ngoài nó? Hãy thử gradle, hành khách, đầu bếp, Makefile nguyên thủy, vv Không có sự khác biệt về bảo mật giữa việc tạo thư mục và công cụ khác (có khả năng phức tạp hơn / nguy hiểm) khi cài đặt ứng dụng. Và nếu bạn thực sự không có deps, config, DB, vv, và không có trình cài đặt, thì chỉ cần sử dụng README. Không có trường hợp yêu cầu bạn phải làm cả hai. - Joe Atzberger


touch .keep

Trên Linux, điều này tạo ra một tập tin rỗng có tên .keep. Tên này được ưu tiên hơn .gitkeep như trước đây là bất khả tri đối với Git, trong khi cái sau là đặc trưng cho Git. Thứ hai, như một người dùng khác đã lưu ý, .git quy ước tiền tố nên được dành riêng cho các tệp và thư mục mà Git tự sử dụng.

Ngoài ra, như đã lưu ý trong một câu trả lời, thư mục có thể chứa mô tả README hoặc là README.md tập tin thay thế.

Tất nhiên điều này đòi hỏi rằng sự hiện diện của tập tin sẽ không gây ra ứng dụng của bạn để phá vỡ.


261
2018-01-29 04:29



Điều này là tốt cho một thư mục trần ban đầu, nhưng nếu nó bắt đầu để điền vào các tập tin? Sau đó, Git sẽ thông báo cho họ và yêu cầu họ như là các tập tin không đúng. Câu trả lời được chọn ở đây hoạt động hiệu quả hơn nhiều để cho phép người dùng giữ một thư mục nhưng sau đó an toàn bỏ qua nội dung. - JakeGould
Câu hỏi và mối quan tâm chung chủ yếu là về việc thêm một thư mục trống. Nếu sau này có tệp thường trú, rõ ràng là xóa .keep hoặc chỉ bỏ qua nó. Nếu thay vào đó các tập tin trong thư mục bị bỏ qua, thì đó là một câu hỏi hoàn toàn khác. - A-B-B
Người ta cho rằng git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep" sẽ làm điều này trong tất cả các thư mục rỗng không được theo dõi. - A-B-B
Không thích giải pháp này, thật khó để đoán xem tệp này có tác dụng gì. Ngoài ra, nếu bạn đang tạo ra các tập tin trong môi trường dev của bạn (như các bản ghi hoặc hình ảnh, vv), đây không phải là giữ cho các tập tin được phiên bản và làm theo cách của họ vào sản xuất, mà không phải là tốt đẹp. - danielrvt
Windows không thích các tệp không có tên và yêu cầu phép thuật đặc biệt để thực hiện điều này (còn gọi là ứng dụng đầu cuối giống như bash hoặc tương đương). - EntangledLoops


Tại sao chúng ta cần thư mục được phiên bản trống

Trước tiên:

Một thư mục trống không thể là một phần của cây trong hệ thống phiên bản Git.

Nó chỉ đơn giản là sẽ không được theo dõi. Nhưng có những tình huống trong đó "phiên bản" một thư mục trống có thể hữu ích, ví dụ:

  • xây dựng một cấu trúc thư mục được xác định trước cho các thư mục dự án hữu ích và tạo cấu trúc này cho mọi người dùng / người đóng góp của kho lưu trữ; hoặc, như một trường hợp đặc biệt ở trên, tạo một thư mục cho Hồ sơ tạm thời, chẳng hạn như cache/ hoặc là logs/ thư mục
  • một số dự án đơn giản là sẽ không hoạt động nếu không có một số thư mục (thường là một gợi ý của một dự án được thiết kế kém, nhưng đó là một kịch bản thế giới thực thường xuyên và có thể có, có thể là, các vấn đề về quyền).

Một số giải pháp được đề xuất

Nhiều người dùng đề xuất:

  1. Đặt một README tệp hoặc tệp khác với một số nội dung để làm cho thư mục không trống hoặc
  2. Tạo ra một .gitignore tệp có loại "logic ngược" (nghĩa là bao gồm tất cả các tệp), ở cuối, phục vụ cùng mục đích của phương pháp # 1.

Trong khi cả hai giải pháp chắc chắn hoạt động Tôi thấy chúng không nhất quán với cách tiếp cận có ý nghĩa đối với phiên bản Git.

  • Tại sao bạn phải đặt các tập tin giả mạo hoặc README mà có thể bạn không thực sự muốn trong dự án của bạn?
  • Tại sao sử dụng .gitignore để làm một điều (duy trì các tệp) ngược lại với ý nghĩa của nó (loại trừ tập tin), mặc dù nó có thể?

.gitkeep phương pháp tiếp cận

Sử dụng một trống tập tin được gọi là .gitkeep để buộc sự hiện diện của thư mục trong hệ thống phiên bản.

Mặc dù nó có vẻ không phải là một sự khác biệt lớn như vậy:

  • Bạn sử dụng một tệp có Độc thân mục đích giữ thư mục. Bạn không đặt bất kỳ thông tin nào mà bạn không muốn đưa vào.

    Ví dụ, bạn nên sử dụng READMEs như, tốt, README với thông tin hữu ích, không phải là một cái cớ để giữ cho thư mục.

    Tách mối quan tâm luôn là điều tốt và bạn vẫn có thể thêm .gitignore để bỏ qua các tệp không mong muốn.

  • Đặt tên cho nó .gitkeep làm cho nó rất rõ ràng và đơn giản từ chính tên tệp (và cũng cho các nhà phát triển khác, điều này tốt cho một dự án được chia sẻ và một trong những mục đích cốt lõi của kho lưu trữ Git) mà tệp này là

    • Một tệp không liên quan đến mã (vì dấu chấm đầu và tên)
    • Một tệp có liên quan rõ ràng với Git
    • Mục đích của nó (giữ) được tuyên bố rõ ràng và nhất quán và trái ngược nhau về mặt ý nghĩa đối với bỏ qua

Nhận con nuôi

Tôi đã thấy .gitkeep cách tiếp cận được chấp nhận bởi các khung công tác rất quan trọng như Laravel, Angular-CLI.


204
2017-12-04 23:32



Bạn đã bỏ lỡ một ý tưởng - lý do giữ và thư mục trống (ví dụ: / logs, / tmp, / uploads) là gì? Có - nó để giữ cho thư mục trống. :) Vì vậy, nếu bạn muốn giữ một thư mục trống, bạn phải bỏ qua các tập tin bên trong nó. - Roman
@RomanAllenstein: không nhất thiết. Nó có thể là bạn tạo ra một repo với một cấu trúc nhất định mà có thể trở thành dân cư sau này. Các tệp đó sẽ được thêm vào repo ngay khi chúng được tạo và sẽ gây phiền toái khi bắt đầu xóa hoặc chỉnh sửa các tệp .gitignore (và nguy hiểm, vì có thể bạn thậm chí không nhận ra rằng chúng không bị theo dõi: git bỏ qua chúng ) - dangonfast
downvote: câu trả lời dài dòng. - Behnam
@Behnam: Tôi sẽ lấy xuống, nhưng nghiên cứu của tôi về S.O. meta cho thấy không có mối quan tâm đối với câu trả lời tiết, miễn là chúng cung cấp đủ chi tiết và rõ ràng là hữu ích cho mọi người đọc (và mọi cấp độ kỹ năng). Tuy nhiên, tôi rất cởi mở với bất kỳ lời chỉ trích nào và cảm ơn bạn vì đã tuyên bố lý do công khai, tôi mang nó rất tích cực. - Cranio
Nếu bạn chỉnh sửa câu trả lời của mình để thay thế .gitkeep với bất kỳ tên tệp không có tiền tố git nào khác mà bạn nhận được upvote của mình, tôi nghĩ câu trả lời này là câu trả lời hay nhất và có nhiều thông tin nhất. Lý do: Tôi nghĩ ".git *" nên được dành riêng cho các tệp được chỉ định git, trong khi đây chỉ là một trình giữ chỗ đơn thuần. Đoán đầu tiên của tôi khi tôi thấy đó là ví dụ một ".gitkeep" tập tin sẽ được tự động bỏ qua (đó sẽ là một tính năng tốt đẹp) nhưng đó không phải là trường hợp, phải không? - Johnny


Như được mô tả trong các câu trả lời khác, Git không thể đại diện cho các thư mục trống trong vùng dàn dựng của nó. (Xem Câu hỏi thường gặp về Git.) Tuy nhiên, nếu, cho mục đích của bạn, một thư mục trống rỗng nếu nó chứa một .gitignore chỉ tệp, sau đó bạn có thể tạo .gitignore các tệp trong các thư mục trống chỉ qua:

find . -type d -empty -exec touch {}/.gitignore \;

119
2018-05-03 15:17



Bạn có thể muốn bỏ qua thư mục .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \; - steffen
Một biến thể đơn giản cho hầu hết các tình huống là find * -type d -empty -exec touch {}/.gitignore \; - akhan
Vì OS X tạo tệp .DS_Store trong hầu hết mọi directoy, điều này không hoạt động ở đó. Giải pháp duy nhất (NGUY HIỂM!) Tôi tìm thấy, là xóa tất cả các tệp .DS_Store đầu tiên qua find . -name .DS_Store -exec rm {} \; và sau đó sử dụng biến thể ưa thích từ câu trả lời này. Hãy chắc chắn chỉ thực hiện điều này trong thư mục chính xác! - zerweck
Có ai biết một cách để làm điều này trong Windows từ dòng lệnh? Tôi đã thấy một số giải pháp ở đây trong Ruby và Python, nhưng tôi muốn một giải pháp barebones nếu nó có thể được quản lý. - Mig82
@akhan Thêm thứ gì đó vào .gitignore không ảnh hưởng đến -empty lá cờ của find chỉ huy. Nhận xét của tôi về việc xóa .DS_Store các tệp trong cây thư mục, vì vậy -empty cờ có thể được áp dụng. - zerweck


Andy Lester là đúng, nhưng nếu thư mục của bạn chỉ cần trống rỗng, và không trống trống rỗng, bạn có thể bỏ trống .gitignore tập tin trong đó như một cách giải quyết.

Ngoài ra, đây là vấn đề triển khai chứ không phải vấn đề thiết kế lưu trữ Git cơ bản. Như đã được đề cập nhiều lần trong danh sách gửi thư của Git, lý do mà điều này chưa được thực hiện là không ai đủ quan tâm để gửi bản vá cho nó, không phải là không thể hoặc không nên làm.


57
2017-09-22 17:28



Đó là chính xác những gì tôi đã nói. Cả hai đoạn văn đều được giải quyết trong đoạn câu hỏi thường gặp mà tôi đã đăng. - Andy Lester
Tôi nghĩ rằng một bên là unteresting và hữu ích để biết - nó có thể được cố định, chỉ cần không mong đợi nó bất cứ lúc nào sớm khi có một cách giải quyết dễ dàng như vậy đối với hầu hết các trường hợp. - wnoise
Xin lỗi, tôi đã không đọc đoạn cuối, và trong khi tôi đọc đoạn đầu tiên, tôi không chắc tại sao tôi lặp lại thông tin đó. - Aristotle Pagaltzis
Tất nhiên, câu trả lời bổ sung này sẽ chỉ ra một thực tế. - Michael Johnson
Tôi đã thấy ở đây nhìn vào một trường hợp xây dựng rơi xuống nếu thư mục không tồn tại và theo mặc định nó là sản phẩm nào, nhưng nó không cần phải có sản phẩm nào. Tạo một .gitignore làm điều đúng. - Joshua


Các Viên ngọc trên tay vịn đường:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Bây giờ thư mục log sẽ được đưa vào cây. Nó rất hữu ích khi triển khai, vì vậy bạn sẽ không phải viết một thường trình để tạo các thư mục log.

Các logfiles có thể được lưu giữ bằng cách phát hành,

echo log/dev.log >> .gitignore

nhưng bạn có thể biết điều đó.


29
2017-10-22 13:24



Điều đó có liên quan gì với Ruby on Rails? - Quolonel Questions
@QuolonelQuestions github.com/rails/rails/blob/master/activerecord/test/migrations/… - Radon Rosborough


Git không theo dõi các thư mục trống. Xem Câu hỏi thường gặp về Git để giải thích thêm. Cách giải quyết được đề xuất là đặt .gitignore trong thư mục trống. Tôi không thích giải pháp đó, bởi vì .gitignore bị "ẩn" bởi quy ước Unix. Ngoài ra không có giải thích tại sao các thư mục trống.

Tôi đề nghị để đặt một tập tin README trong thư mục trống giải thích lý do tại sao thư mục trống và tại sao nó cần phải được theo dõi trong Git. Với tập tin README tại chỗ, như xa như Git là có liên quan, thư mục không còn trống.

Câu hỏi thực sự là tại sao bạn cần thư mục trống trong git? Thông thường bạn có một số loại kịch bản xây dựng có thể tạo thư mục trống trước khi biên dịch / chạy. Nếu không thì hãy làm một cái. Đó là một giải pháp tốt hơn nhiều so với việc đặt các thư mục trống trong git.

Vì vậy, bạn có một số lý do tại sao bạn cần một thư mục trống trong git. Đặt lý do đó vào tệp README. Bằng cách đó, các nhà phát triển khác (và tương lai bạn) biết tại sao thư mục trống cần phải ở đó. Bạn cũng sẽ biết rằng bạn có thể xóa thư mục trống khi vấn đề yêu cầu thư mục trống đã được giải quyết.


Để liệt kê mọi thư mục trống, hãy sử dụng lệnh sau:

find -name .git -prune -o -type d -empty -print

Để tạo README trong phần giữ chỗ trong mọi thư mục trống:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

Để bỏ qua mọi thứ trong thư mục ngoại trừ tệp README, hãy đặt các dòng sau vào .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Ngoài ra, bạn chỉ có thể loại trừ mỗi Tệp README bị bỏ qua:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Liệt kê mọi README sau khi chúng đã được tạo ra:

find -name README.emptydir

26
2018-05-06 15:45