Windows'da yerel dosya sisteminde GIT klon reposu


200

GIT söz konusu olduğunda tam bir Noob'um. Sadece son birkaç gündür ilk adımımı atıyorum. Dizüstü bilgisayarımda bir repo oluşturdum, bir SVN projesinden Bagajı indirdim (şubelerle ilgili bazı sorunlar vardı, onları çalıştırmadım), ancak hepsi orada görünüyor.

Şimdi dizüstü bilgisayarımdan ana masaüstüme çekebilmek veya itmek istiyorum. Günde 2 saat seyahat ve bazı iyi iş yapılabilir alabilirsiniz dizüstü olmanın trende kullanışlı. Ama evdeki ana makinem geliştirme için harika. Bu yüzden eve geldiğimde dizüstü bilgisayardan ana bilgisayara itmek / çekmek istiyorum. Bunu yapmanın en basit yolu sadece LAN klasöründe paylaşılan ve yapmak kod klasörü olurdu düşündüm:

git clone file://192.168.10.51/code

ne yazık ki bu benim için çalışmıyor gibi görünüyor:

bu yüzden bir git bash cmd açın ve yukarıdaki komutu yazın, ben C: \ kodu (her iki makine için paylaşılan klasör) duyuyorum geri almak ne:

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

İki makine arasındaki havuzu en basit şekilde nasıl paylaşabilirim.

Resmi depolama noktaları ve diğer geliştiricilerin ve CI sunucusunun vb. Çekeceği yerler olacak, bu sadece iki makinede aynı repo üzerinde çalışabilmem için.

Sebastian'ın önerisine göre aşağıdakileri alıyorum:

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

** DÜZENLEME - CEVAP **

Yardımcı olan her şey için teşekkürler. Bir sürücüyü haritalamayı denedim ve bu yüzden geri dönüp haritalamadan tekrar deneyeceğimi düşündüm. Nihai sonuç:

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

Bu harika çalıştı.

Teşekkürler


dosya: //192.168.10.51/code hiçbir şekilde bir dosyaya işaret eden geçerli bir URI değil, dosya: // C: \ foo \ bar.txt ise
Gregory Pakosz

Öyleyse böyle bir referansla uzaktaki bir makineye nasıl işaret edebilirim?
Jon

Muhtemelen bir ağ sürücüsünü eşlemek istersiniz.
Josh Lee

benim için çalıştı - bu windows için özel ve windows git bash çalışmaz - cmd veya powershell kullanmanız gerektiğini unutmayın
Dave Rael

Ayrıca cmd denedim ama iş doenst. Ve ayrıca git klon dosyasındaki "kod" nedir: // \\\\ 192.168.0.51 \ code "ne demektir? Ben yerine "C: / UniserverZ / www / sampleProject /" ve işe yaramadı. Onun git git deposu olmadığını söyledi
boi_echos

Yanıtlar:


178

Uzaktan kumanda URL'sini dosya protokolüne UNC yolunu uygulayarak belirleyebilirsiniz . Bu, dört eğik çizgi kullanmanızı gerektirir:

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

Örneğin, ana makineniz IP 192.168.10.51 ve bilgisayar adına mainsahipse ve codekendisi git deposu olarak adlandırılan bir paylaşıma sahipse , aşağıdaki komutların her ikisi de eşit olarak çalışmalıdır:

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

Git deposu bir alt dizindeyse, yolu eklemeniz yeterlidir:

git clone file:////main/code/project-repository
git clone file:////192.168.10.51/code/project-repository

2
bu şema ile kimlik doğrulamanın (yani kullanıcı adı / şifre) bir yolu var mı?
intuited

1
@majgis Neredeyse sadece Windows'u kullanıyorum, bu yüzden çözümüm Windows için çalışıyor.
dürtmek

1
evet bu pencerelerde yapmanın en iyi yolu.
Nicholas DiPiazza

3
Ayrıca şu protokol de kullanılabilir : //// user: password @ host: port / yol gösterimi, örneğin: file: /// user: password@192.168.10.51/code
pistache

1
@OderWat Farklı bir bilgisayara erişmeye çalışırken localhost kullanmanın size hiç yardımcı olmayacağı dışında , sorunun konusu buydu. Eğer bir erişmek istiyorsanız yerel dosya sistemi içinde yerel olarak mevcut depo, yani sadece ... dosya protokolünü kullanarak olmadan yerel bir yolunu kullanabilir
dürtmek

125
$ git clone --no-hardlinks /path/to/repo

