2010-07-20 29 views
52

Tôi vô tình thay đổi quyền của toàn bộ cây và cam kết thay đổi đó với các thay đổi nội dung khác.Tôi có thể thực hiện các thay đổi quyền bỏ qua git diff không

tôi sử dụng một cái gì đó như:

tar -czf deploy.tar git diff --name-only v1 v2

để tạo ra một tar với các tập tin sửa đổi giữa hai thẻ, vấn đề là bây giờ vì các điều khoản thay đổi gần như tất cả các cây của tôi được liệt kê như sửa đổi.

Có cách nào tôi có thể nói git diff để bỏ qua những tệp chỉ có quyền được thay đổi không?

+3

bản sao có thể có của [Làm cách nào để thực hiện thay đổi chế độ bỏ qua git (chmod)?] (Http://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-mode-changes-chmod) – Leonel

Trả lời

115

này sẽ cho git để bỏ qua điều khoản:

git config core.filemode false 
+2

Có thể điều này có thể ngăn không cho thêm tệp với quyền đã thay đổi vào cam kết, nhưng trong trường hợp của tôi, tệp được cam kết, được đẩy và gắn thẻ và lệnh bạn đề xuất không giúp tôi. Tôi đoán tôi sẽ phải thực hiện một số loại kịch bản bash để phân tích đầu ra của git diff để loại bỏ các dòng về thay đổi chế độ, và cung cấp kết quả cho tar. Bất kỳ ý tưởng nào cũng được chào đón sau đó – Cesar

+0

@Cesar: Lệnh này yêu cầu git bỏ qua các khác biệt về quyền giữa chỉ mục và bản sao làm việc. Đó không phải là những gì bạn muốn? –

+0

Tôi mới đến git, nhưng điều là sự khác biệt là giữa các cam kết. Khi tôi làm git diff tag1 tag2, nó hiển thị tất cả các tập tin mà tôi đã thay đổi quyền bên cạnh các tập tin có nội dung sửa đổi, tôi chỉ muốn tìm cách bỏ qua tất cả 'thay đổi chế độ 664 => 775', tôi hy vọng tôi thực hiện bản thân mình rõ ràng – Cesar

9

Tôi có vấn đề này sau khi cố ý loại bỏ sự cho phép thực hiện từ các tập tin mã nguồn (~ file 26K). Sau đó, git diff nói rằng tất cả các tệp đã thay đổi! Câu trả lời với core.filemode không giúp tôi vì điều đó chỉ ảnh hưởng đến các diff khác với dir làm việc của bạn, không khác với 2 commit trong repo.

Câu trả lời là sử dụng lệnh chi nhánh bộ lọc (đáng sợ lớn). Cụ thể, tất cả những gì bạn cần phải nhập là:

git filter-branch -f --tree-filter 'find * -type f | xargs chmod 644 ' -- --all 

từ thư mục gốc của thư mục làm việc của bạn. Tất nhiên, hãy chắc chắn để làm cho một bản sao của repo của bạn đầu tiên (cp -pr ~/repo.git ~/repo-orig.git hoặc tương tự), trong trường hợp bạn cần phải thử lại.

Tận hưởng!

+1

Thú vị (+1). Tôi đã bao gồm nó trong câu trả lời của tôi tại http://stackoverflow.com/a/12979453/6309 (kể từ khi câu trả lời của riêng bạn đã bị xóa) – VonC

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