Tôi không nghĩ rằng một cam kết Git có thể ghi lại một ý định như là dừng theo dõi tệp này, nhưng không xóa nó.
Thực hiện một ý định như vậy sẽ yêu cầu can thiệp bên ngoài Git trong bất kỳ kho lưu trữ nào hợp nhất (hoặc rebase lên) một cam kết xóa tệp.
Lưu một bản sao, áp dụng xóa, khôi phục
Có lẽ cách dễ nhất để làm là bảo người dùng xuôi của bạn lưu một bản sao của tệp, kéo phần xóa của bạn, sau đó khôi phục tệp. Nếu họ đang kéo qua rebase và đang 'thực hiện' sửa đổi tệp, họ sẽ bị xung đột. Để giải quyết các xung đột đó, hãy sử dụng git rm foo.conf && git rebase --continue
(nếu cam kết xung đột có thay đổi bên cạnh các xung đột đối với tệp đã xóa) hoặc git rebase --skip
(nếu cam kết xung đột chỉ thay đổi thành tệp đã xóa).
Khôi phục tệp dưới dạng không bị theo dõi sau khi rút một cam kết xóa nó
Nếu họ đã rút ra cam kết xóa của bạn, họ vẫn có thể khôi phục phiên bản trước của tệp bằng git show :
git show @{1}:foo.conf >foo.conf
Hoặc với kiểm tra git (theo nhận xét của William Pursell; nhưng hãy nhớ xóa lại khỏi chỉ mục!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Nếu họ đã thực hiện các hành động khác kể từ khi kéo phần xóa của bạn (hoặc họ đang kéo theo rebase vào một ĐẦU tách rời), họ có thể cần một cái gì đó khác hơn @{1}
. Họ có thể sử dụng git log -g
để tìm cam kết ngay trước khi họ xóa bạn.
Trong một bình luận, bạn đề cập đến việc tập tin mà bạn muốn không bị khóa, nhưng giữ lại là một loại tập tin cấu hình cần thiết để chạy phần mềm (trực tiếp ra khỏi kho lưu trữ).
Giữ tệp dưới dạng 'Mặc định' và thủ công / Tự động kích hoạt nó
Nếu việc tiếp tục duy trì nội dung của tệp cấu hình trong kho lưu trữ là không hoàn toàn không thể chấp nhận được, bạn có thể đổi tên tệp được theo dõi từ (ví dụ) foo.conf
thành foo.conf.default
và sau đó hướng dẫn người dùng của bạn cp foo.conf.default foo.conf
sau khi áp dụng cam kết đổi tên. Hoặc, nếu người dùng đã sử dụng một số phần hiện có của kho lưu trữ (ví dụ: tập lệnh hoặc một số chương trình khác được định cấu hình theo nội dung trong kho lưu trữ (ví dụ Makefile
hoặc tương tự)) để khởi chạy / triển khai phần mềm của bạn, bạn có thể kết hợp cơ chế mặc định vào khởi chạy / quá trình triển khai:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Với cơ chế mặc định như vậy, người dùng sẽ có thể thực hiện một cam kết đổi tên foo.conf
thành foo.conf.default
mà không phải thực hiện thêm bất kỳ công việc nào. Ngoài ra, bạn tránh phải sao chép thủ công một tệp cấu hình nếu bạn thực hiện cài đặt / kho lưu trữ bổ sung trong tương lai.
Viết lại lịch sử yêu cầu Can thiệp thủ công Dù sao đi nữa
Nếu không thể chấp nhận duy trì nội dung trong kho lưu trữ thì có khả năng bạn sẽ muốn xóa hoàn toàn nội dung đó khỏi lịch sử bằng một cái gì đó như thế git filter-branch --index-filter …
. Lượng này để viết lại lịch sử, mà sẽ yêu cầu can thiệp bằng tay cho từng ngành / kho (xem phần “Phục hồi từ Upstream rebase” trong git rebase manpage ). Điều trị đặc biệt cần thiết cho tệp cấu hình của bạn sẽ chỉ là một bước khác mà người ta phải thực hiện trong khi khôi phục từ ghi lại:
- Lưu một bản sao của tập tin cấu hình.
- Phục hồi từ viết lại.
- Khôi phục tập tin cấu hình.
Bỏ qua nó để ngăn ngừa tái phát
Dù bạn sử dụng phương pháp nào, có lẽ bạn sẽ muốn bao gồm tên tệp cấu hình trong một .gitignore
tệp trong kho lưu trữ để không ai có thể vô tình git add foo.conf
trở lại (có thể, nhưng yêu cầu -f
/ --force
). Nếu bạn có nhiều hơn một tệp cấu hình, bạn có thể xem xét 'di chuyển' tất cả chúng vào một thư mục và bỏ qua toàn bộ (bằng cách 'di chuyển' Tôi có nghĩa là thay đổi nơi chương trình mong muốn tìm tệp cấu hình của nó và nhận người dùng (hoặc cơ chế khởi chạy / triển khai) để sao chép / di chuyển các tệp đến vị trí mới của chúng; rõ ràng bạn sẽ không muốn git mv một tệp vào một thư mục mà bạn sẽ bỏ qua).