Lưu ý: fallengamer đã thực hiện một số thử nghiệm vào năm 2011 (vì vậy chúng có thể bị lỗi thời), và đây là những phát hiện của anh ấy :
Hoạt động
- Tệp được thay đổi cả trong kho lưu trữ cục bộ và ngược dòng
git pull
:
Git duy trì các thay đổi cục bộ.
Do đó, bạn sẽ không vô tình làm mất bất kỳ dữ liệu nào mà bạn đã đánh dấu bằng bất kỳ cờ nào.
- Tệp có
assume-unchanged
cờ: Git sẽ không ghi đè tệp cục bộ. Thay vào đó, nó sẽ tạo ra xung đột và lời khuyên làm thế nào để giải quyết chúng
- Tệp có
skip-worktree
cờ: Git sẽ không ghi đè tệp cục bộ. Thay vào đó, nó sẽ tạo ra xung đột và lời khuyên làm thế nào để giải quyết chúng
- Tệp được thay đổi cả trong kho lưu trữ cục bộ và ngược dòng, cố gắng kéo
bằng cách sử dụng kết quả trong một số công việc thủ công bổ sung nhưng ít nhất bạn sẽ không mất bất kỳ dữ liệu nào nếu bạn có bất kỳ thay đổi cục bộ nào.
git stash
git pull
skip-worktree
- Tệp có
assume-unchanged
cờ: Loại bỏ tất cả các thay đổi cục bộ mà không có khả năng khôi phục chúng. Hiệu ứng giống như ' git reset --hard
'. ' git pull
' Cuộc gọi sẽ thành công
- Tệp có
skip-worktree
cờ: Stash sẽ không hoạt động trên skip-worktree
các tệp. ' git pull
' sẽ thất bại với cùng một lỗi như trên. Nhà phát triển buộc phải đặt lại thủ công skip-worktree
cờ để có thể stash và hoàn thành thất bại pull
.
- Không có thay đổi cục bộ, tệp ngược dòng đã thay đổi
Cả hai cờ sẽ không ngăn bạn nhận được các thay đổi ngược dòng. Git phát hiện ra rằng bạn đã thất hứa và chọn phản ánh thực tế bằng cách đặt lại cờ.
git pull
assume-unchanged
- Tệp có
assume-unchanged
cờ: Nội dung được cập nhật, cờ bị mất.
' git ls-files -v
' sẽ cho thấy cờ được sửa đổi thành H
(từ h
).
- Tệp có
skip-worktree
cờ: Nội dung được cập nhật, cờ được bảo tồn.
' git ls-files -v
' sẽ hiển thị S
cờ giống như trước pull
.
- Với tệp cục bộ đã thay đổi,
Git không chạm vào tệp và phản ánh thực tế (tệp được hứa là không thay đổi thực sự đã được thay đổi) cho tệp.
git reset --hard
skip-worktree
assume-unchanged
- Tệp có
assume-unchanged
cờ: Nội dung tệp được hoàn nguyên. Cờ được đặt lại thành H
(từ h
).
- Tệp có
skip-worktree
cờ: Nội dung tệp còn nguyên vẹn. Cờ vẫn như cũ.
Ông bổ sung các phân tích sau đây:
Dường như skip-worktree
đang cố gắng hết sức để bảo vệ dữ liệu trên máy của bạn . Nhưng nó không ngăn bạn nhận được những thay đổi ngược dòng nếu nó an toàn. Cộng với git không đặt lại cờ trên pull
.
Nhưng bỏ qua reset --hard
lệnh '' có thể trở thành một bất ngờ khó chịu cho một nhà phát triển.
Assume-unchanged
cờ có thể bị mất trong pull
hoạt động và những thay đổi cục bộ bên trong các tệp như vậy dường như không quan trọng đối với git.
Xem:
Ông kết luận:
Trên thực tế không có cờ nào là đủ trực quan .
assume-unchanged
giả định rằng một nhà phát triển không nên thay đổi một tập tin. Nếu một tập tin đã được thay đổi - thì sự thay đổi đó không quan trọng. Cờ này có nghĩa là để cải thiện hiệu suất cho các thư mục không thay đổi như SDK.
Nhưng nếu lời hứa bị phá vỡ và một tập tin thực sự bị thay đổi, git sẽ hoàn nguyên cờ để phản ánh thực tế. Có lẽ bạn có thể có một số cờ không nhất quán trong các thư mục thường không có nghĩa là phải thay đổi.
Mặt khác skip-worktree
rất hữu ích khi bạn hướng dẫn git không chạm vào một tệp cụ thể bao giờ. Điều đó hữu ích cho một tập tin cấu hình đã được theo dõi.
Kho lưu trữ chính ngược dòng lưu trữ một số cấu hình sẵn sàng sản xuất nhưng bạn muốn thay đổi một số cài đặt trong cấu hình để có thể thực hiện một số thử nghiệm cục bộ. Và bạn không muốn vô tình kiểm tra các thay đổi trong tệp đó để ảnh hưởng đến cấu hình sản xuất. Trong trường hợp đó skip-worktree
làm cho cảnh hoàn hảo.
Với Git 2.25.1 (tháng 2 năm 2020), "Thực tế không có cờ nào đủ trực quan" được đề cập ở trên được làm rõ thêm:
Xem cam kết 7a2dc95 , cam kết 1b13e90 (ngày 22 tháng 1 năm 2020) bởi brian m. carlson ( bk2204
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 53a8329 , ngày 30 tháng 1 năm 2020)
( Danh sách gửi thư của Git )
doc
: không cho phép người dùng cố gắng bỏ qua các tệp được theo dõi
Đã ký tắt: Jeff King
Đã ký tắt: brian m. carlson
Điều khá phổ biến là người dùng muốn bỏ qua các thay đổi đối với tệp mà Git theo dõi.
Các tình huống phổ biến cho trường hợp này là các cài đặt IDE và các tệp cấu hình, thường không được theo dõi và có thể được tạo từ các tệp được theo dõi bằng cơ chế tạo khuôn mẫu.
Tuy nhiên, người dùng tìm hiểu về các bit giả định không thay đổi và bỏ qua worktree và cố gắng sử dụng chúng để làm điều này bằng mọi cách.
Đây là vấn đề, bởi vì khi các bit này được đặt, nhiều thao tác hoạt động như người dùng mong đợi, nhưng chúng thường không giúp ích khi git checkout
cần thay thế một tệp.
Không có hành vi hợp lý trong trường hợp này, bởi vì đôi khi dữ liệu là quý giá, chẳng hạn như các tệp cấu hình nhất định và đôi khi đó là dữ liệu không liên quan mà người dùng sẽ vui lòng loại bỏ.
Vì đây không phải là cấu hình được hỗ trợ và người dùng dễ sử dụng sai các tính năng hiện có cho các mục đích ngoài ý muốn, gây ra nỗi buồn và sự nhầm lẫn chung , hãy ghi lại hành vi hiện tại và những cạm bẫy trong tài liệu để git update-index
người dùng biết họ nên khám phá các giải pháp thay thế.
Ngoài ra, hãy cung cấp một giải pháp được đề xuất để xử lý trường hợp phổ biến của các tệp cấu hình, vì có các phương pháp nổi tiếng được sử dụng thành công trong nhiều môi trường.
Các git update-index
trang người đàn ông hiện nay bao gồm:
Người dùng thường cố gắng sử dụng các bit assume-unchanged
và skip-worktree
bit để nói với 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 so với chỉ mục khi thực hiện các hoạt động 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ị.
Ví dụ: nếu tệp bạn muốn thay đổi là một loại tệp cấu hình, kho lưu trữ có thể bao gồm tệp cấu hình mẫu sau đó có thể được sao chép vào tên bị bỏ qua và sửa đổi. Kho lưu trữ thậm chí có thể bao gồm một tập lệnh để coi tệp mẫu là một mẫu, sửa đổi và sao chép nó tự động.
Phần cuối cùng đó là những gì tôi mô tả về trình điều khiển bộ lọc nội dung điển hình dựa trên các tập lệnh smudge / clean .
.gitignore
cho các mục đích tương tự. Giải pháp này sẽ làm việc cho bạn?