GIT clone repo di seluruh sistem file lokal di windows

200

Saya seorang Noob yang lengkap dalam hal GIT. Saya baru saja mengambil langkah pertama saya selama beberapa hari terakhir. Saya menyiapkan repo di laptop saya, menarik Trunk dari proyek SVN (memiliki beberapa masalah dengan cabang, tidak membuat mereka berfungsi), tetapi semua tampaknya ok di sana.

Saya sekarang ingin dapat menarik atau mendorong dari laptop ke desktop utama saya. Alasannya karena laptop ini praktis di kereta karena saya menghabiskan 2 jam sehari bepergian dan bisa menyelesaikan pekerjaan dengan baik. Tapi mesin utama saya di rumah bagus untuk pengembangan. Jadi saya ingin dapat mendorong / menarik dari laptop ke komputer utama ketika saya pulang. Saya pikir cara paling sederhana untuk melakukan ini adalah dengan hanya memiliki folder kode bersama di LAN dan lakukan:

git clone file://192.168.10.51/code

sayangnya ini sepertinya tidak berhasil untuk saya:

jadi saya buka git bash cmd dan ketik perintah di atas, saya di C: \ code (folder bersama untuk kedua mesin) ini adalah apa yang saya dapatkan kembali:

Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Bagaimana saya bisa berbagi repositori antara dua mesin dengan cara yang paling sederhana.

Akan ada lokasi lain yang akan menjadi titik penyimpanan resmi dan tempat-tempat di mana devs lainnya dan server CI dll akan menarik dari, ini hanya agar saya dapat bekerja pada repo yang sama di dua mesin.

Sesuai saran Sebastian saya mendapatkan yang berikut:

C:\code>git clone --no-hardlinks file://192.168.10.51/code
Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

** EDIT - JAWABAN **

Terima kasih untuk semua yang telah membantu. Saya mencoba pemetaan drive dan itu berhasil jadi saya pikir saya akan kembali dan mencoba lagi tanpa pemetaan. Hasil akhirnya adalah:

git clone file://\\\\192.168.0.51\code

Ini bekerja dengan baik.

Terima kasih

Jon
sumber
file: //192.168.10.51/code tidak berarti URI yang valid menunjuk ke file, sedangkan file: // C: \ foo \ bar.txt adalah
Gregory Pakosz
Lalu bagaimana saya bisa menunjuk ke mesin jarak jauh dengan referensi seperti itu?
Jon
Anda mungkin ingin memetakan drive jaringan.
Josh Lee
bekerja untuk saya - perhatikan ini khusus untuk windows dan tidak akan bekerja dari git bash di windows - perlu menggunakan cmd atau PowerShell
Dave Rael
juga mencobanya dalam cmd tetapi tidak berhasil. Dan juga apa "kode" dalam "file klon git: // \\\" 192.168.0.51 \ code "artinya? Saya menggantinya dengan "C: / UniserverZ / www / sampleProject /" dan tidak berhasil. Dikatakan bahwa itu bukan repositori git
boi_echos

Jawaban:

177

Anda dapat menentukan URL jarak jauh dengan menerapkan jalur UNC ke protokol file. Ini mengharuskan Anda untuk menggunakan empat garis miring:

git clone file:////<host>/<share>/<path>

Sebagai contoh, jika mesin utama Anda memiliki IP 192.168.10.51 dan nama komputer main, dan memiliki share bernama codeyang itu sendiri adalah repositori git, maka kedua perintah berikut harus bekerja sama:

git clone file:////main/code
git clone file:////192.168.10.51/code

Jika repositori Git berada dalam subdirektori, cukup tambahkan path:

git clone file:////main/code/project-repository
git clone file:////192.168.10.51/code/project-repository
menyodok
sumber
2
apakah ada cara untuk mengotentikasi (yaitu nama pengguna / kata sandi) dengan skema itu?
intuited
1
@ Maggis Saya hampir hanya menggunakan Windows, jadi solusi saya berfungsi untuk Windows.
aduk
1
ya ini adalah cara terbaik untuk melakukannya di windows.
Nicholas DiPiazza
3
Kita juga dapat menggunakan protokol: //// pengguna: kata sandi @ host: notasi port / path , misalnya: file: /// pengguna: [email protected]/code
pistache
1
@OderWat Kecuali menggunakan localhost tidak akan membantu Anda sama sekali ketika mencoba mengakses komputer yang berbeda, yang menjadi pertanyaannya. Jika Anda ingin mengakses repositori lokal , yaitu yang ada secara lokal di sistem file Anda, Anda bisa menggunakan jalur lokal tanpa menggunakan protokol file ...
menyodok
125
$ git clone --no-hardlinks /path/to/repo

