Cara mendapatkan Git untuk mengkloning ke direktori saat ini

500

Aku melakukan:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git ./

Saya mendapatkan:

Fatal: jalur tujuan '.' sudah ada dan bukan direktori kosong.

Saya tahu jalan. sudah ada. Dan saya dapat memastikan direktori itu kosong. (Aku melakukannya di dalam dan aku tidak melihat apa-apa!)

Apa yang saya lewatkan di sini untuk mengkloning proyek itu ke direktori saat ini?

MEM
sumber
16
Jika Anda melakukannya, ls -aapakah Anda melihat .gitdirektori?
Davin Tryon
2
@dtryon - Tidak. Tapi saya melihat DS_Store apa pun ini. Mungkin aku harus menyingkirkannya. Terima kasih untuk itu -a: s
MEM
@Terima kasih empat balasan cepat Anda. James Maclaughlin yang tampaknya perintah yang indah untuk memastikan kami mengkloning ke direktori kosong. :)
MEM
1
Saya berasumsi Anda menggunakan Mac . Apakah ini membantu: stackoverflow.com/questions/107701/…
Davin Tryon
Untuk apa nilainya, folder apa pun yang Anda telusuri di mac akan membuat file-file kecil ini dibuat di sana. Ini sangat menjengkelkan bagi pengguna Windows yang menggunakan saham yang sama, dan untuk sistem apa pun (misalnya git) yang membutuhkan folder untuk dikosongkan atau melakukan tindakan secara terprogram pada setiap file dalam folder.
jsims281

Jawaban:

510

cukup beri titik di sebelahnya

git clone [email protected]:user/my-project.git .

Dari git help clone:

Kloning ke direktori yang ada hanya diperbolehkan jika direktori kosong.

Jadi pastikan direktori tersebut kosong (periksa dengan ls -a), jika tidak maka perintah akan gagal.

Roshan Pal
sumber
18
setuju, perhatikan bahwa pada mac, file .DS_Store yang dibuat secara otomatis oleh finder akan memblokir klon. periksa denganls -la
ptim
281
Nggak. Ini bukan jawaban yang tepat. Ini masih akan mengembalikan "fatal: path tujuan '.' sudah ada dan bukan direktori kosong. "
Sid Sarasvati
16
Bekerja untuk saya menggunakan git v1.8.3.2. @SidSarasvati Anda yakin direktori saat ini kosong ?
Wesley Baugh
3
@SSSarasvati baik bagi saya, sutradara tidak kosong, tapi saya tidak peduli tentang itu jadi saya tidak yakin mengapa Git melakukannya. Mengapa git tidak dapat diklon ke direktori yang tidak kosong? Tentunya fungsional itu hanya unduhan dasar.
Nathan Hornby
3
mkdirmembuat hardlink ke .dan ..secara default, jadi apakah direktori baru secara teknis "kosong" di sistem berbasis Unix? Maksud saya, saya kira Anda bisa unlink .dan unlink ..tetapi itu dapat menyebabkan masalah besar di kemudian hari jika Anda lupa untuk menautkan kembali setelah kloning ....
SeldomNeedy
351

Berikut ini mungkin tidak sepenuhnya setara dengan klon dalam semua kasus tetapi melakukan trik untuk saya:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

Dalam kasus saya, ini menghasilkan .git/configfile yang setara dengan yang saya dapatkan ketika melakukan klon.

Andre Holzner
sumber
40
Selanjutnya, ini adalah mantra yang memungkinkan konten saat ini tetap - katakanlah jika Anda mengkloning dotfile Anda ke direktori home Anda.
rbellamy
7
Dengan ini saya akhirnya diizinkan untuk mengkloning ke folder mana pun yang saya suka tanpa Git memperlakukan saya seperti bayi. Ketika saya juga menambahkan .gitignore sementara yang berisi *(abaikan semuanya) saya bisa melakukan git checkout masterwalaupun sudah ada beberapa file lain di folder. Kemudian semua file yang dikomit dari repositori diklon (dan .gitignore sementara ditimpa oleh .gitignore yang tepat dari repo). Semuanya bekerja dengan sangat baik. Itu harus terjadi dengan cara ini sendiri dengan menggunakan git clone -fatau sesuatu.
PaulMag
1
jika Anda memiliki file yang berbeda / baru / diubah yang akan ditulis ulang (... file akan ditimpa oleh checkout ... Batalkan) gunakan: git checkout master -f
visualex
3
Tidak -t \*perlu karena ini adalah default.
Palec
1
git remote set-head origin -amungkin berguna. Ini menetapkan cabang default asal ( refs/remotes/origin/HEAD) seperti yang diatur dalam repositori jarak jauh. git clonemelakukan ini secara otomatis, tidak seperti git remote add -f.
Palec
212

@Andrew telah menjawabnya dengan jelas di sini . Tetapi sesederhana ini juga berfungsi meskipun direktori tidak kosong:

git init .
git remote add origin <repository-url>
git pull origin master
ambes
sumber
Saya senang mengonfirmasi <repository-url>juga bisa menjadi repo lokalgit remote add origin /path/to/existing/repo
krubo
60

