The Easy Way ™
Ternyata ini adalah praktik yang umum dan bermanfaat sehingga tuan Git membuatnya sangat mudah, tetapi Anda harus memiliki versi Git yang lebih baru (> = 1.7.11 Mei 2012). Lihat lampiran untuk cara menginstal Git terbaru. Juga, ada contoh dunia nyata dalam penelusuran di bawah ini.
Siapkan repo lama
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Catatan: <name-of-folder>
harus TIDAK mengandung karakter yang memimpin atau mengikuti. Misalnya, folder bernama subproject
HARUS dilewatkan sebagai subproject
, BUKAN./subproject/
Catatan untuk pengguna Windows: Ketika kedalaman folder Anda> 1, <name-of-folder>
harus memiliki pemisah folder gaya * nix (/). Misalnya, folder bernama path1\path2\subproject
HARUS dilewatkan sebagaipath1/path2/subproject
Buat repo baru
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Tautkan repo baru ke GitHub atau di mana pun
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
Bersihkan di dalam <big-repo>
, jika diinginkan
git rm -rf <name-of-folder>
Catatan : Ini meninggalkan semua referensi historis dalam repositori. Lihat Lampiran di bawah ini jika Anda benar-benar khawatir tentang melakukan kata sandi atau Anda perlu mengurangi ukuran file .git
folder Anda .
...
Panduan
Ini adalah langkah yang sama seperti di atas , tetapi mengikuti langkah-langkah tepat saya untuk repositori saya alih-alih menggunakan <meta-named-things>
.
Ini adalah proyek yang saya miliki untuk mengimplementasikan modul browser JavaScript di node:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Saya ingin membagi satu folder btoa
,, ke dalam repositori Git yang terpisah
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
Saya sekarang memiliki cabang baru btoa-only
,, yang hanya memiliki komit btoa
dan saya ingin membuat repositori baru.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
Selanjutnya saya membuat repo baru di GitHub atau Bitbucket, atau apa pun dan menambahkannya sebagai origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
Hari bahagia!
Catatan: Jika Anda membuat repo dengan README.md
, .gitignore
dan LICENSE
, Anda harus menarik lebih dulu:
git pull origin master
git push origin master
Terakhir, saya ingin menghapus folder dari repo yang lebih besar
git rm -rf btoa
...
Lampiran
Git terbaru di macOS
Untuk mendapatkan versi terbaru dari Git menggunakan Homebrew :
brew install git
Git terbaru di Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
Jika itu tidak berhasil (Anda memiliki versi Ubuntu yang sangat lama), coba
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Jika itu masih tidak berhasil, coba
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
Terima kasih kepada rui.araujo dari komentarnya.
Menghapus riwayat Anda
Secara default menghapus file dari Git tidak benar-benar menghapusnya, itu hanya menyatakan bahwa mereka tidak ada lagi. Jika Anda ingin benar-benar menghapus referensi historis (yaitu Anda memiliki kata sandi yang dikomit), Anda perlu melakukan ini:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
Setelah itu Anda dapat memeriksa apakah file atau folder Anda tidak lagi muncul di riwayat Git sama sekali
git log -- <name-of-folder> # should show nothing
Namun, Anda tidak dapat "mendorong" menghapus ke GitHub dan sejenisnya. Jika Anda mencoba, Anda akan mendapatkan kesalahan dan Anda harus melakukannya git pull
sebelum Anda bisa git push
- dan kemudian Anda kembali memiliki segalanya dalam riwayat Anda.
Jadi, jika Anda ingin menghapus riwayat dari "asal" - artinya menghapusnya dari GitHub, Bitbucket, dll - Anda harus menghapus repo dan mendorong kembali salinan repo yang sudah dipangkas. Tapi tunggu - masih ada lagi ! - Jika Anda benar-benar khawatir tentang menghilangkan kata sandi atau sesuatu seperti itu, Anda harus memangkas cadangan (lihat di bawah).
Membuat .git
lebih kecil
Perintah hapus riwayat yang disebutkan di atas masih menyisakan banyak file cadangan - karena Git terlalu baik dalam membantu Anda untuk tidak merusak repo Anda secara tidak sengaja. Pada akhirnya akan menghapus file yatim selama berhari-hari dan berbulan-bulan, tetapi meninggalkannya di sana untuk sementara waktu jika Anda menyadari bahwa Anda secara tidak sengaja menghapus sesuatu yang tidak Anda inginkan.
Jadi jika Anda benar-benar ingin mengosongkan sampah untuk mengurangi ukuran klon repo segera Anda harus melakukan semua hal yang sangat aneh ini:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
Yang mengatakan, saya sarankan tidak melakukan langkah-langkah ini kecuali Anda tahu bahwa Anda perlu - kalau-kalau Anda memangkas subdirektori yang salah, Anda tahu? File cadangan tidak boleh dikloning ketika Anda mendorong repo, mereka hanya akan ada di salinan lokal Anda.
Kredit
git filter-branch
melihat jawaban saya di bawah ini.