Giữ tệp trong repo Git, nhưng không theo dõi các thay đổi


305

Tôi có một số tệp trong trang CodeIgniter mà tôi muốn có trong repo nhưng không theo dõi bất kỳ thay đổi nào.

Ví dụ: tôi triển khai cài đặt mới của khung này cho máy khách mới, tôi muốn các tệp sau được tải xuống (chúng có giá trị mặc định CHANGEME) và tôi chỉ phải thay đổi cụ thể cho máy khách này (thông tin cơ sở dữ liệu, thông tin địa chỉ email, CSS tùy chỉnh).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

Hiện tại nếu tôi chạy

git clone git@github.com:user123/myRepo.git httpdocs

và sau đó chỉnh sửa các tập tin ở trên, tất cả đều tuyệt vời. Cho đến khi tôi phát hành một hotfix hoặc bản vá và chạy git pull. Tất cả những thay đổi của tôi sau đó được ghi đè.





Bạn chỉ có thể bỏ qua các tệp thông tin / cấu hình máy khách và có chương trình xây dựng các tệp mặc định nếu chúng bị thiếu khi cài đặt lại repo?
MatthewG

Câu trả lời:


618

git có một giải pháp khác để làm điều này. Đầu tiên thay đổi tệp bạn không muốn bị theo dõi và sử dụng lệnh sau:

git update-index --assume-unchanged FILE_NAME

và nếu bạn muốn theo dõi các thay đổi một lần nữa, hãy sử dụng lệnh này:

git update-index --no-assume-unchanged FILE_NAME

tài liệu git-update-index


Tôi đã làm những gì bạn nói nhưng trạng thái git cứ nói rằng tệp đã được sửa đổi
rraallvv

7
Vâng, đây phải là "Câu trả lời được chấp nhận." Đã làm cho tôi.
joshmcode

34
Theo Junio ​​Hamano (người duy trì Git): "Giả sử không thay đổi không nên bị lạm dụng cho một cơ chế bỏ qua. [...] Git không phải là một lời hứa của Git rằng Git sẽ luôn coi những đường dẫn này là không thay đổi --- nếu Git có thể xác định đường dẫn được đánh dấu là giả định không thay đổi mà không phải chịu thêm chi phí lstat (2), nó có quyền báo cáo rằng đường dẫn đã được sửa đổi (kết quả là "git commit -a" được tự do cam kết rằng thay đổi)." Nói cách khác, giả định không thay đổi chỉ dành cho các vấn đề hiệu suất cục bộ. Nếu Git có thể xác định rằng các tệp đó thay đổi theo cách nhẹ hơn, thì nó sẽ.
Alejandro García Iglesias

41
Đọc thông tin cho nó, tôi nghĩ rằng --skip-worktreetùy chọn này phù hợp với công việc này hơn --assume-unchanged.
PJSCopeland

26
--skip-worktree thực sự là lựa chọn tốt hơn. Thêm thông tin: stackoverflow.com/questions/13630849/ trên
Tùy biến

80

Để rút ra một câu trả lời từ các ý kiến ​​của một câu trả lời khác:

$ git update-index --skip-worktree FILENAME

Xuất hiện là một lựa chọn tốt hơn --assume-unchanged

Có thể đọc thêm về điều này tại đây: Git - Sự khác biệt giữa 'giả định không thay đổi' và 'bỏ qua công việc'



Khi tôi làm điều này và sau đó cố gắng thay đổi các nhánh, tôi nhận được "Các tệp cây làm việc không được theo dõi sau đây sẽ bị ghi đè bằng thanh toán ... Vui lòng di chuyển hoặc xóa chúng trước khi bạn chuyển nhánh". Bất cứ ý tưởng làm thế nào để tránh?
Patrick Szalapski

Các bài viết được tham chiếu bởi @aexl đã chuyển sang compiledsuccessfully.dev/git-skip-worktree
Andrew Keeton

1
Các tài liệu nói rằng đây là một ý tưởng tồi. "Người dùng thường cố gắng sử dụng các bit giả định không thay đổi và bỏ qua worktree để báo cho Git bỏ qua các thay đổi đối với các tệp được theo dõi. Điều này không hoạt động như mong đợi, vì Git vẫn có thể kiểm tra các tệp cây làm việc theo chỉ mục khi thực hiện một số thao tác nhất định. Nói chung, Git không cung cấp cách bỏ qua các thay đổi đối với các tệp được theo dõi, vì vậy các giải pháp thay thế được khuyến nghị. "
Curtis Blackwell

58

Đối với các dự án Code Igniter của tôi, tôi giữ cơ sở dữ liệu.php.exampleconfig.php.example trong repo.

