Pertanyaan Lakukan "ekspor git" (seperti "ekspor svn")?


Saya bertanya-tanya apakah ada solusi "ekspor git" yang baik yang menciptakan salinan pohon tanpa .git direktori repositori. Setidaknya ada tiga metode yang saya ketahui:

  1. git clone diikuti dengan menghapus .git direktori repositori.
  2. git checkout-index menyinggung fungsi ini tetapi dimulai dengan "Hanya membaca pohon yang diinginkan ke dalam indeks ..." yang saya tidak sepenuhnya yakin bagaimana melakukannya.
  3. git-export adalah skrip pihak ketiga yang pada dasarnya melakukan git clone ke lokasi sementara diikuti oleh rsync --exclude='.git' ke tujuan akhir.

Tak satu pun dari solusi ini benar-benar membuat saya merasa memuaskan. Yang paling dekat dengan svn export mungkin opsi 1, karena keduanya membutuhkan direktori target untuk dikosongkan terlebih dahulu. Tetapi opsi 2 tampak lebih baik, dengan asumsi saya bisa mencari tahu apa artinya membaca sebuah pohon ke dalam indeks.


2165
2017-10-02 02:21


asal


Jawaban:


Mungkin cara paling sederhana untuk mencapai ini adalah dengan git archive. Jika Anda benar-benar hanya membutuhkan pohon yang diperluas, Anda dapat melakukan sesuatu seperti ini.

git archive master | tar -x -C /somewhere/else

Sebagian besar waktu yang saya butuhkan untuk 'mengekspor' sesuatu dari git, saya ingin arsip yang dikompresi dalam hal apapun jadi saya melakukan sesuatu seperti ini.

git archive master | bzip2 >source-tree.tar.bz2

Arsip ZIP:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive untuk lebih jelasnya, ini cukup fleksibel.


Ketahuilah bahwa meskipun arsip tidak akan berisi direktori .git, namun, akan berisi file-file khusus git lain yang tersembunyi seperti .gitignore, .gitattributes, dll. Jika Anda tidak menginginkannya dalam arsip, pastikan Anda gunakan atribut ekspor-abaikan dalam file .gitattributes dan lakukan ini sebelum melakukan arsip Anda. Baca lebih banyak...


Catatan: Jika Anda tertarik untuk mengekspor indeks, perintahnya adalah

git checkout-index -a -f --prefix=/destination/path/

(Lihat Jawaban Greg untuk lebih jelasnya)


2195
2017-10-02 18:13



Saya menemukan apa artinya opsi 2. Dari repositori, Anda dapat melakukan:

git checkout-index -a -f --prefix=/destination/path/

Garis miring di ujung jalan adalah penting, jika tidak maka akan menghasilkan file yang berada di / tujuan dengan awalan 'jalur'.

Karena dalam situasi normal, indeks berisi isi repositori, tidak ada yang khusus dilakukan untuk "membaca pohon yang diinginkan ke dalam indeks". Sudah ada di sana.

Itu -a diperlukan untuk memeriksa semua file dalam indeks (saya tidak yakin apa artinya menghilangkan tanda ini dalam situasi ini, karena tidak melakukan apa yang saya inginkan). Itu -f Pasukan bendera menimpa file yang ada di dalam output, yang biasanya tidak dilakukan oleh perintah ini.

Ini sepertinya semacam "ekspor git" yang saya cari.


301
2017-10-02 03:03



git archive juga berfungsi dengan repositori jarak jauh.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Untuk mengekspor jalur tertentu di dalam repo tambahkan sebanyak mungkin jalur yang Anda inginkan sebagai argumen terakhir ke git, misalnya:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

241
2017-12-09 18:59



enter image description here

Jawaban kasus khusus jika repositori di-host di GitHub.

Cukup gunakan svn export.

Sejauh yang saya tahu Github tidak memungkinkan archive --remote. Meskipun GitHub adalah svn kompatibel dan mereka memiliki semua git repo svn dapat diakses sehingga Anda bisa menggunakannya svn export seperti biasanya dengan beberapa penyesuaian pada url GitHub Anda.

Misalnya untuk mengekspor seluruh repositori, perhatikan caranya trunkdi URL menggantikan master (atau apapun itu cabang HEAD proyek diatur ke):

svn export https://github.com/username/repo-name/trunk/

Dan Anda dapat mengekspor file tunggal atau bahkan jalur atau folder tertentu:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Contoh dengan Perpustakaan JavaScript jQuery

Itu HEAD cabang atau menguasai cabang akan tersedia menggunakan trunk:

svn ls https://github.com/jquery/jquery/trunk

The non-HEAD  ranting akan dapat diakses di bawah /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Semua tag dibawah /tags/ dengan cara yang sama:

svn ls https://github.com/jquery/jquery/tags/2.1.3

48
2017-10-30 17:03



Dari Git Manual:

Menggunakan git-checkout-index untuk "mengekspor seluruh pohon"

Kemampuan awalan pada dasarnya menjadikannya sepele untuk menggunakan git-checkout-index sebagai fungsi "ekspor sebagai pohon". Baca saja pohon yang diinginkan ke dalam indeks, dan lakukan:

$ git checkout-index --prefix=git-export-dir/ -a


38
2017-10-02 02:27



Saya telah menulis pembungkus sederhana di sekitar git-checkout-index yang dapat Anda gunakan seperti ini:

git export ~/the/destination/dir

Jika direktori tujuan sudah ada, Anda harus menambahkan -f atau --force.

Instalasi sederhana; cukup jatuhkan script di suatu tempat di Anda PATH, dan pastikan itu bisa dieksekusi.

Repositori github untuk git-export 


37
2017-10-16 17:17



Tampaknya ini kurang masalah dengan Git daripada SVN. Git hanya menempatkan folder .git di akar repositori, sedangkan SVN menempatkan folder .svn di setiap subdirektori. Jadi "ekspor svn" menghindari sihir baris perintah rekursif, sedangkan dengan rekursi Git tidak diperlukan.


35
2018-05-12 04:20



Setara dengan

svn export . otherpath

di dalam repo yang ada

git archive branchname | (cd otherpath; tar x)

Setara dengan

svn export url otherpath

aku s

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41