Salin git repo tanpa riwayat

200

Saat ini saya memiliki repositori pribadi di github yang ingin saya publikasikan. Namun beberapa komitmen awal berisi informasi yang saya tidak ingin publikasikan (hardcoded crentials, dll).

Apa rute termudah untuk membuat komit terbaru menjadi publik (saya tidak benar-benar membutuhkan atau menginginkan komit sebelumnya dalam repositori publik) tanpa menyertakan sebagian atau semua riwayat komit?

Rafe
sumber
Mengapa Anda tidak membuat repositori baru?
Stephan
2
@Stephan Saya baik-baik saja membuat repositori baru, tetapi bagaimana cara saya mengambil status terbaru dari repositori lama dan mengkomitnya ke yang baru?
Rafe
19
Anda cukup menghapus folder .git dan melakukan git init lagi pada folder sumber Anda
Stephan
2
Menghapus folder .git akan membuat dua repositori Anda tidak kompatibel, Anda tidak dapat bergabung dari satu ke yang lain
Arnold Roa
Tidak bisakah kamu rebase? Anda benar-benar hanya menekan semua komit lama dan kemudian (memaksa) mendorong.
xaxxon

Jawaban:

322

Anda dapat membatasi kedalaman sejarah saat melakukan kloning :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

Gunakan ini jika Anda ingin riwayat terbatas, tetapi masih ada beberapa.

Gauthier
sumber
41
Beri orang ini kue (dalam bentuk menandai jawaban ini dengan benar) :)
FateNuller
7
Ini tidak membahas penggunaan yang dimaksudkan yang tersirat oleh pertanyaan, yang dapat mendorong ke repositori publik yang jauh. Mencoba mendorong hasil klon yang dangkal shallow update not allowed.
Brad Knox
280

Gunakan perintah berikut:

git clone --depth <depth> -b <branch> <repo_url>

Dimana:

  • depthadalah jumlah komitmen yang ingin Anda sertakan. yaitu jika Anda hanya ingin menggunakan komit terbarugit clone --depth 1
  • branchadalah nama cabang jarak jauh yang ingin Anda tiru. yaitu jika Anda ingin 3 commit terakhir dari masterpenggunaan cabanggit clone --depth 3 -b master
  • repo_url adalah url repositori Anda
Agam Rafaeli
sumber
7
Ini sebenarnya jawaban yang sama dari Gautier tetapi lebih lengkap dan dengan contoh.
aled
3
Memang itu. Terkadang contohnya adalah apa yang dibutuhkan. Bagi saya, menuliskannya adalah apa yang mengklarifikasi masalah ini
Agam Rafaeli
3
Memberi +1 pada jawaban utama, tetapi juga untuk yang satu ini untuk menjelaskan tentang memilih cabang yang ingin Anda terapkan kedalamannya - Saya tahu ini adalah bagian dari perintah klon - tetapi semuanya mengikat dengan baik dalam pikiran sederhana saya ... dan saya suka sederhana
:)
7
Bagaimana ini menjawab pertanyaan? Semua ini dilakukan adalah membuat klon dangkal secara lokal, tetapi lalu apa? Bagaimana Anda menyalin salinan lokal ini dengan riwayat terbatas ke repo baru?
BradDaBug
4
@BradDaBug menampilkan poin yang valid. Saya mengikuti instruksi di atas yang membatasi kedalaman ke 1, lalu mengubah asal remote dan kemudian mencoba untuk mendorong ke repo baru saya. Namun, saya menerima pesan kesalahan shallow update not allowed. Saya menemukan jawaban stack overflow ini berguna dalam hal ini.
Craig Myles
18

Menghapus .gitfolder mungkin adalah jalur termudah karena Anda tidak ingin / memerlukan riwayat (seperti kata Stephan).

Jadi Anda dapat membuat repo baru dari komit terbaru Anda: ( Bagaimana cara mengkloning seed / memulai proyek tanpa seluruh sejarah? )

git clone <git_url>

kemudian hapus .git, dan kemudian jalankan

git init

Atau jika Anda ingin menggunakan kembali repo Anda saat ini: Buat komit saat ini menjadi satu-satunya (awal) komit dalam repositori Git?

Ikuti langkah-langkah di atas lalu:

git add .
git commit -m "Initial commit"

Dorong ke repo Anda.

git remote add origin <github-uri>
git push -u --force origin master
JW
sumber
6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:[email protected]/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master
timo kranz
sumber
2
yang --depth 1tidak perlu dalam hal ini karena sejarah juga dihapus denganrm -rf .git
rayphi
3
Saya pikir saya akan melakukannya seperti ini:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <[email protected]>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi
11
@rayphi ya --depth 1itu tidak perlu tetapi juga tidak berbahaya dan menghemat sedikit bandwidth jaringan (tidak ada gunanya mengambil sejarah yang akan Anda hapus)
Silas S. Brown
1
Saya tidak merekomendasikan melakukan ini jika Anda ingin menjaga repositori Anda kompatibel.
Arnold Roa
Menghapus .git juga menghapus semua kait git.
JudaPriest
0

Bukankah ini tepatnya yang dilakukan oleh squashing rebase? Tekan saja semua kecuali komit terakhir dan kemudian (paksakan) dorong.

xaxxon
sumber