Perintah di atas menggunakan notasi jalur POSIX untuk direktori dengan repositori git Anda. Untuk Windows itu adalah (direktori C:/path/to/repoberisi .gitdirektori):

C:\some\dir\> git clone --local file:///C:/path/to/repo my_project

Repositori akan dikloning ke C:\some\dir\my_project. Jika Anda menghilangkan file:///bagian maka --localopsi tersirat.

jfs
sumber
7
Ini bekerja untuk saya untuk path file dengan spasi: git clone -l file: // "C: \ BEBERAPA PATH \ DENGAN RUANG" my_project
Sebastian Patten
1
Sangat membantu. Ini berfungsi untuk saya di mesin windows 7 saya. <From git bash command prompt> sesuatu seperti: file git clone: ​​/// C: / Users / username / repsitoryName
Forhad
Anda mungkin ingin mengatur remote setelah itu .. jika tidak menunjuk ke lokal lain Anda sebagai asal yang saya temukan sangat rawan kesalahan. gunakan git remote -v; git remote rm asal; git add origin <repo-address> (yang dapat Anda salin setelah melakukan git remote -v pada repo lokal asli)
Hanan
Ini benar, Anda tidak perlu menggunakan bentuk url seperti file: ////, Anda bisa saja mengkloning direktori.
Peter N. Steinmetz
14

jawaban dengan nama host tidak bekerja untuk saya tetapi ini berhasil:

file git clone: ​​////home/git/repositories/MyProject.git/

Talaat Safwat
sumber
1
Sepertinya Anda memiliki terlalu banyak garis miring setelah "file:". Bagi saya, angka ajaib adalah 3 tebasan
Mark F Guerra
Aneh. Empat tebasan memberi saya kesalahan fatal. Itu hanya bekerja (untuk saya) dengan tiga.
Big McLargeHuge
4
Trik saya untuk mengetahui sintaks yang berfungsi adalah membuat file txt di folder dan seret untuk membuka di browser. Url yang tepat untuk suatu file muncul.
AnneTheAgile
7

Saya berhasil melakukan ini menggunakan file: //, tetapi dengan satu garis miring tambahan untuk menunjukkan jalur absolut.

git clone file:///cygdrive/c/path/to/repository/

Dalam kasus saya, saya menggunakan Git di Cygwin untuk Windows, yang dapat Anda lihat karena bagian / cygdrive / c di jalur saya. Dengan beberapa penyesuaian pada path, ia seharusnya bekerja dengan semua instalasi git.

Menambahkan remote berfungsi dengan cara yang sama

git remote add remotename file:///cygdrive/c/path/to/repository/
Mark F Guerra
sumber
6

Mungkin memetakan berbagi sebagai drive jaringan dan kemudian lakukan

git clone Z:\

Sebagian besar hanya dugaan; Saya selalu melakukan hal ini menggunakan ssh. Mengikuti saran itu tentu saja berarti Anda harus memetakan drive itu setiap kali Anda menekan / menarik ke / dari laptop. Saya tidak yakin bagaimana Anda mengatur ssh untuk bekerja di bawah windows tetapi jika Anda akan sering melakukan ini, mungkin perlu diselidiki.

intuisi
sumber
@Carlos: Saya pikir itu hanya akan berfungsi jika Anda belum cdke direktori lain di Z:drive. IIRC; Saya belum menjadi pengguna Windows dalam beberapa waktu. Mungkin juga bahwa gitpenafsiran huruf drive berbeda dari konvensi Windows standar. Apakah Anda mencoba `Z:`?
intuited
errr ... yang seharusnya berbunyi "Apakah Anda mencoba` Z: \ `?". Yah, kecuali dengan melarikan diri yang benar sehingga kode-mode akan diaktifkan .. #nurrrr .. Kurasa tidak.
intuited
3

Tidak yakin apakah itu karena versi git saya (1.7.2) atau apa, tetapi pendekatan yang tercantum di atas menggunakan nama mesin dan opsi IP tidak berfungsi untuk saya. Detail tambahan yang mungkin / mungkin tidak penting adalah bahwa repo itu repo kosong yang telah saya inisialisasi dan didorong dari mesin yang berbeda.

Saya mencoba untuk mengkloning project1 seperti yang disarankan di atas dengan perintah seperti:

$ git clone file:////<IP_ADDRESS>/home/user/git/project1
Cloning into project1...
fatal: '//<IP_ADDRESS>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

dan

$ git clone file:////<MACHINE_NAME>/home/user/git/project1
Cloning into project1...
fatal: '//<MACHINE_NAME>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Apa yang melakukan pekerjaan bagi saya adalah sesuatu yang sederhana:

$ git clone ../git/project1
Cloning into project1...
done.

Catatan - meskipun repo yang sedang dikloning itu telanjang, ini memang menghasilkan klon 'normal' dengan semua file kode / gambar / sumber daya aktual yang saya harapkan (sebagai lawan internal dari git repo).

