Làm cách nào để theo dõi các thư mục chứ không phải các tệp của chúng bằng Git?


85

Gần đây tôi đã bắt đầu sử dụng Git và đang gặp sự cố chỉ với một điều. Làm cách nào để theo dõi các thư mục mà không theo dõi nội dung của chúng?

Ví dụ: trang web tôi đang làm việc cho phép tải lên. Tôi muốn theo dõi thư mục tải lên để nó được tạo khi phân nhánh, v.v. nhưng rõ ràng không phải là các tệp bên trong nó (tệp thử nghiệm trong khi phát triển nhánh hoặc các tệp thực trong chính).

Trong .gitignore của tôi, tôi có những thứ sau:

tải lên /*.*

Cũng đã thử (bỏ qua toàn bộ thư mục):

tải lên /

Thư mục này cũng có thể chứa các thư mục con (uploads / thumbs / uploads / videos /) Tôi muốn có thể theo dõi các thư mục này chứ không phải các tệp của chúng.

Điều này có khả thi với Git không? Tôi đã tìm kiếm khắp nơi mà không tìm thấy câu trả lời.


Git chỉ theo dõi các tệp. Những gì bạn có thể làm là thử với git hook và theo dõi một tệp sẽ chứa danh sách thư mục (được tạo tự động bằng cách sử dụng hook). Mặc dù tôi không hoàn toàn chắc chắn liệu điều đó có khả thi hay không.
Šimon Tóth

Cụ thể hơn: Git theo dõi nội dung và (đối với git) một thư mục trống không phải là nội dung. Bạn có thể tranh luận, bạn có đồng ý hay không, nhưng là một "giải pháp thay thế" khác, bạn có thể nghĩ đến việc tạo các thư mục trên build / install / khi cần thiết. Tuy nhiên: Tôi cũng sử dụng " .placeholder-tệp" -solution;)
KingCrunch

1
Thay vì sử dụng .placeholder, tôi sử dụng tệp .gitignore. Điều này không chỉ xử lý các loại trừ trong thư mục mà còn hoạt động như một trình giữ chỗ.
Abizern

Câu trả lời:


113

Git không theo dõi các thư mục, nó theo dõi các tệp, vì vậy để đạt được điều này, bạn cần theo dõi ít ​​nhất một tệp. Vì vậy, giả sử .gitignoretệp của bạn trông giống như sau:

upload/*

Bạn có thể làm được việc này:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

Nếu bạn quên -fbạn sẽ thấy:

$ git thêm tải lên / .placeholder
Các đường dẫn sau bị một trong các tệp .gitignore của bạn bỏ qua:
tải lên
Sử dụng -f nếu bạn thực sự muốn thêm chúng.
nghiêm trọng: không có tệp nào được thêm vào

Sau đó, khi bạn làm git statusbạn sẽ thấy:

# Trên nhánh chính
#
# Cam kết ban đầu
#
# Thay đổi được cam kết:
# (sử dụng "git rm --cached ..." để bỏ dấu trang)
#
# tệp mới: tải lên / .placeholder
#

Rõ ràng sau đó bạn có thể làm:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder

Cảm ơn, đây chỉ là những gì tôi cần.
Ben

11
Quy ước chung cho trình giữ chỗ là tệp gitignore.
Cascabel

2
@Jefromi Thật vậy, như nhận xét của tôi cho Abizern, chưa bao giờ xem xét việc sử dụng .gitignoretệp làm trình giữ chỗ.
Peter Farmer,

1
Rất tiếc, bằng cách nào đó đã bỏ lỡ những nhận xét đó.
Cascabel

2
Git không theo dõi các thư mục, nó theo dõi các tập tin âm thanh vui nhộn khi họ dạy cho bạn rằng tất cả mọi thứ là một tập tin trong UNIX, thậm chí là một thư mục là một tập tin
Xanh

38

Tôi đã viết về điều này ở đây .

Thêm .gitignore trong thư mục.


1
Bài viết và ý kiến ​​nhỏ tốt đẹp! Chưa bao giờ xem xét việc sử dụng .gitignore làm tệp giữ chỗ ....
Peter Farmer

Cảm ơn. Tôi đã học được điều gì đó chỉ bằng cách viết một bài đăng và nhận được bình luận.
Abizern

1
Dường như có một quy ước đặt tên phổ biến hiện nay để sử dụng.gitkeep
tarabyte

vừa nhận được lời khen ngợi "ha-ha" đó ngay bây giờ, tôi ước mình có thể ủng hộ 6 lần khác nhau
ủng hộ



6

Để chỉ theo dõi các thư mục chứ không theo dõi các tệp, tôi đã làm như sau. Nhờ nhận xét của @ PeterFarmer về việc git chỉ theo dõi các tệp, tôi đã có thể giữ tất cả các thư mục ngoại trừ các tệp như được mô tả trong bên dưới.

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

Thêm điều này vào tệp .gitignore sẽ thực hiện công việc. Sau đây là cấu trúc thư mục của tôi.

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

Khi tôi làm vậy git add . && git status, git chỉ nhận dạng các thư mục chứ không nhận dạng tệp.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

Hãy nhớ rằng những điều sau đây cho các tệp .gitignore của bạn:

Dấu gạch chéo dành sẵn chỉ hiển thị cho thư mục gốc.

/ dir

Dấu hoa thị kép tìm kiếm không hoặc nhiều thư mục.

/ ** /


Cảm ơn bạn! Tôi đang sử dụng cách này và nó rất hữu ích
sebasira
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.