2012-05-18 25 views
16

Tôi đang gặp một số rắc rối tìm hiểu các khái niệm cơ bản git:/Git bỏ qua các file đang được theo dõi mà không xóa chúng

Tôi đang thử nghiệm trên máy tính Windows địa phương của tôi trước khi cố gắng một số thứ trên trang web git-kiểm soát của tôi.

tôi có:

gittesting/repo1: 
    file.txt 
    ignoreme: 
     ignore.txt 

gittesting/repo2 
    file.txt 
    ignoreme: 
     ignore.txt 

Repo2 là một bản sao của repo1, và ignoreme đang được theo dõi. Các tập tin ignore.txt trở nên thay đổi trong repo2, nhưng tôi muốn ngừng theo dõi nó và cho git để hoàn toàn bỏ qua nó. Vấn đề ở đây là nếu tôi tạo một file .gitignore và thêm ignoreme, nó đã quá trễ vì nó đã được theo dõi, vì vậy tôi sẽ phải làm git rm --cách bỏ qua, nhưng sau đó nó được đánh dấu là bị xóa và nếu tôi kéo commit repo1, thư mục sẽ bị xóa thay vì bị bỏ lại một mình ..

Nói tóm lại:

  1. các ignore.txt có nội dung khác nhau giữa hai Repos.
  2. Tôi muốn các nội dung ignore.txt vẫn như họ đang có và hoàn toàn bị bỏ qua bởi git

Tôi đã nhìn trực tuyến, hỏi trong IRC, và nhìn vào những câu hỏi rất có liên quan, nhưng không thể tìm cách để làm điều này. Tôi biết ví dụ này có vẻ tầm thường, nhưng đó chính xác là những gì tôi cần làm trên trang web của mình, thay vào đó thư mục là Diễn đàn/bộ nhớ cache.


chỉnh sửa:

Đây là một chút của một hack và tôi muốn một câu trả lời tốt hơn, nhưng tôi đã kết thúc thực hiện:

cd repo2 
echo "ignoreme" > .gitignore 
echo "ignoreme/*" > .gitignore 
git rm --cache -r ignoreme 
git commit -m "Should ignore now" 
cd ../repo1 
mv ignoreme ignoreme2 
git pull ../repo2 
mv ignoreme2 ignoreme 

Trả lời

7

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn muốn repo2 để biết về thư mục ignoreme/, nhưng bạn không muốn Git quan tâm đến bất kỳ sửa đổi nào đối với thư mục. Và git rm --cached sẽ không giúp bạn vì bạn đang yêu cầu Git gửi ngừng theo dõi nội dung này từ bây giờ.

Giải pháp của Git để theo dõi nội dung, nhưng cố định tại một điểm nhất định, là thông qua các mô-đun con. Đây trừ từ Git Book giải thích (nhấn mạnh thêm):

Mặc dù rack là một thư mục con trong thư mục làm việc của bạn, Git thấy nó như là một submodule và không theo dõi nội dung của nó khi bạn vắng mặt trong thư mục đó. Thay vào đó, Git ghi lại nó dưới dạng cam kết cụ thể từ kho lưu trữ đó.

Bạn có thể thử như sau:

  1. Sao chép ignoreme/ thư mục đến vị trí mới, và làm cho nó một kho git

  2. Thêm nó lại như một submodule trong repo2:

    git submodule add file:///path/to/ignoreme ignoreme 
    git commit -m"Add ignoreme/ as a submodule" 
    

Các submodule ignoreme bây giờ được cố định cho một cam kết cụ thể. repo2 vẫn đang theo dõi bất kỳ nội dung nào bên trong mô-đun con, nhưng mọi thay đổi đối với tệp trong ignoreme/ sẽ không được theo dõi trong repo2 trừ khi bạn thực hiện chúng trong mô-đun con. Hãy nói rằng ignoreme/ignore.txt đã được sửa đổi bằng cách nào đó:

$ git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# (commit or discard the untracked or modified content in submodules) 
# 
#  modified: ignoreme (modified content) 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Thậm chí nếu bạn chạy git add ., những thay đổi trong ignoreme/ignore.txt sẽ không được thêm vào chỉ mục, trừ khi họ cam kết với các submodule như vậy:

$ cd ignoreme 
$ git commit -am"Time to change ignore.txt" 
$ cd .. 
$ git add . 
$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: ignoreme 
# 

Tuy nhiên nếu bạn muốn quên các sửa đổi cục bộ trong submodule:

$ cd ignoreme 
$ git reset --hard 
$ cd .. 
1

