Git'te bir sunucu deposundan tek bir dosya nasıl çekilir?


115

Git çalıştıran bir sunucuya sahip bir site üzerinde çalışıyorum. Dağıtım için Git kullanıyorum (GitHub değil). Bu, bir kanca yöntemini kullanarak katılımımdan önce kuruldu ve bu soruya başvurdum ve aşağıdaki komutları girdim , ancak işe yaramadı.

Sunucudan tek bir dosyayı nasıl çekerim? Örneğin, index.php yerel dosyamı güncellemek istersem? git pull index.php?



Yanıtlar:


195

Şunları yapmak mümkündür (konuşlandırılmış depoda):

git fetch
// git fetch will download all the recent changes, but it will not put it in your current checked out code (working area).

Bunu takiben:

git checkout origin/master -- path/to/file
// git checkout <local repo name (default is origin)>/<branch name> -- path/to/file will checkout the particular file from the downloaded changes (origin/master).

1
Teşekkür ederim. Peki ne demek istiyorsun <revision>? dosya adı? Benim dosya kök dizininde ise Ve bu i yazmak zorunda anlamına gelecektir: git checkout -m index.php index.php?
vsvs

Açıklama için teşekkürler.
vsvs

*origin*/masterHerhangi bir uzaktan kumandadan olmalı mı yoksa olabilir mi? Tüm geçmiş depomda mı yoksa dosya sihirli bir şekilde mi görünüyor?
Bernhard Döbler

Bu hatayı alırsanız, "git tarafından bilinen herhangi bir dosya (lar) ile eşleşmedi": "yol / dosya" GitHub'daki dosya konumundan aldığınız yolun kopyası olmamalıdır, yani "repoName / dosyaAdı" , "repoName /" 'den kurtulmalısınız ve sonra çalışacaktır.
Eduard

1
@ BernhardDöbler uzaktan herhangi bir şube olabilir :)
chrismillah

27
git fetch --all
git checkout origin/master -- <your_file_path>
git add <your_file_path>
git commit -m "<your_file_name> updated"

Bu, dosyayı orijin / master'dan aldığınızı varsayar.


13

Çözüm bu olabilir:

git fetch

git checkout origin/master -- FolderPathName/fileName

Teşekkürler.


5

Bu senaryo, siz veya sizden daha büyük güçler , yerel deponuzdaki bir dosyayı karıştırdığınızda ve depodan en son sürümünün yeni bir kopyasını geri yüklemek istediğinizde ortaya çıkar. Basitçe dosyayı / bin / rm (git rm değil) ile silmek veya yeniden adlandırmak / gizlemek ve sonra a yayınlamak git pullişe yaramaz: git dosyanın yokluğunu fark eder ve muhtemelen depodan gitmesini istediğinizi varsayar (dosyadan git diffsilinen tüm satırları gösterecektir) eksik dosya).

git pullYerel olarak eksik dosyaları geri her zaman değil ben diğer sürüm kontrol sistemleri tarafından (örneğin etkilenmiş belki beri Git bana sinirli olan svn update inanıyorum edecek yerel saklı olan dosyaları geri).

git reset --hard HEADilgilendiğiniz tüm taahhüt edilmemiş değişiklikleri attığı için ilgili dosyayı geri yüklemenin alternatif bir yoludur. Ancak, burada belirtildiği gibi , git reset, ilgilendiğiniz başka taahhüt edilmemiş değişiklikleriniz varsa, potansiyel olarak tehlikeli bir komuttur.

git fetch ... git checkout@Chrismillah tarafından yukarıda belirtildiği strateji söz konusu dosyayı geri yüklemek için güzel bir cerrahi yöntemdir.


1
diğerlerinin yorumlarından çok daha esplicative. Teşekkür ederim
Thecave3

3

Biraz farklı bir görev arıyordum ama bu senin istediğine benziyor:

git archive --remote=$REPO_URL HEAD:$DIR_NAME -- $FILE_NAME |
tar xO > /where/you/want/to/have.it

Ben, getirmek istediğiniz takdirde, yani path/to/file.xz, sen koyacaktır DIR_NAMEiçin path/tove FILE_NAMEiçin file.xz. Yani, gibi bir şeyle sonuçlanacaksın

git archive --remote=$REPO_URL HEAD:path/to -- file.xz |
tar xO > /where/you/want/to/have.it

