Tek bir klasörü bir Subversion veri havuzundan başka bir veri havuzuna nasıl taşıyabilirim?


156

"Project" adlı bir Subversion deposunda bir "docs" klasörü var. Gerçekten "project_docs" adlı ayrı bir Subversion deposu altında tutulması gerektiği sonucuna vardım.

"Docs" klasörünü ( ve tüm revizyonlarını ) "project_docs" deposuna taşımak istiyorum . Bunu yapmanın bir yolu var mı?

Yanıtlar:


183

Depoya erişiminiz varsa (çalışan bir kopyaya değil), geçerli havuzu dökebilmeli, yalnızca dokümanlar klasörü hakkında bilgi içerecek şekilde filtreleyebilmeli ve diğer depoya yükleyebilmelisiniz.

Böyle bir şey olurdu:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Depoya erişim olmadan, düzeltme geçmişini koruyamazsınız ve dosyaları yeni depoya kopyalamak ve işlemek için anlaşmanız gerekir.


1
Güzel bir örnek. Bağlandığım belgelerde belirtildiği gibi, bu çözümün tüm revizyonları yeniden numaralandıracağını ve böylece "boşaltma" yapılmayacağını unutmayın. Doküman revizyonlarına başka bir yere başvurursanız akılda tutulması gereken bir şey.
Adam Bellaire

1
Hedef depoya bir sürü boş revizyon eklemekten kaçınmak için boş revizyonların kaldırılmasını önerdim. --Preserve-revprops, varsayılan yüklemeyi kullanmak yerine kaydetme iletilerini saklayacağından.
Samuel

11
Cevap için teşekkürler. Herkesin bilmesi gerektiğinde, birden fazla klasöre ihtiyacınız varsa, içerme listesine aralarında boşluk bırakın. Ör. ... include folderOne folderTwo
Robin Robinson

6
Taahhüt mesajları ve sorun izleme araçları bunlara başvurabileceğinden, revizyonları yeniden numaralandırmak muhtemelen kötü bir fikirdir
Wim Coenen

5
Bu benim için çalıştı. Ben bir windows kullanıcısıyım (Visual SVN Server) ve herkese yardımcı olursa ilk komutum şöyle görünüyordu:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilter ciddi bir kusura sahiptir - filtrelediğiniz bir yoldan bir dosya veya yol kopyalandıysa, svndumpfilter geçmişi dolduramaz ve iş başarısız olur.

Bu sorunla karşılaşırsanız svndumpfilter2'yi kullanabilirsiniz .


4
İşte svndumpfilter2 için daha iyi bir bağlantı: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

Bu durumda, gerekli yolu listeye ... olabildiğince spesifik olarak ekleyebilir ... ve ardından içe aktardıktan sonra bu girdileri projeden kaldırabilirsiniz.
James Gawron

6

Bu, SVN belgelerinde tartışılmıştır. Check out Depo Bakım bölümüne svndumpfilterÖzellikle merkezi bir depo dışına projelerini dökümü ve yeni, ayrı depoları içine taşımak açıklamaktadır ....


2

Uzaktan (yerel bir kopya olmadan) yapabileceğinize inanmıyorum. Ama bu işe yaramalı: svn exportorijinal sunucudan klasör, daha sonra svn addyeni repo için klasör .

Sevmek:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Düzenleme: D'oh, bu tarihin düşüyor. Samuel'in tarif ettiğisvnadmin gibi kullanın .


3
Ancak, depoya erişim olmadan revizyonları tutamazsınız. Yalnızca çalışan bir kopyanız varsa, yapabileceği en iyi şey budur.
Samuel

2

İleride başvurmak için:

SVN belgeleri açıkça şunları bildirmektedir:

Üst düzey bir dizini kaldırmak için döküm dosyasını el ile düzenlemeyi planlıyorsanız, düzenleyicinizin satır sonu karakterlerini otomatik olarak yerel biçime (ör. \ R \ n - \ n) dönüştürecek şekilde ayarlanmadığından emin olun. çünkü içerik meta verilerle aynı fikirde değildir. Bu, döküm dosyasını işe yaramaz hale getirir.

Üst düzey dizini değiştirmek için sed veya Vim kullanın, ancak bu dizin adı da bir proje dosyası içinde yer aldı !!!! Bu, bir SVN yük sağlama toplamı hatasına neden olur.

Bu işlemi gerçekleştirdiğinizde, yalnızca yol adının sediyle dize değiştirmeleri yapmayın.

“Düğüm yolu: eski_yol” yerine “Düğüm yolu: yeni_yol” yazın. Daha fazla bilgi için bkz. SVN kitap bölüm 5 “depo yönetimi”.


1

Kabul edilen cevabı kullanmaya çalıştım, ama çok büyük bir veri havuzum vardı ve küçük bir dizini dışa aktarmak istedim ve tüm veri havuzunu dökmeyi göze alamıyordum.

Bu nedenle, yalnızca dizinimin değiştiği revizyonları dışa aktardım (Dışa aktarmak istediğiniz dizinin deponuzdaki diğer yerlere referansları varsa bu çalışmayabilir).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Repo URL'nizi ( URL_to_docs), sunucudaki ( /svn/old_repo) konumunuzu ve depodaki ( path/to/docs) dokümanların yolunu değiştirmeniz gerekir

docs_only.dumpYeni deponuzdaki doc dizininizin konumunu değiştirmek istiyorsanız, öğenizi kolayca düzenleyebilirsiniz .

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.