Git có chế độ an toàn của người dùng không, để ngăn chặn việc viết lại lịch sử?


11

Khi bạn mới sử dụng Git (và DVCS nói chung) và bạn bắt đầu khám phá các thay đổi viết lại lịch sử, bạn sẽ an toàn nếu kho lưu trữ chỉ cục bộ, nhưng bạn có thể gặp sự cố nếu bạn làm việc với điều khiển từ xa và cố gắng đẩy những thay đổi như vậy.

Một tính năng mà tôi mong đợi là khả năng kích hoạt "chế độ an toàn", về cơ bản sẽ ngăn tôi làm bất cứ điều gì tôi không nên làm ... Và ý tôi là gì? Tôi có nghĩa là thay đổi viết lại lịch sử cho những thứ đã được đẩy đến một nguồn gốc. Tôi không thể xác định chính xác, nhưng điều này sẽ bao gồm các trường hợp như:

  • commit --amend khi đã được đẩy
  • rebase của một chi nhánh không phải địa phương
  • reset của một chi nhánh đã được đẩy

Đây là những ví dụ về các tình huống có thể sẽ khiến pushthất bại tiếp theo (bởi vì nó sẽ không được chuyển tiếp nhanh, IIRC). Tôi đã thực hiện một số điều đó một cách tình cờ và phải tạo lại chi nhánh trên điều khiển từ xa. Và tôi vẫn may mắn làm điều này đủ nhanh để không ai kéo lại lịch sử mà tôi đã viết lại.

Tôi tin rằng có thể xác định loại thay đổi này và, theo yêu cầu, ngăn người dùng thực hiện chúng. Có lẽ có một lựa chọn cho điều đó?

Nếu không, bạn có nghĩ rằng đáng để thử tạo nó không? Bạn có cố gắng xác định chính xác làm thế nào để xác định một "thay đổi nguy hiểm" như vậy không?


Trong môi trường làm việc trong đó thực hiện các thay đổi xấu ảnh hưởng đến các lập trình viên khác, có lẽ bạn nên miễn cưỡng thực hiện các hành động này trừ khi bạn chắc chắn đó là điều nên làm. Ngay cả sau đó, bạn nên xác minh rằng không có vấn đề tồn tại sau đó. Hãy tưởng tượng rằng một vài năm trước, tôi đã ở trong một nhóm gồm nhiều lập trình viên, trong đó một người sẽ không có nguồn nào cam kết nguồn không được biên dịch ! Tôi muốn bắn chết anh ta sau 3 tháng.
Neil

Có vẻ hợp lý, bạn có thể phát hiện ra điều này trong một cái móc trên máy từ xa và sau đó từ chối các thay đổi.
Andrew T Finnell


Tôi không nhận được câu hỏi của bạn. Chế độ mặc định là an toàn. Nó sẽ không cho phép bạn đẩy, trừ khi bạn chỉ định --force.
Let_Me_Be

Tôi cũng muốn thấy một cái gì đó như thế này. Về cơ bản, tôi muốn cung cấp cho những người học git một phiên bản an toàn hơn, có lẽ chỉ bằng cách gói dòng lệnh và chỉ đưa ra những điều cơ bản: cam kết, kéo, đẩy, những thứ đơn giản. Buộc họ phải git đầy đủ cho bất cứ điều gì trên trang này: git-scm.com/book/en/Git-Tools-Rewriting-History Git đã khó học hơn một chút so với các công cụ khác để có một repo cục bộ và từ xa để suy nghĩ về - lo lắng bạn có thể rebase thay vì rollback là đáng sợ.
Chris Moschini

Câu trả lời:


5

Điều này có vẻ rất gần, nếu không phải là câu hỏi tương tự như Chiến lược ngăn chặn hoặc bắt lại lịch sử viết lại Git

Để tổng hợp, bạn có thể kích hoạt

git config --system receive.denyNonFastforwards true

git config --system receive.denyDeletes true

Hoặc viết một bài nhận móc để từ chối bất cứ điều gì bạn xác định là viết lại.


1
Tôi tin denyNonFastforwardslà mặc định (?), Trong khi denyDeleteskhông. Cả hai đều hữu ích, nhưng tôi đang tưởng tượng một giải pháp phía khách hàng sẽ ngăn tôi tức là thực hiện commit --amendnếu tôi không thể đẩy nó (vì CHÍNH đã bị đẩy).
Kos

Nói cách khác: Ngoài các cơ chế cho phép giữ một điều khiển từ xa nhất quán, tôi cũng muốn một cái gì đó cho phép giữ một bản sao "nhất quán" với một điều khiển từ xa.
Kos

@Kos Bạn cũng có thể tạo các móc cục bộ
Andrew T Finnell

Có cách nào denyNonFastfowardsđể truechỉ đặt trên nhánh chính không? Tôi muốn các nhánh chủ đề của tôi được phép nổi loạn và bị đẩy mạnh.
nnyby

2

Không bởi vì đó là một phần của triết lý của git để cung cấp cho bạn toàn bộ sức mạnh và cho phép bạn quản lý sức mạnh đó theo cách bạn muốn.

Nếu bạn không tuân thủ triết lý này, thì có lẽ việc chuyển sang Mercurial sẽ có giá trị vì chúng cho phép viết lại lịch sử nhưng theo cách hạn chế hoặc, rõ ràng, miễn cưỡng, điều đó khiến bạn cảm thấy đó không phải là một ý tưởng hay.


2
Tôi mắc lỗi. Một cơ chế yêu cầu tôi xác nhận rõ ràng bất cứ khi nào tôi làm điều gì đó nguy hiểm là điều gì đó có vẻ phù hợp với "quản lý sức mạnh của tôi theo cách tôi muốn". :-) (Cũng Git đã làm điều đó vào các dịp.)
Kos

2

AFAIK, cách git giải quyết các vấn đề này là bất cứ khi nào bạn yêu cầu một hành động như vậy, nó sẽ thực hiện nó cục bộ, nhưng thông báo cho bạn rằng những gì bạn đang làm có thể có những hậu quả không mong muốn. Vào thời điểm đó, bạn chưa đẩy bất cứ điều gì, vì vậy bạn có thể xem xét kho lưu trữ cục bộ của mình và có thể hoàn tác thay đổi nguy hiểm trước khi bạn đẩy. Bạn phải chú ý đến những gì git đang nói với bạn, và tốt hơn hết là bạn nên cẩn thận khi sửa chữa những lỗi đó.

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.