Buat komit saat ini komit tunggal (awal) di repositori git?

Saat ini, saya memiliki repositori Git lokal, yang saya klik pada repositori Github.

Repositori lokal memiliki ~ 10 commit, dan repositori Github adalah duplikat tersinkronisasi dari ini.

Apa yang ingin saya lakukan adalah menghapus SEMUA riwayat versi dari repositori Git lokal, sehingga konten repositori saat ini akan ditampilkan sebagai satu-satunya komit (dan oleh karena itu, file versi lama dalam repositori tidak disimpan),

Saya ingin mengklik perubahan ini di Github.

Saya menjelajahi Git rebase, tetapi ini sepertinya lebih cocok untuk menghapus versi tertentu. Solusi potensial lainnya adalah menghapus repo lokal dan membuat yang baru, meskipun ini mungkin akan membuat banyak pekerjaan!

ETA: Ada direktori / file tertentu yang tidak dipantau - jika mungkin, saya ingin mendukung menonaktifkan file-file ini.

460
13 марта '12 в 14:41 2012-03-13 14:41 kaese diatur 13 Maret , '12 pada 14:41 2012-03-13 14:41
@ 14 jawaban

Berikut ini adalah pendekatan brute force. Itu juga menghapus konfigurasi repositori.

Catatan Ini TIDAK berfungsi jika ada submodula di repositori! Jika Anda menggunakan submodul, Anda harus menggunakan, misalnya, reboot interaktif.

>Pastikan Anda memiliki cadangan, tidak mungkin untuk kembali )

 rm -rf .git 

>

 git init git add . git commit -m "Initial commit" 

>

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Jawaban diberikan oleh Fred Foo pada 13 Maret '12 pada 14:44 2012-03-13 14:44

Satu-satunya solusi yang bekerja untuk saya (dan sub-modul berfungsi) adalah

 git checkout --orphan newBranch git add -A # Add all files and commit them git commit git branch -D master # Deletes the master branch git branch -m master # Rename the current branch to master git push -f origin master # Force push master branch to github git gc --aggressive --prune=all # remove the old files 

Menghapus .git/ selalu menyebabkan masalah besar ketika saya memiliki sub-modul. Menggunakan git rebase --root menyebabkan konflik bagi saya (dan saya punya banyak sejarah).

410
27 окт. balasan diberikan kepada Zeelot 27 Oktober. 2012-10-27 21:16 '12 pada 21:16 2012-10-27 21:16

Ini adalah pendekatan yang menguntungkan saya:

 git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree}) 

Ini akan membuat cabang baru dengan komit tunggal, yang akan menambahkan semuanya ke HEAD. Itu tidak mengubah apa pun, jadi itu benar-benar aman.

63
22 марта '13 в 16:53 2013-03-22 16:53 jawabannya diberikan dan_waterworth 22 Maret 13 di 16:53 2013-03-22 16:53

Opsi lain yang bisa menjadi banyak pekerjaan jika Anda memiliki banyak komit adalah rebase interaktif (jika versi git Anda> 1.7.12): git rebase --root -i

Saat menyajikan daftar commit di editor Anda:

  • Ubah "pilih" menjadi "reword" untuk komit pertama
  • Ubah "pilih" menjadi "perbaikan" setiap komit lainnya

Simpan dan tutup. git akan reboot.

Pada akhirnya Anda akan memiliki pengikut root baru, yang merupakan kombinasi dari semua yang datang setelah itu.

Keuntungannya adalah Anda tidak perlu menghapus repositori Anda, dan jika Anda memiliki pemikiran lain, Anda selalu memiliki cadangan.

Jika Anda benar-benar ingin menghancurkan riwayat Anda, atur u>

26
14 марта '12 в 23:24 2012-03-14 23:24 jawabannya diberikan oleh Carl pada 14 Maret '12 pada 23:24 2012-03-14 23:24

Menghapus folder .git dapat menyebabkan masalah dalam repositori git. Jika Anda ingin menghapus seluruh riwayat fiksasi Anda.

ikuti >

>

 git checkout --orphan latest_branch 

>

 git add -A 

>

 git commit -am "commit message" 

>

 git branch -D master 

>

 git branch -m master 

>

 git push -f origin master 

!! Sekarang nikmati sejarah fiksasi!

21
14 окт. jawabannya diberikan oleh Shivam Srivastava pada 14 Oktober. 2017-10-14 12:08 '17 pada 12:08 2017-10-14 12:08

Varian dari metode larsman yang diusulkan:

Simpan daftar file non-cetak:

 git ls-files --others --exclude-standard > /tmp/my_untracked_files 

Simpan konfigurasi git:

 mv .git/config /tmp/ 

Kemudian ikuti >

 rm -rf .git git init git add . 

Kembalikan konfigurasi:

 mv /tmp/config .git/ 

Buang file yang belum diuji:

 cat /tmp/my_untracked_files | xargs -0 git rm --cached 

Kemudian perbaiki:

 git commit -m "Initial commit" 

Terakhir, klik repositori Anda:

 git push -u --force origin master 
