Git: Uzaktaki kaynaktan tek bir dosyayı nasıl güncelleyebilir / teslim edebilirim?


363

Senaryo:

  1. Ben yerel olarak tek bir dosyada bazı değişiklikler yapmak ve çalıştırmak git add, git commitvegit push
  2. Dosya uzaktaki ana depoya gönderilir
  3. Bu uzak depodan "remote_cache" yöntemi ile Capistrano aracılığıyla dağıtılan başka bir yerel depo var
  4. Şimdi tüm uygulamayı dağıtmak istemiyorum, sadece o dosyayı güncellemek / kontrol etmek istiyorum.

Git ile bir şekilde bu mümkün müdür? İşe yarayacak hiçbir şey bulamadım ve çözemedim. SVN ile yaptım svn up fileve işte.


20
Kabul edilen cevabı, sorunuzu gerçekten cevaplayan cevaba değiştirmeyi düşünebilirsiniz. ;)
adımlar

7
6'dan fazla yıl sonra, güvenli bir şekilde bu @steps olmayacak varsayabiliriz inanıyoruz ...
Félix Gagnon-Grenier

Git 2.23 (Ağustos 2019) ile öyle git restore -s origin/master -- path/to/file. Bkz aşağıda Cevabımı .
VonC

Yanıtlar:


916

Bunu yapmak mümkündür (konuşlandırılmış depoda)

git fetch
git checkout origin/master -- path/to/file

Getirme, son değişikliklerin tümünü indirir, ancak mevcut kullanıma alınmış kodunuza (çalışma alanı) koymaz.

Ödeme, çalışma ağacını indirilen değişikliklerden ( origin/master) belirli bir dosyayla güncelleyecektir .

En azından bu benim için küçük bir yazım hatası düzeltmesi için işe yarıyor, burada bir dosya oluşturmak için bir dal vb.


1
Süper kullanışlı, bu harika çalıştı. Sitenin geri kalanını üretimde güncellemeden önce bir composer.json dosyası almam ve bir güncelleştirme çalıştırmam gerekiyordu. Eğer composer.json / lock dosyalarını el ile koyarsam, bir çekim yaptığımda, dosyaların zaten var olduğunu söyleyerek çakışma olur. Bu şekilde git, dosyaları şikayet etmeden tanıdı.
David

6
Aradığım cevap bu.
javadba

20
@Mymozaaa Çift çizgi aşağıdaki öğelerin bir dosya adı olduğunu belirtir. Git'in aynı ada sahip iki tane olan talihsiz durumda dosya adınızı bir şube olarak yorumlamasını önlemek.
Joel Mellon

Sorun hala getiriyor olmanız ve eğer büyük bir repo ise pahalı işlem olacak. Ben tek alternatif uzaktan gitweb yüklemek ve daha sonra dosya ya da böyle almak için erişmek olacağını korkuyorum.
Christian Goetze

küçük bir soru, bunu yaptıktan sonra, farklı bir makineye gidiyorum, o zaman yukarıda listelenen eylemlerinizi yapıyorum, ama sonra git statusonları şu şekilde görüyorum Changes to be committed:- yani, tekrar taahhüt etmeliyim? (tek bir dokunulmamış dosyayı yenilemek istediğimi ancak repoya farklı bir makinede dokunulduğunu belirtmek)
Ricky Levi

43

Aşağıdaki kod benim için çalıştı:

     git fetch
     git checkout <branch from which file needs to be fetched> <filepath> 

20

Git 2.23 (Ağustos 2019) ve git restore" Çalışma dizininden tüm dosyaları nasıl sıfırlanır, ancak hazırlama alanından değil? "

git fetch
git restore -s origin/master -- path/to/file

Fikir şu: git restoresadece dosyalar ile ilgilenir, dosyalar ve dallar gibi git checkoutdeğil.
Bkz. " Kafası karıştıgit checkout ": devreyegit switch girer)


codersam ekler yorumlarda :

Benim durumumda veriyi yukarı akışımdan (çatallandığım) almak istedim .
Yani sadece şu şekilde değiştirildi:

git restore -s upstream/master -- path/to/file

2
Bu komuta nihayet var olan bir rahatlama ... Git-cluefull insanları daha önce ne yapıyordu? Her şeyi geri yükledim ve ihtiyacım olan dosyaları tek tek kopyalıyordum, ama acı vericiydi.
Mike Wise

Bu benim için çalıştı, ama benim durumumda veriyi yukarı akışımdan (çatallandığım) almak istedim. Yani sadece değiştirildigit restore -s upstream/master -- path/to/file
coderSam

@coderSam Bu geri bildirim için teşekkür ederiz. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
Bu ssh üzerinde klonlanan git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -xfatal: Operation not supported by protocol.
depolar

1
was nice ile birlikte tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

8

Yapabilecekleriniz:

  1. Yerel git deponuzu güncelleyin:

    git fetch

  2. Yerel bir şube oluşturun ve üzerinde ödeme yapın:

    git branch pouet && git checkout pouet

  3. İstediğiniz taahhüdü bu şubeye uygulayın:

    git cherry-pick abcdefabcdef

    (abcdefabcdef uygulamak istediğiniz taahhüdün sha1idir)


4
Bir kenara, ikinci adımınız olarak tek bir komutta da yapılabilir git checkout -b pouet.
Greg Hewgill

4
'pouet' bu örnek için en iyi şube adıdır.
Hussard

2

Ya da git stash (değişiklikleriniz varsa), dalda ana çıkış, ödeme yöneticisi, en son değişiklikleri alın, bu dosyayı masaüstünüze (veya tüm uygulamaya) alın. Bulunduğunuz şubeyi kontrol edin. Git stash bulunduğunuz duruma geri uygulanır, ardından değişiklikleri manuel olarak düzeltin veya dosyayı değiştirerek sürükleyin.

Bu şekilde sooooo cool değil ama eğer başka bir şey bulamazsanız def çalışır.


-10

Sanırım kolay bir saldırı buldum.

Yerel depodaki (uzak sunucudaki en son işlemden güncellenmesini istediğiniz dosya) dosyayı silin

Ve sonra bir git pull

Dosya silindiğinden, çakışma olmayacak


Bu, söz konusu dosyada yapılan tüm nihai değişiklikleri yerel olarak kaldırır ve diğer tüm dosyaları da çeker, bu da özellikle OP'nin yapmak istemediği şeydir.
legrojan

Uzak dalı güncellemek yerine, yerel bağlantıyı kaldırmak çok kötü bir fikirdir.
c0der512
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.