Ve elbette kimse sizi başka bir ambalaj açma yönteminden alıkoyamaz tar xO(Burada bir pipoya ihtiyacı olan bendim, evet).


1

Şunları kullanmayı deneyin:

git checkout branchName -- fileName

Ör:

git checkout master -- index.php

2
Dikkat: "git checkout master - index.php" bu, sunucudan değil, son çekmeden yerel git veritabanından çıkış yapar.
Roberto Novakosky


0

Bu Windows toplu işi, GitHub'da olup olmadığına bakılmaksızın çalışır. Kullanıyorum çünkü bazı kesin uyarılar gösteriyor. İşlemin yavaş olduğunu ve yüzlerce megabaytlık veriyi geçtiğini fark edeceksiniz , bu nedenle gereksinimleriniz mevcut bant genişliği / RW belleğine dayanıyorsa bu yöntemi kullanmayın.

sparse_checkout.bat

pushd "%~dp0"
if not exist .\ms-server-essentials-docs mkdir .\ms-server-essentials-docs
pushd .\ms-server-essentials-docs
git init
git remote add origin -f https://github.com/MicrosoftDocs/windowsserverdocs.git
git config core.sparseCheckout true
(echo EssentialsDocs)>>.git\info\sparse-checkout
git pull origin master

=>

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü> sparse_checkout.bat

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü> pushd "C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü \"

C: \ Users \ kullanıcı adı \ Masaüstü> yoksa. \ Ms-server-essentials-docs mkdir. \ Ms-server-essentials-docs

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü> pushd. \ Ms-server-essentials-docs

C: \ Users \ kullanıcı adı \ Masaüstü \ ms-server-essentials-docs> git init C: / Users / kullanıcı adı / Desktop / ms-server-essentials-docs / .git / 'de başlatılan boş Git deposu

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü \ ms-sunucu-essentials-docs> git uzaktan kaynak ekle -f https://github.com/MicrosoftDocs/windowsserverdocs.git Uzak orijin güncelleniyor: Nesneleri numaralandırma: 97, tamam. uzak: Nesneleri sayma:% 100 (97/97), tamamlandı. uzak: Nesneleri sıkıştırmak:% 100 (44/44), tamamlandı. uzak: Toplam 145517 (delta 63), yeniden kullanılan 76 (delta 53), paket yeniden kullanılan 145420 Nesneleri alma:% 100 (145517/145517), 751.33 MiB | 32.06 MiB / s, bitti. Deltaların çözümlenmesi:% 100 (102110/102110), yapıldı. Gönderen https://github.com/MicrosoftDocs/windowsserverdocs * [yeni şube]
> köken / 1106-çatışma * [yeni şube] - 1106 çatışma
FromPrivateRepo -> köken / FromPrivateRepo * [yeni şube]
PR183 -> köken / PR183 * [yeni dal]
çatışmafix -> kaynak / çatışma
düzeltmesi * [yeni dal] eross-msft-yama-1 -> kaynak / eross-msft-yama-1 * [yeni dal]
ana -> kaynak / ana * [yeni dal] yama-1
-> origin / patch-1 * [yeni dal] repo_sync_working_branch -> origin / repo_sync_working_branch * [yeni dal]
shortpatti-patch-1 -> origin / shortpatti-patch-1 * [yeni dal]
shortpatti-patch-2 -> origin / shortpatti
-patch -2 * [yeni dal] shortpatti-patch-3 -> origin / shortpatti-patch-3 * [yeni dal]
shortpatti-patch-4 -> origin / shortpatti-patch-4 * [yeni dal]
shortpatti-patch -5 -> origin / shortpatti-patch-5 * [yeni dal]
shortpatti-patch-6 -> origin / shortpatti-patch-6 * [yeni dal]
shortpatti-patch-7 -> origin / shortpatti-patch-7 * [yeni dal]
shortpatti-patch-8 -> origin / shortpatti-patch-8

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü \ ms-server-essentials-docs> git config core.sparseCheckout true

C: \ Kullanıcılar \ kullanıcı adı \ Masaüstü \ ms-server-essentials-docs> (echo EssentialsDocs) 1 >>. Git \ info \ seyrek kontrol

C: \ Kullanıcılar \ kullanıcı adı \ Desktop \ ms-sunucu şartları-docs> git çekme kökenli usta
itibaren https://github.com/MicrosoftDocs/windowsserverdocs
* şube ustası -> FETCH_HEAD

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.