Чи має Git "безпечний режим", щоб запобігти переписуванню історії?


11

Коли ви по-новому з Git (і DVCS взагалі), і ви починаєте досліджувати зміни, які переписують історію, ви безпечні, якщо сховище лише локальне, але у вас можуть виникнути проблеми, якщо ви працюєте з пультами та намагаєтесь підштовхнути такі зміни.

Особливістю, яку я очікував, є можливість включення "безпечного режиму", який в основному заважає мені робити все, що я не повинен робити ... І що я маю на увазі під цим? Я маю на увазі зміни в переписуванні історії для речей, які вже підштовхнуті до свого походження. Я не можу його точно визначити, але це включає такі випадки, як:

  • commit --amend коли HEAD вже натиснув
  • rebase немісцевого відділення
  • reset відгалуженої гілки

Це приклади ситуацій, які, ймовірно, призведуть до наступного pushневдачі (оскільки це не буде швидким перемогою вперед, IIRC). Я зробив щось із цього випадково і мені довелося заново створити гілку на пульті. І мені ще пощастило зробити це досить швидко, щоб ніхто не тягнув історію, яку я переписав.

Я вважаю, що можна визначити цей тип змін і, на вимогу, не дати користувачеві вносити їх. Чи є для цього варіант?

Якщо цього немає, чи вважаєте ви, що варто спробувати його створити? Ви б спробували точно визначити, як визначити таку "небезпечну зміну"?


У робочому середовищі, в якому вчинення поганих змін впливає на інших програмістів, ви, мабуть, повинні бути більш неохоче виконувати ці дії, якщо ви впевнені, що це має щось працювати. Вже тоді ви повинні переконатися, що після цього жодних проблем не зберігається. Уявіть , що кілька років тому, я був в команді багатьох програмістів , в яких один не матиме ніяких сумнівів в скоєнні джерел , які не зібрав ! Я хотів застрелити його мертвим через 3 місяці того.
Ніл

Здається розумним, що ви могли виявити це в гачку на віддаленій машині, а потім відхилити зміни.
Ендрю Т Фіннелл


Я не розумію вашого запитання. Режим за замовчуванням безпечний. Це не дозволить вам натиснути, якщо ви не вкажете --force.
Шімон Тот

Я також хотів би побачити щось подібне. В основному я хотів би забезпечити тих, хто навчається git, більш безпечною версією, ймовірно, просто загортаючи командний рядок і лише розкриваючи основи: виконувати, тягнути, натискати, прості речі. Змусити їх повною мірою використовувати цю сторінку на цій сторінці: git-scm.com/book/en/Git-Tools-Rewriting-History Git вже трохи складніше вивчити, ніж інші інструменти для локального та віддаленого репо-думки. - страшно переживати, що ви можете перезавантажити замість відкату.
Кріс Москіні

Відповіді:


5

Це виглядає дуже близьким, якщо не тим самим питанням, як Стратегія запобігання або ловлення перепису історії Git

Підсумувати це можна

git config --system receive.denyNonFastforwards true

і

git config --system receive.denyDeletes true

Або напишіть допис, який отримує повідомлення, щоб відхилити все, що ви визначаєте, - переписати.


1
Я вважаю, що denyNonFastforwardsце за замовчуванням (?), А denyDeletesні. Ці два є корисними, але я уявляю рішення на стороні клієнта, яке не дозволило б мені зробити це, commit --amendякщо я не зможу його натиснути (бо його вже натиснули HEAD).
Кос

Іншими словами: Окрім механізмів, які дозволяють тримати віддалений послідовно, я хотів би щось, що дозволяє тримати клон "узгодженим" і з дистанційним.
Кос

@Kos Також можна створити місцеві гачки
Andrew T Finnell

Чи є спосіб , щоб встановити denyNonFastfowardsдля trueтільки на майстер - галузі? Я хотів би, щоб мої тематичні гілки були дозволені для скорочення та натискання.
nnyby

2

Ні, тому що це частина філософії git, щоб дати вам повну потужність і дозволити вам керувати цією владою так, як вам хочеться.

Якщо ви не дотримуєтесь цієї філософії, то, можливо, перехід на Mercurial буде вартим, оскільки вони дозволяють переписувати історію, але обмеженим або, якщо бути зрозумілим, неохоче, таким чином, ви відчуваєте, що це не гарна ідея.


2
Я роблю помилки. Механізм, який вимагає від мене явного підтвердження кожного разу, коли я роблю щось небезпечне, - це те, що, здається, вписується в "управління моєю владою так, як я хочу". :-) (Також Git вже це робить з певних випадків.)
Кос

2

AFAIK, як git вирішує ці питання, полягає в тому, що коли ви запитаєте таку дію, вона буде виконувати її локально, але повідомляє, що те, що ви робите, може мати небажані наслідки. На той момент ви ще нічого не натиснули, тож ви можете переглянути свій локальний сховище та, можливо, скасувати небезпечну зміну перед тим, як натиснути. Ви все-таки повинні звертати увагу на те, що говорить вам git, і вам краще бути обережним, коли ви виправляєте подібні помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.