Yukarıdaki komut, git deponuzun bulunduğu dizin için POSIX yol gösterimini kullanır. Windows için (dizin dizin C:/path/to/repoiçerir .git):

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

Depo klonlanacak C:\some\dir\my_project. Eğer atlarsanız file:///kısmını daha sonra --localseçenek ima edilir.


7
Bu benim için boşluklu dosya yolları için çalıştı: git clone -l file: // "C: \ BAZI YOL \ ALANLARLA" my_project
Sebastian Patten

1
Harika yardım. Bu benim windows 7 makinemde çalışıyor. <Git bash komut isteminden> gibi bir şey: git clone file: /// C: / Users / kullanıcı adı / repsitoryName
Forhad

muhtemelen daha sonra uzaktan kumandayı ayarlamak isteyeceksiniz .. aksi takdirde süper hata eğilimli bulduğum kaynak olarak diğer yerel işaret eder. git remote -v kullanın, git remote rm origin; git add origin <repo-address> (orijinal yerel repoda git remote -v yaptıktan sonra kopyalayabilirsiniz)
Hanan

Bu doğrudur, file: //// gibi bir URL formu kullanmanıza gerek yoktur, sadece bir dizini klonlayabilirsiniz.
Peter N. Steinmetz

14

ana bilgisayar adı ile cevap benim için işe yaramadı ama bu işe yaradı:

git klon dosyası: ////home/git/repositories/MyProject.git/


1
Görünüşe göre "file:" ifadesinden sonra çok fazla eğik çizgi var. Benim için sihirli sayı 3 eğikti
Mark F Guerra

Tuhaf. Dört eğik çizgi bana ölümcül bir hata verdi. Sadece benim için üçle çalıştı.
Büyük McLargeHuge

4
Çalışan sözdizimi bulmak için hile klasörde bir txt dosyası yapmak ve tarayıcıda açmak için sürüklemektir. Bir dosya için doğru URL görünür.
AnneTheAgile

7

Bunu file: // kullanarak başarılı oldum, ancak mutlak bir yolu belirtmek için bir ek eğik çizgi ile.

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

Benim durumumda, yollarımdaki / cygdrive / c bölümü nedeniyle görebileceğiniz Windows için Cygwin üzerinde Git kullanıyorum. Yola biraz değişiklik yapıldığında, herhangi bir git kurulumuyla çalışmalıdır.

Uzaktan kumanda eklemek aynı şekilde çalışır

git remote add remotename file:///cygdrive/c/path/to/repository/

6

Belki paylaşımı bir ağ sürücüsü olarak eşleyin ve ardından

git clone Z:\

Çoğunlukla sadece bir tahmin; Bunu her zaman ssh kullanarak yaparım. Elbette bu önerileri takip etmek, dizüstü bilgisayara her bastığınızda / dizüstü bilgisayarınızdan çektiğinizde bu sürücünün haritalandırılması gerektiği anlamına gelecektir. Windows altında çalışmak için ssh'yi nasıl donattığınızdan emin değilim, ancak bunu çok yapacaksanız araştırmaya değer olabilir.


