Đồng bộ lại git repo với tệp .gitignore mới


191

Có thể "làm mới" kho lưu trữ git sau khi cập nhật tệp gitignore không?

Tôi vừa thêm nhiều sự thiếu hiểu biết (?) Cho gitignore của tôi và muốn xóa nội dung đã có trong repo khớp với tệp mới.



Có thể, giải pháp đó có thể xóa các tệp đã được cam kết phù hợp với gitignore mới không?
Christian Wattengård

99
+1 để phát minh từ "đánh lửa".
Aasmund Eldhuset

3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset nó chính thức
Daniel Springer

1
@ user770: Hôm nay tôi học được!
Aasmund Eldhuset

Câu trả lời:


369

Giải pháp được đề cập trong " tập tin .gitignore không bỏ qua " là một chút cực đoan, nhưng nên hoạt động:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( Đảm bảo cam kết đầu tiên thay đổi của bạn, bạn muốn giữ lại , để tránh sự cố bất kỳ như jball037 ý kiến dưới đây .
Các --cachedtùy chọn sẽ giữ các tập tin của bạn bị ảnh hưởng trên đĩa của bạn mặc dù.)

Bạn cũng có một giải pháp chi tiết hơn trong bài đăng trên blog " Làm cho Git bỏ qua các tệp đã được theo dõi ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim gợi ý trong bản chỉnh sửa của mình :

Các tệp có không gian trong đường dẫn của chúng

Trong trường hợp bạn nhận được thông báo lỗi như thế fatal: path spec '...' did not match any files, có thể có các tệp có khoảng trắng trong đường dẫn của chúng.

Bạn có thể xóa tất cả các tệp khác với tùy chọn --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

nhưng các tệp chưa từng có sẽ vẫn còn trong kho lưu trữ của bạn và sẽ phải được xóa một cách rõ ràng bằng cách đặt đường dẫn của chúng bằng dấu ngoặc kép:

git rm --cached "<path.to.remaining.file>"

Tôi đã thấy rằng bước git add là không cần thiết, khi tôi chạy trạng thái git sau git rm --cached, các tệp đã xóa đã nằm trong khu vực tổ chức và bạn có thể tiếp tục và cam kết chúng.
chap

3
Tôi chỉ chạy cái này, mất tất cả những thay đổi không được cam kết và gần như tuyên bố từ chức khỏi công việc của tôi. Câu trả lời được chấp nhận về chủ đề này đã cứu cuộc đời tôi: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037 7/07/2015

2
@VonC xin lỗi, điều đó không có nghĩa là một lời ca ngợi hay một cây gậy :) Nhưng vâng, tôi đã sử dụng - đã bị lỗi và tất cả các thay đổi không được cam kết của tôi đã bị mất khi tôi kiểm tra các tệp của mình. Hoảng loạn một lúc nhưng "git reset HEAD" đã khôi phục các tệp của tôi (nhưng lần này không có các tệp tôi đã chỉ định trong .gitignore, vì vậy giải pháp của bạn vẫn hoạt động!)
jball037 7/07/2015

3
@ jball037 Tốt. Tôi đã thêm cảnh báo và chỉnh sửa câu trả lời cho phù hợp.
VonC

1
nếu chỉ tôi đọc thêm một dòng trước khi thực hiện điều này "(hãy đảm bảo cam kết trước những thay đổi bạn muốn giữ, để tránh mọi sự cố như jball037" #fml
Aiden Strydom

9

Tôi có thể hiểu nhầm, nhưng bạn đang cố xóa các tệp mới bị bỏ qua hoặc bạn muốn bỏ qua các sửa đổi mới cho các tệp này? Trong trường hợp này, điều đang làm việc.

Nếu bạn muốn xóa các tập tin bị bỏ qua đã cam kết trước đó, sau đó sử dụng

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Những gì với dấu ngoặc đơn ở đây?
IgorGanapolsky

Đây là một câu trả lời tuyệt vời
Holene 28/12/18

Đây là một đơn giản rất lý do tại sao để gỡ bỏ những file sau khi tôi cập nhật .gitignore tôi Tuy nhiên nó cần một vài cập nhật nhỏ: `` git rm -cached git ls-files -i –exclude-standard git commit -m 'dọn dẹp' '
Aaron

1

Tôi biết đây là một câu hỏi cũ, nhưng giải pháp của gracchus không hoạt động nếu tên tệp chứa khoảng trắng. Giải pháp của VonC đối với tên tệp có dấu cách là không xóa chúng bằng cách sử dụng --ignore-unmatch, sau đó xóa chúng theo cách thủ công, nhưng điều này sẽ không hoạt động tốt nếu có nhiều.

Đây là một giải pháp sử dụng các mảng bash để chụp tất cả các tệp.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
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.