Tôi lo lắng rằng tôi có thể quên tính năng tiện lợi này vào lần tới khi tôi cần nó.
Git 2.13 (Q2 2017) giải thích lý do tại sao không có "sự bảo vệ" nào đối với tùy chọn đẩy này bị lãng quên, bởi vì ngay cả khi bạn không quên nó ở git push
cấp độ, nó vẫn có thể bị bỏ qua.
Xem cam kết f17d642 (19 tháng 4 năm 2017) của Ævar Arnfjorð Bjarmason ( avar
) .
(Được hợp nhất bởi Junio C Hamano - gitster
- trong cam kết 46bdfa3 , ngày 26 tháng 4 năm 2017)
push
: tài liệu & kiểm tra --force-with-lease
với nhiều điều khiển từ xa
Tài liệu & kiểm tra cho các trường hợp có hai điều khiển từ xa trỏ đến cùng một URL và tìm nạp nền & sau đó git push --force-with-lease
không nên ghi lại các tham chiếu chưa cập nhật mà chúng tôi chưa tìm nạp.
Một số trình soạn thảo như VSC của Microsoft có tính năng tự động tìm nạp trong nền, điều này bỏ qua các biện pháp bảo vệ được cung cấp bởi --force-with-lease
&--force-with-lease=<refname>
, như đã lưu ý trong tài liệu được thêm vào đây.
Vì vậy, các tài liệu chogit push
bây giờ bao gồm:
lưu ý chung về an toàn: cung cấp tùy chọn này mà không có giá trị mong đợi, nghĩa là --force-with-lease
hoặc --force-with-lease=<refname>
tương tác rất xấu với bất cứ thứ gì ngầm chạy git fetch
trên điều khiển từ xa để được đẩy xuống nền, ví dụ như git fetch origin
trên kho lưu trữ của bạn trong một cronjob.
Sự bảo vệ mà nó mang lại --force
là đảm bảo rằng những thay đổi tiếp theo mà công việc của bạn không dựa trên không bị ghi đè, nhưng điều này bị đánh bại một cách tầm thường nếu một số quy trình nền đang cập nhật các ref trong nền. Chúng tôi không có bất cứ điều gì ngoại trừ thông tin theo dõi từ xa sẽ xuất hiện dưới dạng heuristic cho các ref mà bạn dự kiến sẽ thấy và sẵn sàng ghi đè.
Nếu trình soạn thảo của bạn hoặc một số hệ thống khác đang chạy git fetch
trong nền cho bạn một cách để giảm thiểu điều này là chỉ cần thiết lập một điều khiển từ xa khác:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Bây giờ khi quá trình nền chạy git fetch origin
các tham chiếu trên origin-push
sẽ không được cập nhật và do đó các lệnh như:
git push --force-with-lease origin-push
Sẽ thất bại trừ khi bạn tự chạy git fetch origin-push
.
Phương pháp này tất nhiên bị đánh bại hoàn toàn bởi một cái gì đó chạy git fetch
--all
, trong trường hợp đó bạn cần phải vô hiệu hóa nó hoặc làm một cái gì đó tẻ nhạt hơn như:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
Tức là tạo một base
thẻ cho các phiên bản của mã ngược dòng mà bạn đã thấy và sẵn sàng ghi đè, sau đó viết lại lịch sử và cuối cùng buộc thay đổi đẩy sang master
nếu phiên bản từ xa vẫn còn base
, bất kể nội bộ của bạn remotes/origin/master
đã được cập nhật trong lý lịch.
rm
đểrm -i
trong .bashrc của bạn; một ngày nào đó bạn sẽ quên và xóa một tập tin quan trọng trên máy chủ. Đi với bí danh của riêng bạn không có vấn đề đó :)