Cả hai ví dụ trong câu hỏi thực sự là những ví dụ rất xấu có thể dẫn đến mất dữ liệu!
Lời khuyên của tôi: không bao giờ nối /*
vào các thư mục trong tệp .gitignore, trừ khi bạn có lý do chính đáng!
Một lý do chính đáng sẽ là ví dụ những gì Jefromi đã viết: "nếu sau đó bạn có ý định bỏ qua một cái gì đó trong thư mục" .
Lý do tại sao nó không nên được thực hiện là việc gắn /*
vào thư mục một mặt hoạt động theo cách nó bỏ qua đúng tất cả nội dung của thư mục, nhưng mặt khác nó lại có tác dụng phụ nguy hiểm:
Nếu bạn thực thi git stash -u
(để tạm thời git clean -df
bỏ các tệp được theo dõi và không bị theo dõi) hoặc (để xóa các tệp không bị theo dõi nhưng giữ các tệp bị bỏ qua) trong kho lưu trữ của bạn, tất cả các thư mục bị bỏ qua với phần bổ sung /*
sẽ bị xóa không thể đảo ngược !
Một số nền tảng
Tôi đã phải học điều này một cách khó khăn. Ai đó trong nhóm của tôi đang nối thêm /*
vào một số thư mục trong .gitignore của chúng tôi. Theo thời gian tôi đã có những dịp mà các thư mục nhất định sẽ đột nhiên biến mất. Các thư mục có hàng gigabyte dữ liệu cục bộ cần thiết cho ứng dụng của chúng tôi. Không ai có thể giải thích điều đó và tôi luôn ngả mũ để tải lại tất cả dữ liệu. Sau một thời gian, tôi có một khái niệm rằng nó có thể phải làm với git stash
. Một ngày nọ tôi muốn làm sạch repo cục bộ của mình (trong khi giữ các tệp bị bỏ qua) và tôi đang sử dụng git clean -df
và một lần nữa dữ liệu của tôi đã biến mất. Lần này tôi đã có đủ và điều tra vấn đề. Cuối cùng tôi đã tìm ra lý do là sự bổ sung /*
.
Tôi giả sử nó có thể được giải thích bằng cách nào đó bởi thực tế là directory/*
bỏ qua tất cả nội dung của thư mục nhưng không phải chính thư mục. Do đó, nó không được xem là theo dõi hay bỏ qua khi mọi thứ bị xóa. Mặc dù git status
và git status --ignored
đưa ra một hình ảnh hơi khác nhau trên đó.
Cách sinh sản
Dưới đây là cách tái tạo hành vi. Tôi hiện đang sử dụng Git 2.8.4.
Một thư mục được gọi localdata/
với một tệp giả trong đó ( important.dat
) sẽ được tạo trong kho git cục bộ và nội dung sẽ bị bỏ qua bằng cách đưa /localdata/*
vào .gitignore
tệp. Khi một trong hai lệnh git được đề cập được thực thi ngay bây giờ, thư mục sẽ bị mất (bất ngờ).
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Nếu bạn làm git status --ignored
ở đây, bạn sẽ nhận được:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Bây giờ hoặc làm
git stash -u
git stash pop
hoặc là
git clean -df
Trong cả hai trường hợp, thư mục bị cáo buộc bỏ qua localdata
sẽ biến mất!
Không chắc đây có phải là một lỗi hay không, nhưng tôi đoán đó ít nhất là một tính năng không ai cần.
Tôi sẽ báo cáo điều đó với danh sách phát triển git và xem họ nghĩ gì về nó.
.gitignore
khác biệt giữa các tập tin và thư mục mà nó bỏ qua? ví dụ,data
vsdata/
có nghĩa là những thứ khác nhau?