Klon git tanpa direktori .git

144

Apakah ada bendera untuk dilewati gitketika melakukan kloning, katakanlah jangan mengkloning .gitdirektori? Jika tidak, bagaimana dengan bendera untuk menghapus .gitdirektori setelah klon?

Justin
sumber
41
Pertanyaan ini bukan duplikat dari Bagaimana melakukan "ekspor git" (seperti "ekspor svn") . Pertanyaan ini menanyakan tentang cara mengkloning (remote) repositori tanpa itu .gitdirektori. Penipuan yang ditanyakan bertanya bagaimana mengekspor repositori yang sudah ada di mana Anda sudah memiliki .gitdirektori.
mknaf
3
Setuju. Anda tidak dapat melakukan git archiverepositori jarak jauh seperti yang dikatakan oleh solusi "kemungkinan duplikat".
Vladislav Rastrusny

Jawaban:

214

Menggunakan

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • Opsi kedalaman akan memastikan untuk menyalin sedikit sejarah yang mungkin untuk mendapatkan repo itu.
  • Pilihan cabang adalah opsional dan jika tidak ditentukan akan mendapatkan master.
  • Baris kedua akan membuat direktori Anda dirformynewrepobukan repositori Git lagi.
  • Jika Anda melakukan klon submodul rekursif, parameter kedalaman dan cabang tidak berlaku untuk submodul.
Adam Dymitruk
sumber
19
apa !$/.gitartinya
Jürgen Paul
15
Bagi mereka yang tertarik, ini adalah salah satu perancang kata , bagian dari fitur ekspansi sejarah di Bash dan zsh.
Rufflewind
Apakah ada cara untuk mendapatkan kedalaman = 1 dari semua cabang di repo? bukan hanya menguasai atau cabang tertentu
Gayan Pathirage
2
Anda melakukannya dengan opsi --no-single-branch, karena --depth menyiratkan --single-branch, Anda dapat membatalkannya dengan --no-single-branch. (Diambil dari halaman manual git clone)
Robert Stoddard
8
Menggunakan !$, sementara secara teknis benar dalam hal ini, tidak melakukan apa pun untuk membantu orang yang tidak mengenali sintaks memahami jawaban atas pertanyaan yang sebenarnya. Itu juga bergantung pada perintah kedua langsung mengikuti yang pertama, dan dalam shell yang sama. Jika ada yang menghilangkan persyaratan implisit itu, mereka mungkin akhirnya menghapus sesuatu yang lain sama sekali. Karena itu saya menyarankan jawaban Anda dapat ditingkatkan dengan secara eksplisit menetapkan nama dirformynewreposebagai argumen untuk rmperintah karena akan membuat hubungan antara kedua perintah menjadi lebih jelas.
davidA
29

karena Anda hanya menginginkan file, Anda tidak perlu memperlakukannya sebagai git repo.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

dan ini hanya bekerja dengan jalur lokal dan jalur ssh / rsync jarak jauh, mungkin tidak berfungsi jika server jarak jauh hanya menyediakan akses git: // atau https: //.

Huang Tao
sumber
yang tidak akan mempertimbangkan .gitignore?
JJ Roman
itub benar, ini hanya menyalin pohon kerja. Git checkout dulu melakukannya dengan benar, sekarang tidak lagi.
Sylvain
jadi, apa yang Anda lakukan jika server hanya menyediakan git: // akses?
Rainb
4

Atau, jika Anda memiliki Node.js diinstal, Anda dapat menggunakan perintah berikut:

npx degit GIT_REPO

npxhadir dengan Node, dan memungkinkan Anda untuk menjalankan paket berbasis simpul biner tanpa menginstalnya terlebih dahulu (atau Anda dapat menginstalnya terlebih dahulu degitsecara global npm i -g degit).

Degit adalah alat yang dibuat oleh Rich Harris, pencipta Svelte dan Rollup, yang ia gunakan untuk dengan cepat membuat proyek baru dengan mengkloning repositori tanpa menyimpan folder git. Tetapi juga dapat digunakan untuk mengkloning repo sekali ...

Erik Vullings
sumber
-1

Anda selalu bisa melakukannya

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

sumber
44
unduh semuanya dan hapus dir itu nanti? misalnya emacs memiliki 95% dari 1GB di .git. jadi --depth = 1 adalah solusi di sini dengan jelas.
RParadox
1
saya masih melihat folder .git ketika saya melakukan depth = 1
Aryeh Armon
@AryehArmon tentu saja Anda melihatnya. Menggunakan --depth tidak mencegah pembuatan .git, itu hanya membuatnya menjadi salinan yang dangkal, ukuran yang jauh lebih kecil untuk .git. Tetapi jika Anda tidak menginginkannya sama sekali, Anda harus menghapusnya sesudahnya.
zeycus