Salah satu cara untuk melakukannya adalah kebalikannya - hapus semuanya kecuali file yang ingin Anda simpan.
Pada dasarnya, buat salinan repositori, lalu gunakan git filter-branch
untuk menghapus semuanya kecuali file / folder yang ingin Anda simpan.
Misalnya, saya memiliki proyek tempat saya ingin mengekstrak file tvnamer.py
ke repositori baru:
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
Itu menggunakan git filter-branch --tree-filter
untuk melewati setiap komit, menjalankan perintah dan komit ulang konten direktori yang dihasilkan. Ini sangat merusak (jadi Anda seharusnya hanya melakukan ini pada salinan repositori Anda!), Dan dapat memakan waktu cukup lama (sekitar 1 menit pada repositori dengan 300 komit dan sekitar 20 file)
Perintah di atas hanya menjalankan skrip-shell berikut pada setiap revisi, yang tentunya harus Anda modifikasi (untuk membuatnya mengecualikan sub-direktori Anda, bukan tvnamer.py
):
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
Masalah terbesar yang jelas adalah meninggalkan semua pesan komit, bahkan jika pesan itu tidak terkait dengan file yang tersisa. Skrip git-remove-empty-commits , perbaiki ini ..
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
Anda perlu menggunakan -f
argumen kekuatan, jalankan filter-branch
lagi dengan apa pun di refs/original/
(yang pada dasarnya adalah cadangan)
Tentu saja ini tidak akan pernah sempurna, misalnya jika pesan komit Anda menyebutkan file lain, tetapi ini sedekat yang diizinkan oleh git saat ini (sejauh yang saya ketahui).
Sekali lagi, jalankan ini hanya pada salinan repositori Anda! - tetapi secara ringkas, untuk menghapus semua file kecuali "thisismyfilename.txt":
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'