Bỏ qua nội dung của một thư mục đã đăng ký?


227

Tôi có một kho git chỉ được sử dụng để chứa các tệp đồ họa và âm thanh được sử dụng trong một số dự án. Tất cả chúng đều nằm trong một thư mục không có thư mục con. Bây giờ tôi chỉ tạo một tập lệnh để sao chép các tài sản này từ một thư mục có cấu trúc khác, với một vài cấp độ của các thư mục con.

Bây giờ tôi chỉ muốn cấu trúc tệp phân cấp (nguồn) được theo dõi bởi git và thư mục phẳng (đích) (với tất cả các tệp trong một đống) nên được bỏ qua.

Tôi đã thêm thư mục đích vào .gitignore, nhưng git vẫn đang theo dõi các thay đổi trong đó. Tôi nghĩ rằng nếu tôi cam kết xóa tệp cũ trong thư mục đích, git có thể ngừng theo dõi nội dung mới (được sao chép bởi tập lệnh), nhưng không được.

Làm thế nào để tôi làm cho git quên về thư mục đích?


Tên thư mục là gì và bạn đã đặt gì .gitignore
mmmmmm

1
Tên là DirNameIrrelevant và .gitignore Tôi đã cố gắng đặt "DirNameIrrelevant", "DirNameIrrelevant /" và "DirNameIrrelevant / *"
Felixyz

Câu trả lời:


524

Lệnh này sẽ khiến git mở khóa thư mục của bạn và tất cả các tệp trong đó mà không thực sự xóa chúng:

git rm -r --cached <your directory>

Các -rtùy chọn gây ra việc loại bỏ tất cả các file trong thư mục của bạn.

Các --cachedtùy chọn làm cho các tập tin để chỉ được gỡ bỏ từ chỉ số git, chứ không phải bản sao làm việc của bạn. Theo mặc định git rm <file>sẽ xóa <file>.


À, cảm ơn. Rất hữu ích, mặc dù tôi không thấy lý do tại sao điều này lại cần thiết (tại sao nó không đủ để thêm thư mục trong .gitignore?). Bạn có thể cho tôi biết --cached dùng để làm gì không?
Felixyz

chắc chắn rồi. Tôi đã sửa đổi câu trả lời của mình để mô tả hai tùy chọn.
Gordon Wilson

Về lý do tại sao điều này là cần thiết, tôi chỉ có thể suy đoán. Tôi đoán rằng những người sáng tạo muốn không bị bẻ khóa các tệp rõ ràng để giảm bớt rủi ro của việc nhầm lẫn không theo dõi các phần quan trọng trong dự án của bạn. Tôi tưởng tượng cũng có lý do kỹ thuật.
Gordon Wilson

15
Gitignore được sử dụng để xác định những tập tin không được theo dõi mà git sẽ biết; nó không có liên quan đến các tập tin đã được theo dõi. Nếu người dùng muốn theo dõi các tập tin bị bỏ qua khác, git cho phép họ. Điều này có thể được thực hiện bằng cách sử dụng add -fhoặc là tình huống của bạn. Như Gordon đã nói, điều này giúp bạn không vô tình xóa sạch một loạt các tệp - kho lưu trữ là danh sách chính, không phải là gitignore. Điều này cũng cho phép bạn theo dõi thủ công một số điều mà nếu không bỏ qua quy tắc ký tự đại diện, điều mà tôi thấy hữu ích.
Cascabel

các -rtùy chọn không phải là để "làm việc loại bỏ tất cả các file trong thư mục của bạn" mà đúng hơn là để recurse qua subdirs.
MrE

78

Nếu bạn cần phải có một tệp được theo dõi (đã đăng ký), nhưng không muốn theo dõi các thay đổi tiếp theo của tệp trong khi giữ nó trong kho lưu trữ cục bộ cũng như trong kho lưu trữ từ xa, điều này có thể được thực hiện với:

git update-index --assume-unchanged path/to/file.txt

Sau đó, mọi thay đổi đối với tệp này sẽ không còn hiển thị nữa git status.


1
Mặc dù OP có thể đã yêu cầu một thư mục, đây chính xác là những gì tôi đang tìm kiếm - bỏ qua các thay đổi tiếp theo đối với một tệp được kiểm tra trong tệp; cảm ơn!
sdaau

1
để bỏ qua một thư mục hoàn toàn sử dụng 'git update-index - dirName / *' không thay đổi. Phải mất một lúc tôi mới tìm thấy cú pháp, '*' là cần thiết ở đây
J-Dizzle

1
Làm thế nào một người sẽ đảo ngược điều này?
Rhys

3
@Rhys để đảo ngược nó:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

Đối với thư mục con được gọi là blah/thêm vào git, cả hai điều sau đây dường như hoạt động để bỏ qua các tệp mới trong blah/. Đã thêm vào .gitignore:

blah 
blah/*

1

TL; DR để dọn sạch kho git của bạn và đảm bảo TẤT CẢ các mục bị bỏ qua của bạn thực sự bị bỏ qua:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Lưu ý: bạn không cần chỉ định một thư mục, theo cách này bạn đang dọn dẹp toàn bộ repo từ xa .

Để đi xa hơn đọc này


0

Không chắc chắn nếu điều này tính hoặc làm cho tôi một người xấu, nhưng ở đây nó đi.

  1. Tôi đã thêm vào *Generated*tập tin gốc .gitignore
  2. Tôi đã gửi các tệp tôi muốn giữ dưới dạng GeneratedFile.Whthing.ext. Đi vào
  3. Tôi đã thực hiện một git hook trên bài kiểm tra bài để gọi một kịch bản powershell làm điều này:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Tôi cảm thấy hơi tệ về bản thân mình ... nhưng thực tế nó hoạt động.


-2

Ok, có vẻ như trước tiên bạn phải thực hiện đăng ký với thư mục hoàn toàn trống (không phải tệp cũ hay tệp mới) và mọi tệp được thêm sau đó sẽ bị bỏ qua. Nếu bạn xóa các tệp cũ thêm và các tệp mới trước khi cam kết, các tệp mới sẽ được thêm vào repo mặc dù chúng nên được bỏ qua.

Ít nhất, điều này làm việc cho tôi trong tình huống này. Sẽ vẫn tuyệt vời nếu bất cứ ai có thể cung cấp cái nhìn sâu sắc hơn về những gì đang xảy ra.


1
Phiên bản ngắn của những gì chúng tôi đã nói ở nơi khác - gitignore ảnh hưởng đến những gì git dữ liệu không được theo dõi sẽ nhận ra. Nó không ảnh hưởng đến những gì sẽ được thực hiện với dữ liệu bạn đã nói với nó (ví dụ: hướng nó để thêm vào kho lưu trữ).
Cascabel

Vì vậy, điều hợp lý là các tệp được theo dõi và hiện đang bị xóa nên được theo dõi như vậy, nhưng đối với tôi, các tệp được thêm vào (nếu được thực hiện trước lần xác nhận tiếp theo) sẽ được theo dõi, trong khi nếu tôi 1) bỏ qua, 2) xóa tập tin, 3) cam kết, 4) thêm tập tin mới, các tập tin mới không được theo dõi.
Felixyz
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.