Cara mendapatkan Git untuk mengkloning ke direktori saat ini


500

Aku melakukan:

git clone ssh://user@host.com/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?


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 git@github.com: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.


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.


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

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://user@host.com/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.


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



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


13

Jika direktori saat ini kosong, maka ini akan berfungsi:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

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 git@github.com.user/my-project.git .

pastikan direktori Anda saat ini kosong dengan menggunakan

ls -a

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://user@host.com/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.


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'.


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.


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


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

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 .


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.


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.


-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 / *


-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!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

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


-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.


5
git pulltidak akan melakukan apa pun jika Anda tidak memiliki repositori yang ditentukan, yang merupakan bagian penting dari apa yang git clonedilakukan.
retas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.