14
19 апр. balasan yang diberikan oleh lalebarde pada 19 April 2014-04-19 11:58 '14 pada 11:58 2014-04-19 11:58

Buat cabang, salin semua konten ke dalamnya, salin, dan kemudian hapus cabang utama:

 git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all 
5
12 марта '17 в 17:53 2017-03-12 17:53 jawabannya diberikan pratik_bhavsar 12 Maret, '17 pukul 17:53 2017-03-12 17:53

Anda dapat menggunakan klon dangkal (git> 1.9):

 git clone --depth depth remote-url 

Bacaan lebih lanjut: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. jawabannya diberikan oleh Matthias M 04 April. 2016-04-04 14:05 '16 pada 14:05 2016-04-04 14:05

Metode di bawah ini dapat direproduksi, sehingga tidak perlu memulai klon lagi, jika kedua belah pihak konsisten, cukup jalankan skrip di sisi lain.

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

Jika Anda ingin membersihkannya, coba skripnya:

http://sam.nipl.net/b/git-gc-all-ferocious

Saya menulis sebuah skrip yang "membunuh sejarah" untuk setiap cabang di repositori:

http://sam.nipl.net/b/git-kill-history

Lihat juga: http://sam.nipl.net/b/confirm

2
06 февр. Jawaban diberikan oleh Sam Watkins pada 06 Februari. 2013-02-06 19:46 '13 pada 19:46 2013-02-06 19:46
 git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current 

Ini akan menghapus semua cabang dan tag lokal, membuat satu peristiwa tanpa riwayat dengan status cek Anda saat ini di cabang mana pun dari yang sekarang dan membiarkan semua yang lain dalam repo Anda tetap utuh. Kemudian Anda dapat dengan kuat mengklik remote Anda sesuka Anda.

1
05 апр. jawabannya diberikan jthill 05 Apr 2014-04-05 04:42 '14 pada 4:42 2014-04-05 04:42

Apa yang ingin saya lakukan adalah menghapus SEMUA riwayat versi dari repositori Git lokal, sehingga konten repositori saat ini akan ditampilkan sebagai satu-satunya komit (dan oleh karena itu, file versi lama dalam repositori tidak disimpan),

Lebih banyak jawaban konseptual:

git secara otomatis mengumpulkan sampah komit lama jika tag / cabang / tautan tidak menunjuk mereka. Dengan demikian, Anda hanya perlu menghapus semua tag / cabang dan membuat komit yatim baru yang terkait dengan cabang - dengan perjanjian Anda akan mengizinkan cabang master untuk mengindikasikan komit ini.

Komit lama yang tidak dapat diakses tidak akan pernah lagi dilihat oleh siapa pun kecuali mereka mempelajari perintah Git tingkat rendah. Jika ini cukup untuk Anda, saya akan berhenti di sana dan membiarkan GC otomatis melakukannya kapan pun diinginkan. Jika Anda ingin segera menghapusnya, Anda dapat menggunakan git gc (mungkin dengan --aggressive --prune=all ). Untuk repositori Git jarak jauh, Anda tidak akan dapat melakukan ini kecuali Anda memiliki akses ke sistem file.

0
04 апр. balasan diberikan oleh AnoE 04 Apr 2016-04-04 14:27 '16 pada 2:27 PM 2016-04-04 14:27

Untuk melakukan ini, gunakan perintah Dangkal Klon git klon --depth 1 URL - itu hanya akan mengkloning repositori HEAD saat ini

-1
23 авг. Jawabannya diberikan oleh kkarki 23 Agustus. 2017-08-23 18:55 '17 jam 6:55 sore 2017-08-23 18:55

Untuk menghapus komit terakhir dari git, Anda bisa menjalankannya

 git reset --hard HEAD^ 

Jika Anda menghapus beberapa komit dari atas, Anda dapat menjalankan

 git reset --hard HEAD~2 

untuk menghapus dua komitmen terakhir. Anda dapat menambah jumlahnya untuk menghapus lebih banyak komit.

Informasi lebih lanjut di sini.

Git tutoturial di sini menyediakan bantuan untuk membersihkan repositori:

Anda ingin menghapus file dari histori dan menambahkannya ke .gitignore untuk memastikan bahwa itu tidak teru>

 git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all 

Sekarang kami telah menghapus file dari riwayat, biarkan kami menjamin bahwa kami tidak melakukannya secara tidak sengaja.

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

Jika Anda puas dengan keadaan repositori, Anda harus memaksa perubahan untuk menimpa repositori jarak jauh.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 jawabannya diberikan octoback 05 Juni '13 pada 8:41 2013-06-05 08:41

Saya memecahkan masalah yang sama dengan hanya menghapus folder .git dari proyek saya dan mengintegrasikan kembali dengan kontrol versi melalui IntelliJ. Catatan Folder .git disembunyikan. Anda dapat melihatnya di terminal dengan ls -a , dan kemudian menghapusnya dengan rm -rf .git .

-1
11 апр. Balas diberikan oleh JB Lovell pada 11 April 2017-04-11 21:54 '17 jam 9:54 malam 2017-04-11 21:54

Pertanyaan lain tentang tag atau Ajukan Pertanyaan