Membuat submodule repositori dari folder dan menjaga git commit sejarah

Saya memiliki sebuah aplikasi web yang mengeksplorasi aplikasi web lain dengan cara tertentu. Ini berisi beberapa web demo di demo folder dan salah satu demo yang sekarang harus memiliki itu's repositori sendiri. Saya ingin membuat repositori terpisah untuk aplikasi demo ini dan membuatnya menjadi subpackage submodule dari repositori utama tanpa kehilangan komit sejarah.

Adalah mungkin untuk tetap komit sejarah dari file dalam repositori's folder dan membuat repositori dari itu dan menggunakannya sebagai submodule sebaliknya?

Mengomentari pertanyaan (3)
Larutan

Solusi Rinci

Lihat catatan di akhir jawaban ini (paragraf terakhir) untuk alternatif yang cepat untuk git submodul menggunakan npm ;)

Dalam jawaban berikut, anda akan tahu bagaimana untuk mengekstrak folder dari repositori dan membuat repositori git dari itu dan kemudian termasuk sebagai [submodule][3] bukan folder.

Terinspirasi dari Gerg Bayer's artikel [Memindahkan File dari satu Repositori Git yang Lain, Melestarikan Sejarah][1]

Di awal, kami memiliki sesuatu seperti ini:



    someFolders
    someFiles
    someLib 
Komentar (10)

Solusinya by @GabLeRoux squashes cabang-cabang, dan terkait melakukan.

Cara yang mudah untuk mengkloning dan membuat semua orang tambahan cabang-cabang dan melakukan:

1 - pastikan anda memiliki git alias

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - Clone remote, tarik semua cabang, mengubah jarak jauh, filter direktori anda, mendorong

git clone git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags
Komentar (0)

GabLeRoux's solusi bekerja dengan baik kecuali jika anda menggunakan git lfsdan memiliki besar file di bawah direktori yang ingin anda lepaskan. Dalam kasus itu, setelah langkah 3 semua file besar akan tetap menjadi pointer file yang bukan file nyata. Saya kira itu's mungkin karena.gitattributes` file yang dihapus di filter cabang proses.

Menyadari hal ini, saya menemukan berikut solusi yang bekerja untuk saya:

cp .gitattributes .git/info/attributes

Menyalin .gitattributes yang git lfs menggunakan untuk melacak file-file besar ke .git/ direktori untuk menghindari dihapus.

Ketika filter-cabang dilakukan don't lupa untuk menempatkan kembali .gitattributes jika anda masih ingin menggunakan git lfs untuk repositori baru:

mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'
Komentar (0)