barbar
sumber
1

Entah memasukkan jalur absolut atau jalur relatif.

Misalnya yang pertama di bawah ini menggunakan jalur absolut:

(ini dari dalam folder yang berisi repositori dan cadangan sebagai subfolder. juga ingat bahwa folder cadangan tidak dimodifikasi jika sudah mengandung apa pun. dan jika tidak ada, folder baru akan dibuat)

~/git$ git clone --no-hardlinks ~/git/git_test1/   ~/git/bkp_repos/

Berikut ini menggunakan jalur relatif:

~/git$ git clone --no-hardlinks git_test1/   bkp_repos2/
sidquanto
sumber
0

Sementara jalur UNC didukung sejak Git 2.21 (Februari 2019, lihat di bawah), Git 2.24 (Q4 2019) akan memungkinkan

git clone file://192.168.10.51/code

Tidak lagi file:////xxx, ' file://' sudah cukup untuk merujuk ke berbagi jalur UNC.
Lihat " Git Fetch Error with UNC ".


Catatan, sejak 2016 dan MingW-64 yang git.exe dikemas dengan Git untuk Windows , jalur UNC didukung.
(Lihat " Bagaimana kaitan msys, msys2, dan MinGW-64? ")

Dan dengan Git 2.21 (Februari 2019), dukungan ini bahkan meluas dalam shell msys2 (dengan kutipan di sekitar jalur UNC).

Lihat komit 9e9da23 , komit 5440df4 (17 Jan 2019) oleh Johannes Schindelin ( dscho) .
Dibantu-oleh: Kim Gybels ( Jeff-G) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit f5dd919 , 05 Feb 2019)

Sebelum Git 2.21, karena kekhasan dalam metode Git untuk menelurkan git-upload-pack, ada masalah ketika melewati jalur dengan garis miring terbalik di dalamnya: Git akan memaksa baris perintah melalui shell, yang memiliki semantik kutipan berbeda dalam Git untuk Windows (menjadi MSYS2 program) daripada executable Win32 biasa seperti git.exeitu sendiri.

Gejala adalah bahwa yang pertama dari dua backslashes di UNC path dari bentuk \\myserver\folder\repository.gityang menanggalkan .

Ini sedang dimitigasi:

mingw: argumen kasus khusus untuk sh

Runtime MSYS2 melakukan yang terbaik untuk meniru ekspansi wildcard command-line dan de-quoting yang akan dilakukan oleh shell Unix pada sistem Unix.

Aturan mengutip shell Unix berbeda dari aturan kutipan yang berlaku untuk cmd dan Powershell Windows, membuatnya sedikit canggung untuk mengutip parameter baris perintah dengan benar saat memunculkan proses lain.

Secara khusus, git.exemeneruskan argumen ke subproses yang tidak dimaksudkan untuk ditafsirkan sebagai wildcard, dan jika mengandung backslash, itu tidak dapat diartikan sebagai karakter pelarian, misalnya ketika melewati jalur Windows.

Catatan: ini hanya masalah saat memanggil executable MSYS2, bukan saat memanggil executable MINGW seperti git.exe. Namun, kami sering memanggil MSYS2 executable, terutama ketika mengaturuse_shell bendera di struktur child_process.

Tidak ada cara yang elegan untuk menentukan apakah .exefile yang akan dieksekusi adalah program MSYS2 atau MINGW.
Tetapi karena kasus penggunaan melewati baris perintah melalui shell sangat lazim, kita perlu mengatasi masalah ini setidaknya saat mengeksekusi sh.exe.

Mari kita perkenalkan tes kode jelek yang jelek apakah argv[0]itu "sh ", dan apakah itu merujuk ke MSYS2 Bash, untuk menentukan apakah kita perlu mengutip argumen secara berbeda dari biasanya.

Itu masih belum memperbaiki masalah sepenuhnya, tetapi setidaknya itu adalah sesuatu.

Kebetulan, ini juga memperbaiki masalah di mana git clone \\server\repogagal karena penanganan backslash yang salah saat menyerahkan jalur kegit-upload-pack proses.

Lebih jauh, kita perlu berhati-hati untuk mengutip tidak hanya spasi putih dan garis miring terbalik, tetapi juga kurung keriting.
Karena alias sering melalui MSYS2 Bash, dan karena alias sering mendapatkan parameter seperti HEAD@{yesterday}ini, ini sangat penting.

Lihat t/t5580-clone-push-unc.sh

VONC
sumber
0

Setelah klon, bagi saya push tidak berfungsi.

Solusi: Di ​​mana repo dikloning, buka folder .git dan file konfigurasi.

Untuk nilai set url asal jarak jauh:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
idanek
sumber