Git không lưu trữ danh bạ. Nếu bạn muốn giữ một thư mục trống trong Git, quy ước là đặt một tệp trống có tên là .keepme và cam kết nó.

Đối với câu hỏi, bạn sẽ không thể ẩn tệp trong nhánh thượng nguồn từ bản sao của nó, theo sự hiểu biết tốt nhất của tôi. Đây không phải là thứ mà Git được thiết kế để làm. Hãy xem xét các tùy chọn khác, như chia tách thành hai kho lưu trữ (và, có thể, bằng cách sử dụng subtree hoặc submodules). Hoặc giữ một nhánh riêng biệt ở phía thượng lưu để được theo dõi bởi hạ lưu và lọc ignore.txt từ nhánh đó bằng móc hậu nhận.

Hãy cho chúng tôi biết thêm lý do tại sao bạn muốn thực hiện việc này, có thể có cách tốt hơn.

Dù sao, tôi hy vọng rằng bạn không nên cố gắng để ẩn tập tin này vì lý do "an ninh" - nếu không vấn đề sẽ phức tạp hơn nhiều (ví dụ như bạn phải xóa nó ra khỏi toàn bộ lịch sử, vv)

+2

Tôi luôn thích đặt '.gitignore' bên trong thư mục cho các thư mục" trống ". – meagar

+0

Cách tiếp cận riêng biệt là cam kết tệp '.gitkeep' trống. Lý do là tiền tố terse và unambiguous: '. * # Ignore dotfiles'' .git * # nhưng không phải là những cấu hình kho lưu trữ, tức là .gitignore, .gitkeep' –

+0

'.keepme' là một thành ngữ được sử dụng rộng rãi. Như thường lệ với thành ngữ, bạn có thể đi ngược lại ngũ cốc và làm theo cách của bạn, nhưng với sự nguy hiểm của chính bạn. –

0

Kiểm tra ra một cam kết có tập tin đó sẽ thay thế nó, và chuyển đổi từ một cam kết với nó thành một cam kết mà không có nó sẽ loại bỏ nó. Git không thể làm gì khác được. .gitignore không ghi đè repo, thật thuận tiện để giữ cho các báo cáo trạng thái của bạn không bị xáo trộn.

Bạn có thể đặt tệp này thành liên kết tượng trưng đến một nơi nào đó bên ngoài lãnh thổ của git, điều này làm cho việc khôi phục khỏi hư hỏng được thực hiện bằng cách kiểm tra lịch sử xấu dễ dàng. Nếu đó không phải là một tùy chọn có bộ lọc-chi nhánh.

18

Hãy thử điều này

git update-index --assume-unchanged ignoreme/ignore.txt 

Git sẽ bỏ qua bất kỳ thay đổi trong tương lai để tập tin này mà không thay đổi kho. Để bắt đầu theo dõi các thay đổi một lần nữa, hãy sử dụng

git update-index --no-assume-unchanged ignoreme/ignore.txt 

Lưu ý rằng điều này chỉ có hiệu lực cho bản sao làm việc hiện tại, do đó bạn sẽ cần thực hiện việc này mỗi khi bạn sao chép kho lưu trữ.

+1

Nó vẫn thay đổi tập tin: ( – mowwwalker

+1

Điều này sẽ không dừng việc thay đổi tập tin. Nó sẽ đơn giản dừng việc hiển thị tập tin thay đổi. Nếu bạn muốn ngăn thay đổi tập tin hoàn toàn, bạn có thể thiết lập nó là đã đọc –

+2

Sử dụng '--assume-constant' chỉ là hợp pháp nếu bạn thực sự không thay đổi tập tin.Nếu bạn thay đổi nó, bạn đang nói dối với git và điều đó không bao giờ kết thúc tốt. –

0

Git chỉ áp dụng mẫu bỏ qua cho các tệp không được theo dõi. Bạn không thể sử dụng các mẫu bỏ qua để bỏ qua các thay đổi đối với các tệp đã được git theo dõi. Tuy nhiên, hãy xem https://gist.github.com/1423106 để biết cách mọi người đã giải quyết được vấn đề.

Lưu ý nếu bạn đang lo lắng về .gitignore chính nó, bạn có thể thử sử dụng .git/info/exclude cho tệp .gitignore chỉ repo cục bộ.Lưu ý rằng điều này sẽ không phải giải quyết vấn đề thay đổi tệp được theo dõi, chỉ cung cấp cho bạn .gitignores bổ sung sẽ không được theo dõi.

Các vấn đề liên quan