Czy Git ma „tryb bezpieczny”, aby zapobiec przepisywaniu historii?

11

Kiedy jesteś trochę nowy w Git (i ogólnie DVCS) i zaczynasz badać zmiany przepisujące historię, jesteś bezpieczny, jeśli repozytorium jest tylko lokalne, ale możesz napotkać problemy, jeśli pracujesz z pilotami i próbujesz popchnij takie zmiany.

Oczekiwaną funkcją jest możliwość włączenia „trybu bezpiecznego”, który zasadniczo powstrzyma mnie od robienia tego, czego nie powinienem robić… A co mam przez to na myśli? Mam na myśli zmiany przepisujące historię dla rzeczy, które już zostały przekazane do źródła. Nie potrafię tego precyzyjnie zdefiniować, ale obejmuje to takie przypadki, jak:

  • commit --amend kiedy HEAD został już wypchnięty
  • rebase oddziału nielokalnego
  • reset odepchniętej gałęzi

Są to przykłady sytuacji, które prawdopodobnie spowodują kolejny pushbłąd (ponieważ nie będzie to szybkie przewijanie do przodu, IIRC). Zrobiłem to przez przypadek i musiałem odtworzyć gałąź na pilocie. I nadal miałem szczęście zrobić to wystarczająco szybko, aby nikt nie wyciągnął historii, którą przepisałem.

Uważam, że można zidentyfikować tego rodzaju zmiany i, na żądanie, uniemożliwić użytkownikowi ich wprowadzenie. Czy jest na to jakaś opcja?

Jeśli nie, czy uważasz, że warto spróbować go stworzyć? Czy próbowałbyś precyzyjnie zdefiniować, jak rozpoznać taką „niebezpieczną zmianę”?

Kos
źródło
W środowisku pracy, w którym popełnianie złych zmian wpływa na innych programistów, powinieneś być bardziej niechętny do wykonywania tych działań, chyba że masz pewność, że to coś powinno działać. Nawet wtedy powinieneś sprawdzić, czy później nie występują żadne problemy. Wyobraź sobie, że kilka lat temu byłem w zespole wielu programistów, w którym nie byłoby żadnych skrupułów, podejmując źródło, które się nie skompilowało ! Chciałem zastrzelić go martwego po 3 miesiącach tego.
Neil,
Wydaje się rozsądne, że można to wykryć w haczyku na zdalnej maszynie, a następnie odrzucić zmiany.
Andrew T Finnell,
Nie dostaję twojego pytania. Tryb domyślny jest bezpieczny. Nie pozwoli ci to pchać, chyba że określisz --force.
Šimon Tóth,
Też chciałbym zobaczyć coś takiego. Zasadniczo chciałbym zapewnić tym uczącym się git bezpieczniejszą wersję, prawdopodobnie po prostu owijając wiersz poleceń i ujawniając tylko podstawy: zatwierdzanie, wyciąganie, wypychanie, proste rzeczy. Zmusić ich do pełnego git za cokolwiek na tej stronie: git-scm.com/book/en/Git-Tools-Rewriting-History Git jest już trochę trudniejszy do nauczenia niż inne narzędzia do posiadania lokalnego i zdalnego repozytorium do przemyślenia - martwienie się, że możesz bazować zamiast wycofywania, jest przerażające.
Chris Moschini,

Odpowiedzi:

5

To wygląda bardzo blisko, jeśli nie to samo pytanie, jak Strategia Zapobiegania lub Łapanie historii Git Przepisz

Podsumowując, możesz włączyć

git config --system receive.denyNonFastforwards true

i

git config --system receive.denyDeletes true

Lub napisz post otrzymujący hak, aby odrzucić wszystko, co uważasz za przepisanie.

Andrew T Finnell
źródło
1
Wierzę, że denyNonFastforwardsjest domyślna (?), Podczas gdy denyDeletesnie jest. Te dwa są przydatne, ale wyobrażam sobie rozwiązanie po stronie klienta, które powstrzymałoby mnie przed zrobieniem „a”, commit --amendgdybym nie był w stanie go przepchnąć (ponieważ HEAD został już wciśnięty).
Kos
Innymi słowy: oprócz mechanizmów, które pozwalają zachować spójność pilota, chciałbym również coś, co pozwoli zachować „spójność” klonu z pilotem.
Kos,
@ Ko Możesz również tworzyć lokalne haki
Andrew T Finnell,
Czy można ustawić denyNonFastfowardsopcję truetylko w gałęzi master? Chciałbym, aby moje gałęzie tematyczne mogły być ponownie bazowane i zmuszane.
nnyby
2

Nie, ponieważ jest to częścią filozofii git, która daje ci pełną moc i pozwala ci zarządzać tą mocą tak, jak chcesz.

Jeśli nie zastosujesz się do tej filozofii, być może warto przejść na Mercurial, ponieważ pozwalają one na przepisywanie historii, ale w sposób ograniczony lub, mówiąc jasno, niechętnie, co sprawia, że ​​czujesz, że nie jest to dobry pomysł.

Klaim
źródło
2
Robię błędy. Mechanizm, który wymaga ode mnie jawnego potwierdzenia za każdym razem, gdy robię coś niebezpiecznego, wydaje się pasować do „zarządzania moją mocą tak, jak chcę”. :-) (Również Git już to robi czasami).
Kos
2

AFAIK, sposób, w jaki git rozwiązuje te problemy, polega na tym, że za każdym razem, gdy poprosisz o takie działanie, wykona je lokalnie, ale poinformuje cię, że to, co robisz, może mieć niepożądane konsekwencje. W tym momencie nic jeszcze nie wypchnąłeś, więc możesz przejrzeć swoje lokalne repozytorium i być może cofnąć niebezpieczną zmianę przed wypchnięciem. Musisz jednak zwracać uwagę na to, co mówi ci git i lepiej bądź ostrożny, gdy naprawisz takie błędy.

tdammers
źródło