Sau đó, tôi thêm config.phpapplication / config / database.php vào tệp .gitignore .

Vì vậy, cuối cùng, khi tôi triển khai, tôi có thể sao chép các tệp .example (sang config.php và database.php), tùy chỉnh chúng và chúng sẽ không bị GIT theo dõi.


12
Giải pháp tốt đẹp, nhưng tôi nghĩ câu trả lời của Nasirkhan là tốt nhất.
lời giới thiệu

Đây không phải là một giải pháp tốt. Nếu bạn xóa chỉ số git của mình, bạn sẽ bắt đầu theo dõi các thay đổi khi bạn không có ý định. Xem @nasirkhans trả lời cho cách chính xác để làm điều này.
Brian Melton-Grace - MSFT

3
Tôi không đồng ý với cả những bình luận trước đó. Bằng cách này, việc cập nhật các giá trị "mặc định" dễ dàng hơn nhiều mà không cần phải kiểm tra chúng và sao chép cấu hình cục bộ của bạn ở nơi khác chỉ để đặt lại sau. Ngoài ra, nó áp dụng cho tất cả các kho lưu trữ để bạn không phải thực hiện bất kỳ thay đổi lặp lại nào.
OskarD90

1
nếu nó ở trong gitignore tại sao nó lại bắt đầu theo dõi các thay đổi một lần nữa
Shapeshifter

Giải quyết vấn đề của OP nhưng không thực sự trả lời câu hỏi.
Travis Wilson

1

Tôi sẽ đặt chúng vào .gitignoretập tin của bạn và chỉ cần sao chép chúng theo cách thủ công khi cần thiết.

Vì vậy, tên tệp bộ xương sẽ là git, tên tệp bỏ qua sẽ không có trong git (nhưng sẽ ở dạng .gitignore). Bằng cách đó, khi bước thủ công để sao chép chúng vào 'thực tế' từ 'mẫu' (tên tốt hơn bộ xương có lẽ) được thực hiện, chúng ngay lập tức bị bỏ qua.


1
Không có cách nào để thêm chúng vào repo trước, sau đó thêm chúng vào .gitignore? Sẽ thật tuyệt nếu có một giải pháp cho việc này bao gồm các tệp nhưng không có bất kỳ thay đổi nào sau một cam kết nhất định hoặc một cái gì đó.
gorelative

1
@mklauber Tôi muốn giữ chúng vô thời hạn cho đến khi tôi chạy git rm <file>. Mục đích là IE: một tập tin config.php. Tôi muốn giữ tệp cấu hình nhưng rõ ràng tôi không muốn theo dõi thông tin cơ sở dữ liệu từ máy khách này sang máy khách khác nhau.
gorelative

1
Có, tôi có vấn đề với tập tin cơ sở dữ liệu rails. Chúng tôi giữ một bộ xương và sau đó sao chép và thay đổi nó.
Michael Durrant

nếu tôi tạo các tệp cấu hình "Skeleton" này, bạn sẽ thêm chúng vào một cam kết ban đầu. và sau đó sửa đổi .gitignore để bỏ qua các tập tin? Có hiệu lực giữ các tập tin trong repo nhưng như một bộ xương?
gorelative

10
Bạn có hai tùy chọn sau: Thêm tệp bằng cách git add file1sau đó chỉnh sửa .gitignoretệp của bạn . Các tập tin cam kết sẽ ở lại đó và không được cập nhật. Hoặc: Bạn có thể thêm tệp vào .gitignorevà sau đó thêm tệp đó git add --force file1để buộc tệp vào. Bạn có thể sử dụng tùy chọn thứ 2 bất cứ khi nào bạn phải ghi đè lên tệp
klaustopher 20/03/2016

1

Các câu trả lời được đưa ra đang giải quyết vấn đề chỉ một phần, nhưng giới thiệu nhiều vấn đề hơn.

Tôi cần bảo toàn tệp "Web.Local.config". Giải pháp duy nhất hiệu quả với tôi là:

1. Loại trừ các tập tin từ dự án

2. Tạo một bản sao riêng biệt của tệp dưới dạng Web.LocalTemplate.config

Bây giờ "Web.LocalTemplate.config" được theo dõi bởi Git, tất cả các nhà phát triển có thể sử dụng nó làm điểm bắt đầu. Tuy nhiên, "Web.Local.config", không phải là một phần của dự án sẽ tự động bị bỏ qua.


Làm thế nào git update-index --skip-worktree FILENAMEchỉ giải quyết vấn đề của bạn một phần, hoặc thậm chí thêm nhiều vấn đề ?? Nó giải quyết chính xác những gì bạn đang cố gắng làm. Bạn đã thử à?
Amir Asyraf
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.