Apakah Git memiliki "mode aman" untuk mencegah penulisan ulang riwayat?

11

Ketika Anda agak baru dengan Git (dan DVCS pada umumnya), dan Anda mulai mengeksplorasi perubahan penulisan ulang sejarah, Anda aman jika repositori hanya bersifat lokal, tetapi Anda mungkin mengalami masalah jika Anda bekerja dengan remote dan mencoba untuk mendorong perubahan tersebut.

Fitur yang saya harapkan adalah kemampuan untuk mengaktifkan "safe mode" yang pada dasarnya akan menghentikan saya dari melakukan apa pun yang seharusnya tidak saya lakukan ... Dan apa yang saya maksud dengan itu? Maksudku perubahan penulisan ulang sejarah untuk hal-hal yang sudah didorong ke asal. Saya tidak dapat mendefinisikannya dengan tepat, tetapi ini akan mencakup kasus-kasus seperti:

  • commit --amend ketika KEPALA sudah didorong
  • rebase dari cabang non-lokal
  • reset dari cabang yang telah didorong

Ini adalah contoh situasi yang mungkin akan membuat pushkegagalan berikutnya (karena itu tidak akan maju cepat, IIRC). Saya telah membuat beberapa dari itu secara tidak sengaja dan harus membuat kembali cabang pada remote. Dan saya masih beruntung melakukan ini dengan cukup cepat sehingga tidak ada yang menarik sejarah yang saya tulis ulang.

Saya percaya itu mungkin untuk mengidentifikasi jenis perubahan ini dan, sesuai permintaan, mencegah pengguna membuat mereka. Apakah mungkin ada opsi untuk itu?

Jika tidak ada, menurut Anda apakah ada gunanya mencoba membuatnya? Apakah Anda akan mencoba mendefinisikan dengan tepat bagaimana cara mengidentifikasi "perubahan berbahaya" seperti itu?

Kos
sumber
Dalam lingkungan kerja di mana melakukan perubahan buruk mempengaruhi programmer lain, Anda mungkin harus lebih enggan melakukan tindakan ini kecuali Anda yakin itu sesuatu yang harus bekerja. Meski begitu, Anda harus memverifikasi bahwa tidak ada masalah yang terjadi setelahnya. Bayangkan bahwa beberapa tahun yang lalu, saya berada dalam tim yang terdiri dari banyak programmer di mana orang tidak akan memiliki keraguan melakukan sumber yang tidak dikompilasi ! Saya ingin menembaknya mati setelah 3 bulan itu.
Neil
Tampaknya masuk akal Anda bisa mendeteksi ini di hook pada mesin jarak jauh dan kemudian menolak perubahan.
Andrew T Finnell
Saya tidak mendapatkan pertanyaan Anda. Mode standar aman. Itu tidak akan memungkinkan Anda untuk mendorong, kecuali jika Anda menentukan --force.
Šimon Tóth
Saya ingin melihat sesuatu seperti ini juga. Pada dasarnya saya ingin memberi mereka belajar git versi yang lebih aman, mungkin dengan hanya membungkus baris perintah dan hanya mengekspos dasar-dasarnya: komit, tarik, dorong, hal-hal sederhana. Paksa mereka keluar ke git penuh untuk apa pun di halaman ini: git-scm.com/book/en/Git-Tools-Rewriting-History Git sudah sedikit lebih sulit untuk dipelajari daripada alat lain untuk memiliki repo lokal dan jarak jauh untuk dipikirkan - khawatir Anda mungkin rebase bukan kemunduran menakutkan.
Chris Moschini

Jawaban:

5

Ini terlihat sangat dekat, jika bukan pertanyaan yang sama dengan Strategi untuk Mencegah atau Menangkap Menulis Ulang Sejarah Git

Singkatnya, Anda dapat mengaktifkan

git config --system receive.denyNonFastforwards true

dan

git config --system receive.denyDeletes true

Atau tulis kiriman terima kail untuk menolak apa pun yang Anda tentukan adalah penulisan ulang.

Andrew T Finnell
sumber
1
Saya percaya denyNonFastforwardsadalah default (?), Sedangkan denyDeletestidak. Keduanya bermanfaat, tetapi saya membayangkan solusi sisi klien yang akan menghentikan saya yaitu melakukan commit --amendjika saya tidak dapat mendorongnya (karena HEAD sudah didorong).
Kos
Dengan kata lain: Selain mekanisme yang memungkinkan untuk menjaga jarak tetap konsisten, saya ingin sesuatu yang memungkinkan untuk menjaga kloning "konsisten" dengan jarak jauh juga.
Kos
@Kos Anda juga dapat membuat kait lokal
Andrew T Finnell
Apakah ada cara untuk mengatur denyNonFastfowardsuntuk truehanya pada cabang master? Saya ingin cabang topik saya diizinkan untuk diubah dan dipaksa.
nnyby
2

Tidak karena itu adalah bagian dari filosofi git untuk memberi Anda kekuatan penuh dan membiarkan Anda mengelola kekuatan itu seperti yang Anda inginkan.

Jika Anda tidak mematuhi filosofi ini, maka mungkin beralih ke Mercurial akan bernilai karena mereka memungkinkan penulisan ulang sejarah tetapi dalam cara yang terbatas, atau jelas, enggan, yang membuat Anda merasa itu bukan ide yang baik.

Klaim
sumber
2
Saya membuat kesalahan. Sebuah mekanisme yang mengharuskan saya untuk mengkonfirmasi secara eksplisit setiap kali saya melakukan sesuatu yang berbahaya adalah sesuatu yang tampaknya cocok dengan "mengelola kekuatan saya seperti yang saya inginkan". :-) (Juga Git sudah melakukan itu pada beberapa kesempatan.)
Kos
2

AFAIK, cara git menyelesaikan masalah ini adalah bahwa setiap kali Anda meminta tindakan seperti itu, ia akan melakukannya secara lokal, tetapi memberi tahu Anda bahwa apa yang Anda lakukan mungkin memiliki konsekuensi yang tidak diinginkan. Pada saat itu, Anda belum mendorong apa pun, sehingga Anda berada dalam posisi untuk meninjau repositori lokal Anda, dan mungkin membatalkan perubahan berbahaya sebelum Anda mendorong. Anda harus memperhatikan apa yang dikatakan git, dan Anda sebaiknya berhati-hati saat memperbaiki kesalahan tersebut.

tammmer
sumber