@Carlos: Bence bu sadece sürücüde cdbaşka bir dizine sahip değilseniz çalışır Z:. IIRC; Bir süredir Windows kullanıcısı değilim. Ayrıca gitsürücü harflerini standart Windows kurallarından farklı şekilde yorumlayabilir. `Z: 'denediniz mi?
intuited

errr ... "Z: \` denediniz mi? " Peki, doğru kaçış hariç kod modu etkinleştirilir .. #nurrrr .. Sanırım değil zaten.
intuited

3

Git sürümümden (1.7.2) veya ne olduğundan emin değilim, ancak yukarıda makine adı ve IP seçeneklerini kullanarak listelenen yaklaşımlar benim için işe yaramadı. Önemli olabilecek / olmayabilecek ek bir ayrıntı, repo'nun başlattığım ve farklı bir makineden ittiğim çıplak bir repo olmasıdır.

Yukarıda gibi komutları ile tavsiye olarak project1 klonlamaya çalışıyordu:

$ 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

ve

$ 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

Ne yaptım benim için çalışmalarını daha basit bir şeydi:

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

Not - kopyalanan repo çıplak olsa da, bu beklediğim tüm gerçek kod / görüntü / kaynak dosyaları ile bir 'normal' klon üretti (git repo içlerine aksine).


1

Mutlak yollar veya göreli yollar girin.

Örneğin, aşağıdaki ilk yol mutlak yolları kullanır:

(bu, depoyu ve yedeklemeyi alt klasörler içeren klasörün içinden. ayrıca zaten bir şey içeriyorsa yedekleme klasörünün değiştirilmediğini ve mevcut değilse yeni bir klasör oluşturulacağını unutmayın)

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

Aşağıdaki göreli yolları kullanır:

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

0

UNC yolu Git 2.21'den (Şubat 2019, aşağıya bakın) beri desteklenirken, Git 2.24 (4. Çeyrek 2019)

git clone file://192.168.10.51/code

Artık file:////xxx' file://' UNC yol paylaşımına atıfta bulunmak için yeterli.
Bkz. " UNC ile Git Getirme Hatası ".


2016'dan beri ve Windows için Git ile paketlenmiş MingW-64'ten beri bir UNC yolu desteklenmektedir. (Bkz. " Msys, msys2 ve MinGW-64 birbiriyle nasıl ilişkilidir? ")git.exe

Ve Git 2.21 (Şubat 2019) ile bu destek, msys2 kabuğunda bile (UNC yolu çevresinde tırnak işaretleri ile ) uzanır .

Bkz. Taahhüt 9e9da23 , taahhüt 5440df4 (17 Ocak 2019) Johannes Schindelin ( dscho) .
Yardım eden: Kim Gybels ( Jeff-G) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde f5dd919 tamamlama 2019 05 Şubat)

Git git-upload-pack2.21'den önce, Git'in yumurtlama yöntemindeki bir tuhaflık nedeniyle, içinde ters eğik çizgiler içeren yolları geçerken bir sorun var: Git, komut satırını Windows için Git'te farklı tırnak semantiğine sahip bir kabuktan zorlar (MSYS2) program gibi) normal Win32 çalıştırılabilir dosyaları git.exe.

Belirti şeklinde UNC yolları iki ters ilk olmasıdır \\myserver\folder\repository.gitedilir sıyrılıp .

Bu şimdi hafifletildi:

mingw: için özel durum bağımsız değişkenleri sh

MSYS2 çalışma zamanı, Unix sistemlerinde çağrılan Unix kabuğu tarafından gerçekleştirilecek olan komut satırı joker karakteri genişletme ve ayrıştırma işlemlerini taklit etmek için elinden geleni yapar.

Bu Unix kabuk alıntılama kuralları, Windows cmd ve Powershell'e uygulanan alıntılama kurallarından farklıdır, bu da diğer süreçleri ortaya çıkarırken komut satırı parametrelerini düzgün bir şekilde alıntılamayı biraz zorlaştırır.

Özellikle, git.exeolan subprocesses argümanlar geçer not joker karakter olarak yorumlanabilir amaçlanmıştır ve bunlar ters eğik çizgi içeriyorsa, Windows yollarını geçerken, bu örneğin kaçış karakterleri olarak yorumlanmamalıdır değildir.

Not: Bu sadece git.exe gibi MINGW yürütülebilir dosyaları çağırırken değil, MSYS2 yürütülebilir dosyaları çağrılırken bir sorundur. Ancak, MSYS2 yürütülebilir dosyalarını sık, özellikle use_shellde child_process yapısında bayrak ayarlarken çağırırız.

.exeYürütülecek dosyanın bir MSYS2 programı mı yoksa MINGW programı mı olduğunu belirlemenin zarif bir yolu yoktur .
Ancak kabuktan bir komut satırı geçirmenin kullanım durumu çok yaygın olduğundan, en azından yürütürken bu soruna geçici bir çözüm bulmamız gerekir sh.exe.

Argümanları normalden farklı bir şekilde alıntılamamız gerekip gerekmediğini belirlemek argv[0]için " sh" olup olmadığı ve MSYS2 Bash ile ilgili olup olmadığı konusunda çirkin, sabit kodlu bir test sunalım.

Bu hala sorunu tam olarak çözmüyor, ama en azından bir şey.

Bu arada, işlemin git clone \\server\repoyolunu verirken ters eğik çizgilerin yanlış işlenmesi nedeniyle başarısız olan sorunu da giderir git-upload-pack.

Ayrıca, sadece boşluk ve ters eğik çizgileri değil, aynı zamanda kıvırcık parantezleri de alıntılamaya özen göstermeliyiz.
Takma adlar sık ​​sık MSYS2 Bash'den geçerken ve takma adlar sık ​​sık gibi parametreler aldıkça HEAD@{yesterday}, bu gerçekten önemlidir.

Görmek t/t5580-clone-push-unc.sh


0

Klondan sonra, benim için itme işe yaramadı.

Çözüm: Reponun klonlandığı yer .git klasörünü ve yapılandırma dosyasını açın.

Uzak kaynaklı URL ayar değeri için:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.