Untuk memastikan bahwa Anda dapat mengkloning repo, buka direktori sementara dan klon proyek di sana:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git

Ini akan mengkloning barang-barang Anda ke project_hubdirektori.

Setelah kloning selesai, Anda dapat memindahkan direktori ini ke mana pun Anda inginkan:

mv project_hub /path/to/new/location

Ini aman dan tidak memerlukan hal-hal ajaib di sekitar.

eek
sumber
9
Ini akan membuat subdirektori dalam direktori yang sudah ada sebelumnya /path/to/new/locationyang tentunya bukan inti dari pertanyaan.
Pavel Šimerda
Maka Anda harus memindahkan file tersembunyi secara manual atau menggunakan perintah yang rumit ... dan itu tidak menjawab pertanyaan.
Hitam
54
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
sumber
ini adalah tweak: D
Sarnath Jegadeesan
15

Hmm ... menentukan jalur absolut saat ini menggunakan $(pwd)bekerja untuk saya.

git clone https://github.com/me/myproject.git $(pwd)

versi git: 2.21.0

Nick Grealy
sumber
13

Jika direktori saat ini kosong, maka ini akan berfungsi:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
GoZoner
sumber
1
dalam kasus saya, ini berfungsi bahkan dengan beberapa file di '.' direktori
OSdave
2
Perhatikan bahwa sembarang dotfile dalam direktori di bawah foo, mis. foo / bar / .foobar tidak akan dipindahkan dengan perintah ini. Lihat jawaban dari @phatblat
lea
10

Selain jawaban @ StephaneDelcroix, sebelum menggunakan:

git clone [email protected]/my-project.git .

pastikan direktori Anda saat ini kosong dengan menggunakan

ls -a
Jakehao
sumber
Menghadapi masalah ini hari ini. Ternyata saya telah menyembunyikan folder .git dan .gitignore di direktori yang saya coba klon repositori. Ketika saya menghapus folder ini semuanya baik-baik saja.
Tamara
Apa yang akan menjadi perintah untuk mengosongkan dir saat ini? Saya pikir itu akan lebih berguna daripada hanya memeriksanya :)
pie6k
9

Solusi: Pada kasus ini, solusinya menggunakan dot, jadi:rm -rf .* && git clone ssh://[email protected]/home/user/private/repos/project_hub.git .

rm -rf .* && dapat dihilangkan jika kami benar-benar yakin direktori tersebut kosong.

Kredit masuk ke: @James McLaughlin pada komentar di bawah.

MEM
sumber
10
Ini terlihat jahat, karena. * Termasuk direktori induk! saya: ~ / tmp / tmp / tmp $ ls -d .* . .. saya: ~ / tmp / tmp / tmp $
stackunderflow
Ini tidak membantu, karena saya memiliki dependensi di direktori di mana saya harus keluar.
B01
18
Saya tidak yakin itu bijak untuk menulis rm -rf (dalam bentuk apa pun) menjadi jawaban SO tanpa tanda peringatan yang BENAR-BENAR MENAKUTKAN. Beberapa pengguna yang tidak berpengalaman mungkin datang ke sini mencari "tanda centang hijau" (biasanya jawaban terbaik) kemudian salin-tempel perintah ini dan poof ... hilanglah kerja kerasnya di direktori saat ini. BTW: rm -rf ./.*"lebih aman" jika Anda hanya menghapus file dan direktori tersembunyi (titik) di bawah direktori saat ini (seperti yang dikatakan @stackunderflow di depan saya). Tetapi rm -rfini adalah perintah yang berbahaya bagi pengguna yang tidak berpengalaman jadi berhati-hatilah! Hanya 2 sen saya.
Andrew
berfungsi pada 1.7.1 Satu-satunya folder di dalam adalah .gitsetelah git init(saya tahu)
vladkras
Anda tidak perlu -rfmenghapus file normal. Harap pertimbangkan untuk menghapus jawaban ini atau setidaknya menerima jawaban yang berbeda.
Navin
6

Meningkatkan pada jawaban @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

Perintah shopt diambil dari jawaban SO ini dan mengubah perilaku perintah 'mv' pada Bash untuk memasukkan dotfile, yang Anda harus sertakan direktori .git dan file tersembunyi lainnya.

Perhatikan juga bahwa ini hanya dijamin berfungsi apa adanya adalah jika direktori saat ini (.) Kosong, tetapi akan berfungsi selama tidak ada file dalam repo yang dikloning yang memiliki nama yang sama dengan file di direktori saat ini. Jika Anda tidak peduli apa yang ada di direktori saat ini, Anda dapat menambahkan opsi -f (force) ke perintah 'mv'.

phatblat
sumber
6

Saya memiliki kebutuhan yang sama. Dalam kasus saya, saya memiliki folder web standar yang dibuat oleh instalasi server web. Untuk keperluan ilustrasi ini katakanlah ini

/server/webroot

dan webroot berisi file dan folder standar lainnya. Repo saya hanya memiliki file spesifik situs (html, javascript, CFML, dll.)

Yang harus saya lakukan adalah:

cd /server/webroot

git init

git pull [url to my repo.git]

Anda perlu berhati-hati untuk melakukan git init di folder target karena jika Anda TIDAK satu dari dua hal akan terjadi:

  1. Tarik git hanya akan gagal dengan pesan tentang tidak ada file git, dalam kasus saya:

fatal: Bukan repositori git (atau direktori induk mana pun): .git

  1. Jika ada adalah file di suatu tempat git di jalur induk ke folder Anda repo Anda ditarik akan dibuat di BAHWA orangtua yang berisi file git. Ini terjadi pada saya dan saya terkejut karenanya ;-)

Ini TIDAK mengganggu salah satu dari file "standar" yang saya miliki di folder webroot saya, tetapi saya memang perlu menambahkannya ke file .gitignore untuk mencegah penambahan yang tidak disengaja dari mereka untuk komit berikutnya.

Sepertinya ini cara mudah untuk "mengkloning" ke direktori yang tidak kosong. Jika Anda tidak ingin file .git dan .gitignore dibuat oleh tarikan, hapus saja setelah tarikan.

igeocacher
sumber
5

Lebih lanjut memperbaiki jawaban @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

sebagai satu liner:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master

166_MMX
sumber
2
shopt -s dotglob
git clone ssh://[email protected]/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
John Josef
sumber
3
Berikan lebih banyak informasi untuk menjelaskan mengapa kode Anda memperbaiki masalah dan apa fungsinya.
Martin
"git clone ... tmp" - membuat / tmp folder di direktori tempat perintah dijalankan dan mengkloning repositori Git. Lalu "mv tmp / *." - Memindahkan semua file dari folder / tmp di folder induk (di mana perintah sebelumnya telah dijalankan) dan akhirnya "rm -rf tmp" - menghapus / folder tmp.
Marinski
1

gunakan. (titik) di akhir perintah Anda seperti di bawah ini

URL klon git .

Upendra
sumber
Ini tidak berfungsi pada mac, itu menyebabkan kesalahan: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz
Untuk mac :: Anda harus di bawah direktori induk dan kemudian menggunakan nama folder alih-alih. (Titik) seperti di bawah ini git clone URL flodername Pastikan bahwa folder Anda kosong.
Upendra
0

Inilah yang saya temukan:

Saya melihat ini:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Di antara pencarian saya, saya menemukan:

https://couchpota.to/forum/viewtopic.php?t=3943

Cari entri oleh Clinton. Bagaimana ... Jika Anda mencoba ini (seperti yang saya lakukan), Anda mungkin akan mendapatkan access deniedjawabannya, ada petunjuk pertama saya, jadi kesalahan awal (untuk saya), sebenarnya dihindari oleh root yang salah isu.

Solusi untuk ini di windows: pastikan Anda menjalankan cmdatau git elevated, kemudian jalankan:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

Di atas adalah masalah saya dan hanya mengangkat bekerja untuk saya.

ynotjs
sumber
0

Solusi untuk Windowsadalah dengan mengkloning repositori ke folder lain dan kemudian salin dan tempel ke lokasi asli atau cukup salin .gitfolder yang tidak terlihat.

croppio.com
sumber
-1

Menghapus dengan

rm -rf. *

dapat membuat Anda mendapat masalah atau beberapa kesalahan lagi.

Jika Anda memiliki / path / ke / folder, dan ingin menghapus semua yang ada di dalamnya, tetapi bukan folder itu, jalankan saja:

rm -rf / path / ke / folder / *

Sid
sumber
-1

Jadi saya memperbaiki kesalahan yang sama dengan menghapus folder .git tersembunyi di direktori root saya, dan kemudian menambahkan periode ke 'git clone repo.' di folder root / dist saya. Ini dalam konteks proyek webpack vue-cli. Jadi apa yang orang lain katakan adalah benar, biasanya itu berarti Anda memiliki pelacakan git baik di folder yang Anda coba klon ke dalam atau di folder induk atau root folder yang dimaksud!

Akin Hwan
sumber
-1
git clone ssh://[email protected]/home/user/private/repos/project_hub.git $(pwd)
Catalin
sumber
Perhatikan bahwa ini masih akan menghasilkan kesalahan yang sama yang diposting dalam pertanyaan (" fatal: path tujuan 'diselesaikan / path / dari / pwd' sudah ada dan bukan direktori kosong. ") Jika Anda melakukan ini dalam non-kosong direktori.
Gino Mempin
-2

ini berguna untuk membuat file baru dengan mkdir filename, kemudian menjalankan perintah git clone xxxxx, itu berfungsi di komputer saya

gila-qi
sumber
-3

Saya telah melihat pertanyaan ini berkali-kali - dan saya hanya ingin menunjukkan bahwa git pulldari dalam direktori Anda akan melakukan trik.

Kecuali saya kehilangan sesuatu di sini - itu berhasil untuk saya.

itamar
sumber
5
git pulltidak akan melakukan apa pun jika Anda tidak memiliki repositori yang ditentukan, yang merupakan bagian penting dari apa yang git clonedilakukan.
retas