2011-09-13 19 views
19

Tôi có một tập tin nhất định trong repo của tôi mà tôi đã thiết lập các giả chút thay đổi về:Ai chạm vào git của tôi giả định không thay đổi chút?

git update-index --assume-unchanged someFile.txt 

Một lần trong một thời gian, sau khi một số công việc trên repo, rằng bit là unset và tập tin là Automagically không assume-unchanged nữa không.

Ai đang chạm vào nó? Làm cách nào tôi có thể thực hiện việc này vĩnh viễn cho đến khi tôi nói rõ ràng với git:

git update-index --no-assume-unchanged someFile.txt 

Điều gì đang diễn ra ở đây?


Sửa: Tôi đang sử dụng các bit giả-không thay đổi trên các tập tin cấu hình mà thay đổi cục bộ, và nên không bao giờ được cam kết, chưa kể đến đẩy ngược dòng. Tôi không muốn nhìn thấy chúng trong git status, cũng không phải bất cứ nơi nào khác, trừ khi tôi nói với git một cách rõ ràng rằng tôi muốn chỉnh sửa và cam kết một trong số chúng.


Sửa: OK, tôi nghĩ rằng tôi quản lý để tạo lại vấn đề.

Tôi đã cam kết tệp từ một repo khác (không có nó như --assume-unchanged), được kéo vào repo của tôi và chắc chắn là bit đã được đặt lại.

Vì vậy, hai câu hỏi nảy sinh:

  1. Có thể thiết lập bit này trên repo có thẩm quyền trung ương để nó lan truyền đến tất cả các hợp đồng mua?
  2. Có thể làm cho bit này dính, ngay cả sau khi thay đổi từ xa với nó?
+0

Tôi nghĩ rằng tính năng này đã được dự tính trong danh sách git ít nhất một lần (ít nhất là trong chuỗi được đề cập bởi Mark bên dưới). Tôi không nghĩ rằng bất cứ ai bước lên để thực hiện nó mặc dù. –

+0

Tìm thấy một chủ đề có liên quan khác: http://thread.gmane.org/gmane.comp.version-control.git/146082 –

+0

Không có repo có thẩm quyền - xem câu hỏi tương tự của tôi ở đây: http://stackoverflow.com/questions/ 25123374/stop-tracking-a-file-in-git-without-have-it-deleted-hoặc-local-or-on-pul/25123571? Noredirect = 1 # và bài đăng trên blog này cho git giả định không thay đổi so với bỏ qua worktree : fallengamer.livejournal.com/93321.html –

Trả lời

3

IIRC nếu bạn bỏ qua tệp được phiên bản, tệp sẽ hoạt động như vậy. Bạn có thể bỏ qua tất cả các cây công việc từ .gitignore hoặc trong cây công việc cụ thể từ .git/info/exclude (có, nó hoạt động, nhưng không có ý định làm việc).

+1

Bỏ qua một tệp thuộc loại này "quý giá" có thể nguy hiểm. git coi các tệp bị bỏ qua là dùng một lần và có thể ghi đè lên chúng khi di chuyển giữa các phiên bản. (Cơ chế bỏ qua được dành cho các sản phẩm xây dựng.) –

+0

Bỏ qua không phải là vấn đề trong tầm tay. Bỏ qua là dành cho các tập tin không phiên bản. Tôi đang nói về '--assume-constant''ing cho các tập tin được phiên bản. –

+0

@Yuval: Trên thực tế không, không chỉ. Tôi không chắc liệu đó là do thiết kế, tác dụng phụ của việc thêm ngữ nghĩa trong git hay do tai nạn, nhưng nếu một tệp được phiên bản khớp với mẫu bỏ qua, git sẽ thấy tệp, nhưng bỏ qua những thay đổi được thực hiện cho nó. Nói cách khác, hành vi tương tự như '--assume-constant'. –

1

Dường như --skip-worktree + thanh toán thưa thớt có thể cho phép loại hành vi này.

Từ git assume unchanged vs skip worktree - ignoring a symbolic link (với một số sửa đổi theo ngữ cảnh):

  • Set core.sparseCheckout đến đúng đối với các kho lưu trữ.
  • Tạo tệp .git/info/sparse-checkout chứa hai mẫu: * để bao gồm mọi thứ và !/path/to/someFile.txt để loại trừ tệp cục bộ 'someFile.txt'.
  • Bây giờ, hãy tự đặt bit bỏ qua công việc thành someFile.txt.

Bây giờ bạn có thể tiếp tục mà không phải lo sợ git sẽ tự động chuyển thư mục, nhưng lưu ý rằng bạn vẫn gặp sự cố nếu ai đó chạy git một cách rõ ràng trên thư mục hoặc bất kỳ tệp nào trong đó.

Nghiên cứu sâu hơn trong the man page dường như chỉ ra rằng --skip-worktree phù hợp hơn với trường hợp sử dụng được hỏi.