Subversion'dan bir dosyayı teslim alma


320

"Tek bir dosyayı teslim almak mümkün değil. Yapabileceğiniz en iyi check-out düzeyi dizin düzeyindedir."

Subversion kullanırken bu sorunu nasıl çözebilirim?

Subversion'da tüm resimlerimizi sakladığımız bu klasöre sahibiz. Bundan sadece bir dosya (resim) almak istiyorum. Bu klasör gerçekten büyük ve şu anda ihtiyacım olmayan tonlarca başka şeye sahip.


Bunu başka şekilde yapabilirsiniz. Üretim sunucusunda ve svn upbilgisayarınızdaki yerel dizinde oturum açın.
Neocortex

Yanıtlar:


403

Basit yanıt, svn exportdosyayı teslim etmek yerine size vermenizdir .

Ama istediğin bu olmayabilir. İhtiyacınız olmayan GB önemsiz paketini indirmek zorunda kalmadan dosya üzerinde çalışmak ve yeniden kontrol etmek isteyebilirsiniz.

Subversion 1.5+ ürününüz varsa, seyrek bir ödeme yapın:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

SVN'nin daha eski bir sürümü için aşağıdakilerden yararlanabilirsiniz:

  • Uzak geçmişte bir revizyon kullanarak dizine göz atın, ihtiyacınız olmayan daha az önemsiz olduğunda.
  • Karışık bir revizyon oluşturmak için istediğiniz dosyayı güncelleyin. Bu, dosya teslim aldığınız revizyonda bulunmasa bile çalışır.
  • Kar!

Bir alternatif (örneğin, dizinin oluşturulduğu revizyondan çok fazla önemsiz olması durumunda), istediğiniz dosyanın depodaki yeni bir yere URL-> URL kopyasını yapmaktır (etkin bir şekilde bu bir çalışma dalıdır. dosya). Bu dizine göz atın ve değişikliklerinizi yapın.

Daha sonra, değiştirilmiş kopyanızı hedefin çalışan bir kopyası olmadan tamamen depoda birleştirip birleştiremeyeceğinizden emin değilim. Eğer öyleyse, o zaman yap.

Değilse, ne yazık ki tüm dizini teslim almış başka birini bulmak ve onları yapmak zorunda olabilir. Ya da belki değişikliklerinizi yaptıktan sonra, geri kalanı indirmeyi bitirmiş olabilir ...


13
Gerçekten basit bir çözüm, bir web tarayıcısıyla depoya erişmektir.
dolmen

11
@dolmen - Dosyayı değiştirmeye gerek olmadığını varsayarsak (ve bu depo için bir web arabiriminin çalıştığını varsayarsak). Komut satırı SVN kullanıyorum, bu yüzden benim için, svn exporthangi dosyayı istediğimi biliyorsanız, web arayüzünü kullanmaktan daha kolaydır . Sorgulayıcı zaten SVN kullanıyor, bu yüzden hangi istemciye ve bu istemcinin kullanımını kolaylaştıracağına bağlı svn export. svn lsYine de tarama için web arayüzünü daha iyi buluyorum :-)
Steve Jessop

2
Subversion Sunucunuz destekliyorsa SmartSVN İstemcisi tek tek dosyaları kilitler. Ve bir ikili / çalıştırılabilir dosya teslim edilebilir önce kontrol edilmesi gereken kancalar vardır. Gerçekten iki kişi bir ikili para cezası değiştirmek ve bu değişiklikleri bir araya getirilmesi mantıklı değildir. Bunlar, bu soru sorulduğunda mevcut olmayan yeni özellikler olabilir.
TamusJRoyce

@Tamus: "Gerçekten mantıklı değil" kabul etti, ancak tarif ettiğim durumlarda birleştirme sadece yeni sürümü orijinal konumuna geri getirmek. İkili dosyanın birleştirme hedefinde değiştirilmesi beklenmemektedir. Bu yüzden dosyanın kendisi eski sürümü yenisiyle değiştirmenin ötesinde herhangi bir "birleştirme" ye ihtiyaç duymaz, sadece SVN'nin çağırdığı şeydir ve değişikliklerin gelecekteki referans için nereden geldiğini kaydeder. Haklısınız, süre boyunca dosyayı kilitleyerek çakışma önleme uygulanabilir.
Steve Jessop

1
TortoiseSVN tek tek dosyaları kontrol edebilir. Bunu başarmak için perde arkasında aynı şeyi yaptığına inanıyorum.
Mike Starov

109

svn exportBunun yerine deneyin svn checkout. Bu tek dosyalar için geçerlidir.

