2011-07-15 13 views
10

Jak rozważyć przeniesienie z SVN do git w pracy, współpracownik wzbudził obawy, że złośliwy lub wypadek podatne deweloper może wykorzystać git rebase usunąć zdalną historię z naszej wspólnej repo.Czy git rebase może całkowicie usunąć zdalną historię?

Edit: Jak wskazano w odpowiedzi, całe gałęzie mogą być również usunięte ze zdalnego repo z git push origin :branch-name.

Czy to realistyczny problem? Jeśli tak, jakie podejście możemy zastosować, aby temu zapobiec?

+0

@sehe To nie rozwiązuje problemu błędu ludzkiego i sprawia, że ​​adopcja git jest problemem organizacyjnym, a także technicznym. –

+0

Czy masz rację? Przepływ pracy w ramach procedury VCS to wyzwanie organizacyjne. Poza tym, wydaje mi się to zabawne, jak to określasz, po tym, gdy akceptujesz odpowiedź, która mówi to samo ** i ** proponuje użycie Gerrita do moderowania dostępu push ... 8 sierpnia – sehe

+0

Punktem, który robię, jest to, że " musisz zaufać każdemu deweloperowi lub mieć odźwiernych i nikt nigdy nie popełni błędu "nie jest tak naprawdę zadowalającą odpowiedzią na moje pytanie (współpracownika). Przyjąłem odpowiedź, która mówiła z grubsza, że ​​zakładając, że jest to jedyne rozwiązanie, ale kilka tygodni później zaproponowano inne podejście. Spróbuję zastosować metodę config-parameters i jeśli się powiedzie, będzie to moja preferowana odpowiedź. –

Odpowiedz

6

staram się zgodzić z kolegą, że nie jest problemem, ponieważ:

  • bez względu na to, jak dobrze ufać swoim committers, zawsze istnieje możliwość błędu ludzkiego
  • bardziej uciążliwych procesów przeglądu (np Gerrit) nie zawsze są odpowiednie
  • przywrócenie z kopii zapasowych może być powolna i PITA

Czy rozważał receive.denyNonFastForwards i receive.denyDeletes parametry konfiguracyjne? AFAICT są dostępne w Git 1.6 i później.

z Pro Git:

Jeśli rebase zobowiązuje się, że już popychany następnie spróbuj ponownie wcisnąć , lub w inny sposób próbować wcisnąć commit do odległego oddziału, który nie zawiera commit że pilot oddział obecnie wskazuje, zostaniesz odrzucony.Jest to ogólnie dobra polityka; ale w przypadku bazy o wartości możesz określić, że wiesz, co robisz i możesz zmusić aktualizację oddziału zdalnego flagą -f do polecenia push.

Aby wyłączyć możliwość siłowego aktualizacji zdalnych oddziałów do odniesień non-fast-forward, ustaw receive.denyNonFastForwards

Drugi sposób można to zrobić za pośrednictwem stronie serwera otrzymują haczyki, które Wkrótce się obejmie. Takie podejście umożliwia wykonywanie bardziej złożonych czynności, takich jak odmawianie nie szybkiego przekierowania do określonego podzbioru użytkowników.

jako autor wspomina, zasada ta może również zostać wykonane za pomocą haka odbioru (co jest described later in Pro Git).

Te techniki powinny chronić przed przypadkową (lub złośliwą) utratą historii we wspólnym udostępnianym repozytorium.

+0

To byłoby dobre rozwiązanie dla nas - ale denerwuję się, że akceptuję to jako kompletne. Biorąc pod uwagę, ile różnych sposobów można użyć git, wciąż mogą istnieć dziury, które umożliwiają usunięcie kodu. –

+1

OK, zaimplementowaliśmy denyNonFastForwards i działa dobrze :) –

3

Historia może być pomieszana przy użyciu rebase, ale zwykle zdalne repo nie akceptuje zmiany, która modyfikuje historię (chyba że używasz git push - force), ale nawet więcej, deweloper z uprawnieniami push może usunąć oddział całkowicie (git push origin: nazwa-gałęzi). Tak więc proste zasady to:

  • Nie pozwól, aby zezwolenie push dla programistów, którym nie ufasz.

  • Gdy repo jest wspólne, nie zadzieraj z historią, unikać rebase na przeszłość zobowiązuje. Zamiast tego użyj scalania lub wyboru typu "wiśnia", jeśli chcesz dodać coś z innej gałęzi, w takim przypadku nie wpłynie to na historię.

  • Możesz zachować politykę nie używania "push-f" na wspólnym repo, w takim przypadku programista będzie wiedział, że jeśli push zostanie odrzucony, to coś pójdzie nie tak (najprawdopodobniej lokalny oddział nie jest aktualny ze zdalnym) i powinien rozwiązać problem lokalnie, zamiast forsować push.

chodzi o Twoje pytanie, jak zapobiec - wykorzystać Gerrit systemu rewizji, to jest jak krok pośredni na drodze zatwierdzenia pomiędzy lokalnym repozytorium i głównego repo deweloperskim z ładnym interfejsem WWW rewizji, można nadać uprawnienia do przesyłaj do repozytorium rewizji każdemu, ale zmiana zostanie scalona z Twoim oddziałem głównym po weryfikacji i zatwierdzeniu (które wymagają pewnych uprawnień, które zwykle przyznajesz programistom). Możesz zobaczyć, jak to wygląda w projekcie Mahara: https://reviews.mahara.org W tym konkretnym przypadku, tylko gerrit bot może pchać do opanowania (co jest here) i nikt inny.

1

Istnieją rozszerzenia na serwery Git dla przedsiębiorstw, takie jak Gerrit, które wykrywają przepisywanie historii i usuwanie gałęzi, będą tworzyć kopie zapasowe pod specjalnym numerem odniesienia, aby można je było przywrócić w razie potrzeby i nie będą one przycinane przez odśmiecanie. Administratorzy Gerrit mogą nadal usuwać wybrane zatwierdzenia, jeśli wymagają tego względy prawne.