Pertanyaan Bagaimana cara mengkloning subdirektori hanya dari repositori Git?


Saya memiliki repositori Git saya yang, pada dasarnya, memiliki dua sub direktori:

/finisht
/static

Ketika ini masuk SVN, /finisht diperiksa di satu tempat, sementara /static sudah diperiksa di tempat lain, seperti:

svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static

Apakah ada cara untuk melakukan ini dengan Git?


999
2018-03-01 16:46


asal


Jawaban:


Jawaban ini sudah usang dan hanya berlaku untuk versi git yang lebih rendah dari 1.7.0 (Februari 2012). Lihat di bawah untuk versi yang lebih baru.

Tidak, itu tidak mungkin di Git.

Menerapkan sesuatu seperti ini di Git akan menjadi upaya substansial dan itu akan berarti bahwa integritas dari repositori clientide tidak lagi dapat dijamin. Jika Anda tertarik, cari diskusi tentang "klon sparse" dan "sparse fetch" di milis git.

Secara umum, konsensus dalam komunitas Git adalah bahwa jika Anda memiliki beberapa direktori yang selalu diperiksa secara independen, maka ini benar-benar dua proyek yang berbeda dan harus tinggal di dua repositori yang berbeda. Anda dapat merekatkannya kembali menggunakan Submodul Git.


421
2018-03-01 18:00



Apa yang Anda coba lakukan disebut a checkout jarang, dan fitur itu ditambahkan di git 1.7.0 (Februari 2012). Langkah-langkah untuk melakukan yang jarang klon adalah sebagai berikut:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

Ini menciptakan repositori kosong dengan remote Anda, dan menjemput semua objek tetapi tidak memeriksanya. Kemudian lakukan:

git config core.sparseCheckout true

Sekarang Anda perlu menentukan file / folder mana yang sebenarnya ingin Anda periksa. Ini dilakukan dengan mencantumkannya di .git/info/sparse-checkout, misalnya:

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

Last but not least, perbarui repo kosong Anda dengan status dari remote:

git pull origin master

Anda sekarang akan memiliki file "checked out" untuk some/dir dan another/sub/tree pada sistem file Anda (dengan lintasan itu masih), dan tidak ada jalur lain yang ada.

Anda mungkin ingin melihat pada tutorial diperpanjang dan Anda mungkin harus membaca resmi dokumentasi untuk kasir yang jarang.

Sebagai fungsi:

function git_sparse_clone() (
  rurl="$1" localdir="$2" && shift 2

  mkdir -p "$localdir"
  cd "$localdir"

  git init
  git remote add -f origin "$rurl"

  git config core.sparseCheckout true

  # Loops over remaining args
  for i; do
    echo "$i" >> .git/info/sparse-checkout
  done

  git pull origin master
)

Pemakaian:

git_sparse_clone "http://github.com/tj/n" "./local/location" "/bin"

Perhatikan bahwa ini masih akan mengunduh seluruh repositori dari server - hanya kasir yang berkurang ukurannya. Saat ini tidak mungkin mengkloning hanya satu direktori. Tetapi jika Anda tidak membutuhkan sejarah repositori, Anda setidaknya dapat menghemat bandwidth dengan membuat tiruan dangkal. Lihat jawaban udondan di bawah ini untuk informasi tentang cara menggabungkan dangkal klon dan kasir yang jarang.


1347
2017-12-06 07:37



Anda bisa menggabungkan checkout jarang dan tiruan dangkal fitur. Itu tiruan dangkal memotong sejarah dan checkout jarang hanya menarik file yang cocok dengan pola Anda.

git init <repo>
cd <repo>
git remote add origin <url>
git config core.sparsecheckout true
echo "finisht/*" >> .git/info/sparse-checkout
git pull --depth=1 origin master

Anda akan membutuhkan minimum git 1.9 agar ini berfungsi. Mengujinya sendiri hanya dengan 2.2.0 dan 2.2.2.

Dengan cara ini Anda akan tetap bisa Dorong, yang tidak mungkin dengan git archive.


325
2018-01-20 07:33



Untuk pengguna lain yang hanya ingin mengunduh file / folder dari github, cukup gunakan:

svn export <repo>/trunk/<folder>

misalnya

svn export https://github.com/lodash/lodash.com/trunk/docs

(Ya, itu svn di sini. Rupanya di 2016 Anda masih perlu svn untuk cukup mengunduh beberapa file github)

Kesopanan: Unduh satu folder atau direktori dari repo GitHub 

Penting - Pastikan Anda memperbarui URL github dan ganti /tree/master/ dengan '/ batang /'.

Sebagai skrip bash:

git-download(){
    folder=${@/tree\/master/trunk}
    folder=${folder/blob\/master/trunk}
    svn export $folder
}

Catatan Metode ini mengunduh folder, tidak mengkloning / checkout. Anda tidak dapat mendorong perubahan kembali ke repositori. Di sisi lain - ini menghasilkan unduhan yang lebih kecil dibandingkan dengan checkout yang jarang atau checkout yang dangkal.


77
2017-09-04 13:02



Git 1.7.0 memiliki "pengecekan sparse". Lihat "Core.sparseCheckout" di git config manpage, "Checkout jarang" di git baca-pohon manpage, dan "Lewati-worktree bit" di git update-index manpage.

Antarmuka tidak semudah SVN (mis. Tidak ada cara untuk melakukan checkout yang jarang pada saat klon awal), tetapi fungsi dasar tempat antarmuka yang lebih sederhana dapat dibuat sekarang tersedia.


63
2018-05-18 21:15



Jika Anda tidak pernah berencana untuk berinteraksi dengan repositori dari mana Anda mengkloning, Anda dapat melakukan full git clone dan menulis ulang menggunakan repositori Anda git filter-branch --subdirectory-filter. Dengan cara ini, setidaknya sejarah akan dipertahankan.


60
2018-03-01 21:17



Ini terlihat jauh lebih sederhana:

git archive --remote=<repo_url> <branch> <path> | tar xvf -

60
2017-09-10 17:03