Sınırlamanın nedeni checkout, depo, düzeltme, öznitelikler vb. Hakkında meta bilgileri içeren çalışan bir kopya oluşturmasıdır. Bu meta veriler '.svn' adlı alt dizinlerde depolanır. Ve tek dosyaların alt dizinleri yoktur.


2
Uyarı: Son derece eski sürümleri svntek dosya dışa aktarma yapmaz.
Mladen Jablanović

5
Belirli bir komut dosyasının en son sürümünü bir dağıtımın parçası olarak almak istiyorsanız bu üstün yöntemdir.
william.berg

2
Bu uyarı 2011'de bile bir gerginlikti, ancak son derece eski versiyonlar yapabilir svn cat $url_to_file_in_repo > $local_file_name.
cprn

53

svn catVeya tuşunu kullanın svn export.

Bunun için, çalışma dizinini getirmeniz gerekmez, ancak yaptığınız değişiklikleri uygulayamazsınız. Değişiklik yapmanız ve bunları taahhüt etmeniz gerekiyorsa, çalışan bir dizine ihtiyacınız vardır, ancak tamamen getirmeniz gerekmez. Dizinin hala / neredeyse boş olduğu revizyona göz atın ve ardından dosyayı HEAD'den ayıklamak için 'svn cat' kullanın.


svn cat svn://.../my_file.txttam olarak aradığım şeydi. Bir işe svn://yalnızca ( http://) depo ve bir ham dosya indirme sağlamaz yeni websvn arayüzleri görünüyor (ya biz yapılandırılmış mis ya da ben körüm var). Bir dosyayı indirmek için checkout+ yapmaktan daha kolay up.
Kasım'da ribamar

12

Havuzunuzda readme.txt dosyasını kontrol etmeden görüntülemek istiyorsanız:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Bu bir README dosyasıdır. Bunu okumalısın.

İpucu: Çalışma kopyanız güncel değilse (veya yerel değişiklikleriniz varsa) ve çalışma kopyanızdaki bir dosyanın HEAD revizyonunu görmek istiyorsanız, svn cat bir yol verdiğinizde HEAD revizyonunu otomatik olarak getirecektir:

$ cat foo.c
Bu dosya yerel çalışma kopyamda ve yaptığım değişiklikler var.

$ svn cat foo.c Depodan
yeni revizyon!

Kaynak


Doğrudan herhangi bir HTTP istemcisini de kullanabilirsiniz. Web tarayıcınız veya gibi bir komut satırı aracı curlveya wget.
dolmen

9

Kabul edilen cevabın bir TortoiseSVN eşdeğeri çözümü (SVN'yi benimsediğimiz için bunu şirketim için dahili bir belgede yazmıştım) izler. Burada da paylaşmanın yararlı olacağını düşündüm:

Tek bir dosyayı teslim alma: Subversion, tek bir dosyanın teslim alınmasını desteklemez, yalnızca dizin yapılarının teslim alınmasını destekler. (Referans: http://subversion.tigris.org/faq.html#single-file-checkout ). Bunun nedeni, çalışan bir kopya olarak teslim alınan her dizinde, değişiklik / dosya revizyonlarına ilişkin meta verilerin dahili bir gizli klasör (.svn / _svn) olarak depolanmasıdır. Bu, şu anda tek dosyalar için (v1.6) desteklenmemektedir.

Önerilen alternatif strateji: Ödeme dizini bölümünü yalnızca bir kez yapmanız gerekir; bunu takiben tek tek dosyalarınıza doğrudan gidip ödeme yapabilirsiniz. Üst klasör ve dizin yapısının seyrek bir kontrolünü yapın. Seyrek bir ödeme, temelde içerik dosyalarını doldurmadan sadece klasör yapısını kontrol eder. Yani sadece dizin yapılarını kontrol ve endişe gibi TÜM dosyaları ödeme gerekmez. Referans: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

1. Adım : Havuz tarayıcısına ilerleyin

Adım 2 : Depodaki üzerinde çalışmak istediğiniz tüm dosyaları içeren üst klasörü sağ tıklayın ve Checkout'u seçin.

Adım 3 : Yeni açılır pencerede, ödeme dizininin yerel PC'nizde doğru konumu gösterdiğinden emin olun. “Ödeme derinliği” etiketli bir açılır menü de olacaktır. Gereksiniminize bağlı olarak “Yalnızca bu öğeyi” veya “Klasörler dahil olmak üzere hemen çocukları” seçin. İkinci seçenek önerilir, çünkü iç içe geçmiş klasörde çalışmak isterseniz, bir sonraki seferde doğrudan devam edebilirsiniz, aksi takdirde iç içe geçmiş klasör için bu yordamı tekrar uygulamanız gerekir.

Adım 4 : Ana klasör (ler) artık yerel olarak seçtiğiniz klasör içinde mevcut olmalı ve şu anda SVN ile izleniyor olmalıdır (gizli bir klasör “.svn” veya “_svn” mevcut olmalıdır). Şimdi depo içinde, tek başına teslim almak istediğiniz tek dosyayı sağ tıklayın ve “Düzeltilecek Öğeyi Güncelle” seçeneğini seçin. Tek bir dosya üzerinde çalışılabilir ve depoya yeniden kontrol edilebilir.

Umarım bu yardımcı olur.


8

İki adımda yapabilirsiniz:

  1. Yalnızca meta bilgileri içeren boş bir SVN deposuna göz atın:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. svn upBelirtilen dosyayı güncellemek için çalıştır :

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    

6

Gerçekten ihtiyacınız olan bir güncelleme, dosyanın başka bir klasörün kasasına dahil edilmesiyle karşılanabilir.

SVN 1.6'dan beri dosya hariciları , bir tür svn bağlantısı yapabilirsiniz. Bu, tek bir dosya içeren başka bir sürümlenmiş klasöre sahip olabileceğiniz anlamına gelir. Bu klasörün bir kasasında dosyada değişiklik yapmak da mümkündür.

Çok basit, dosyayı dahil etmek istediğiniz klasöre göz atın ve klasöre bir özellik ekleyin

svn propedit svn:externals .

bunun gibi içeriklerle:

file.txt /repos/path/to/file.txt

Bunu yaptıktan sonra, dosya klasörün gelecekteki kasalarında görünecektir. Temel olarak çalışır, ancak yukarıda bağlantılı belgelerde açıklanan bazı sınırlamalar vardır.


4

Repo tarayıcıya gidin, dosyayı sağ tıklayın ve 'Farklı Kaydet'i kullanın, TortoiseSVN kullanıyorum.


4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Dosya adını düzenle.log)

svn commit -m "this is a comment."

4

Steve Jessop'un yanıtı benim için işe yaramadı. SVN için yardım dosyalarını okudum ve sadece bir resminiz varsa, Photoshop yapmadıkça muhtemelen tekrar kontrol etmek istemezsiniz, bu nedenle dışa aktarma , sürümden bağımsız olarak ödeme yapmaktan daha iyi bir komuttur (ancak bu küçüktür).

Ve --depth ARG olmamalı boş ama dosyalar anında dizindeki dosyaları alır. Böylece tüm alanları alırsınız, sadece bir alanı değil, boş depodan hiçbir şey döndürmez .

 svn co --depth files <source> <local dest>

veya

svn export --depth files <source> <local dest>

Diğer cevaplara gelince, kedi her şeyin görüntüsü için değil, sadece metin için iyi olan içeriği okumanıza izin verir.


1
Asıl nokta --depth empty, diğer dosyaların teslim alınmaması gerektiğiydi ve ardından yalnızca tek bir dosya alabilirsiniz svn up <source/file>. İle svn exportbunu yapmanıza gerek yok, sadece dosyayı belirtin.
Kevin Vermeer

@reemrevnivek - haklısın. iyi soru sadece tek bir dosya istedi, bu boş olsa bile tüm dizin yapısı dosyasını teslim almadan çalışır.
Vass

4

Sadece göz atıp tek bir dosyayı dışa aktarırım. HTTP erişiminiz varsa, dosyayı bulmak ve almak için web tarayıcısını kullanmanız yeterlidir.

Düzenledikten sonra geri almanız gerekiyorsa, bu biraz daha sıkıcı olabilir, ancak eminim bir svn importişlev olabilir ...


3

Bunun gibi bir şey yapın:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Temel olarak fikir, dosyayı SVN'den almak istediğiniz dizini oluşturmaktır. svn catKomutu kullanın ve çıktıyı aynı adlı dosyaya yönlendirin. Varsayılan olarak, kedi stdio'ya bilgi dökecektir.


2

Sadece düzeltme bilgisi olmayan bir dosya istiyorsanız

svn export <URL>

2

Subversion 1.5 ile, herhangi bir alt dizini (çeşitli --depth bayrakları) kontrol etmeden bir dizinin dosyalarını kontrol etmek (tümü) mümkün hale gelir. Tam olarak ne istediğini değil, "her şeyden daha az" şeklinde.


2

Seyrek teslim alma tekniğini kullanarak, zaten teslim alınmış veya var olan belirli bir dosyayı basit bir numara ile kontrol edebilirsiniz:

'Yalnızca bu öğe' seçeneğini kullanarak deponuzun en üst düzeyini kontrol ettikten sonra, Windows Gezgini'nde önce güncellemeniz gereken dosyayı sağ tıklatmalısınız; bağlam menüsünde Tarayıcıyı Yeniden Kopyala'yı seçin; depodaki bu dosyayı TEKRARLA bulun ve sağ tıklayın. Artık içerik menüsünde "düzeltilecek öğeyi güncelle" yi görmelisiniz.

Belgelenmemiş bir özellik mi yoksa sadece bir hata mı olduğundan emin değilim. Sonunda bu numarayı bulmak uzun bir çalışma sonrası saatlerimi aldı. TortoiseSVN 1.6.2 kullanıyorum .


2

Çalışan bir kopyanın parçası olmayan bir dizine tek bir dosyayı teslim almak istedim.

Dosyayı şu URL'den alalım : http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Bu yüzden sahte bir dizine almak istediğim hedef dosyayı içeren belirli bir dizini kontrol ettim (biten URL için etcb deyin /etc).

Sonra , istediğim hedef dizinin tüm dosyalarından .svn / girişleri , istediğim dosyayı bırakmak için boşalttım . Bu .svn / girişlerinde dosyasında, her dosya için özniteliklerine sahip bir kaydınız vardır, bu nedenle sadece almak ve kaydetmek istediğiniz dosyayla ilgili kaydı bırakın.

Şimdi sadece '' .svn '' dosyasını yeni bir "çalışan kopya" olacak dizine kopyalamanız gerekiyor. O zaman yapmanız gerekenler:

cp .svn /directory
cd /directory
svn update myfile

Şimdi dizin dizini sürüm kontrolü altında. Sadece '' geçici çalışan bir kopya '' olan dizin dizinini kaldırmayı unutmayın .


Seyrek kasanın yaptığı şey bu değil mi? .Svn dizinindeki dosyaları el ile gerçekten hacklememelisiniz.
Lasse V. Karlsen

Belki de sorunu düzgün çözdü. Sanırım sürüm yönetiminin çalışması gerektiği gibi, dosyaları dizinlerin uzantısı olarak da kullanabiliyoruz. Deneyin ve bana mantıkla neyin yanlış olduğunu söyleyin. Subversion geliştirme ekibinin svn yardımcı programını bu özellik ile genişletmesini önerebilirim, bu konuya cevap veren herkesin sorunlarını çözecektir.
hendergassler

2

Diğer cevapların hiçbiri benim için çalışmadığı için bu hack'i kullanarak yaptım:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Bu, yalnızca uzak yoldaki dosyaları içeren yeni bir yerel klasör oluşturur. Ardından, burada olmasını istediğiniz dosyalara sembolik bir bağlantı yapabilirsiniz.


OP svn cogörüntü dosyalarıyla dolu bir dizinin tamamının önüne geçmesini istedi . Ayrıca, bir sembolik bağlantı eklemek yalnızca karmaşıklığa katkıda bulunabilir, geçici bir dizinden hareket etmek işe yarayabilir, ancak yine de tek bir görüntü için tüm resim dizinini kontrol etmeniz gerekir. @ steve-jessop doğru fikri vardı
Chris Marotta

2
@ChrisMarotta OP soruyu 9 yıl önce sordu. Burada kimse OP'ye cevap vermiyor. Bu, bu tür bir sorun için genel bir konudur ve artık orijinal OP ile ilgisi yoktur. İnsanlar buraya kendi sorunlarına bir çözüm bulmaya geliyorlar. Ve okuduklarında, bazıları bunun tek uygun çözüm olduğu durumumda olacak. Bu yüzden yayınladım.
Lacho Tomov

1
Bu cevap için mutluyum, bana yardımcı oldu
Leos Literak

1

Bu konu aşağıdakileri kapsamaktadır:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Svn'den tek bir dosyayı teslim almanıza, değişiklikler yapmanıza ve değişiklikleri depoya geri yüklemenize izin veren bir komut dosyası vardır, ancak dizinin geri kalanını kontrol etmek için "svn up" komutunu çalıştıramazsınız. Svn-1.3, 1.4 ve 1.6 ile test edilmiştir.


1

Yalnızca dosyayı dışa aktarmak istiyorsanız ve daha sonra güncellemeniz gerekmiyorsa, SVN komutlarını kullanmak zorunda kalmadan yapabilirsiniz.

TortoiseSVN Havuz Tarayıcısını kullanarak dosyayı seçin, sağ tıklayın ve ardından " URL'yi panoya kopyala " yı seçin . Bu URL'yi tarayıcınıza yapıştırın ve giriş yaptıktan sonra dosya indirmeniz istenecektir.

Bu şekilde istediğiniz düzeltmeyi seçebilir ve dosyanın eski bir sürümünü indirebilirsiniz.

SVN sunucunuzun bir web arayüzü varsa, bunun geçerli olduğunu unutmayın.

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.