Sanırım @Aredridel'in gönderisi en yakındı , ama bundan biraz daha fazlası var - bunu buraya ekleyeceğim; şey, svnbir repo alt klasöründe iseniz ve yaparsanız:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
daha sonra svnrevizyon kontrolü altındaki tüm dosyaları dışa aktarır (ayrıca yeni eklenmiş olabilir; veya Değiştirilmiş durum) - ve bu dizinde başka "önemsiz" varsa (ve .svnburada alt klasörleri saymıyorum , ancak .odosyalar gibi görünür şeyler ) bu olacak değil ihraç edilecek; yalnızca SVN repo tarafından kaydedilen dosyalar dışa aktarılır. Benim için güzel bir şey, bu dışa aktarmanın aynı zamanda henüz yapılmayan yerel değişikliklere sahip dosyaları içermesidir ; ve güzel bir şey de, dışa aktarılan dosyaların zaman damgalarının orijinal dosyalarla aynı olmasıdır. Veya svn help exportbelirttiği gibi:
- PATH1 tarafından belirtilen çalışma kopyasından temiz bir dizin ağacını, aksi takdirde ÇALIŞMA durumunda verilirse REV revizyonunda PATH2'ye dışa aktarır. ... REV belirtilmezse, tüm yerel değişiklikler korunur. Sürüm kontrolü altında olmayan dosyalar kopyalanmayacaktır.
Bunun gitzaman damgalarını korumadığını anlamak için, bu komutların çıktılarını karşılaştırın ( gitseçtiğiniz bir repo alt klasöründe ):
/media/disk/git_svn/subdir$ ls -la .
... ve:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... ve ben, her halükarda, git archivearşivlenen dosyanın tüm zaman damgalarının aynı olmasına neden olduğunu görüyoruz ! git help archivediyor:
git arşivi, ağaç kimliği verildiğinde, taahhüt kimliği veya etiket kimliği verildiğinde farklı davranır. İlk durumda, geçerli saat arşivdeki her dosyanın değişiklik zamanı olarak kullanılır. İkinci durumda, bunun yerine atıfta bulunulan tamamlama nesnesine kaydedilen tamamlama süresi kullanılır.
... ancak görünüşe göre her iki durumda da " her dosyanın değişiklik zamanı " belirlendi; böylelikle değil bu dosyaların gerçek damgalarını koruyarak!
Yani, zaman damgalarını korumak için, burada bashbiraz karmaşık olsa da, aslında bir "tek satır" olan bir komut dosyası var - bu yüzden aşağıda birden çok satırda yayınlanmıştır:
/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
DEST="/media/diskC/tmp/subdirB"; \
CWD="$PWD"; \
while read line; do \
DN=$(dirname "$line"); BN=$(basename "$line"); \
SRD="$CWD"; TGD="$DEST"; \
if [ "$DN" != "." ]; then \
SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
if [ ! -d "$TGD" ] ; then \
CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
echo "$CMD"; \
eval "$CMD"; \
fi; \
fi; \
CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
echo "$CMD"; \
eval "$CMD"; \
done \
)
İçeriği "geçerli" dizinde (yukarıda /media/disk/git_svn/subdir) dışa aktardığınızı ve dışa aktardığınız hedefin biraz uygunsuz bir şekilde yerleştirildiğini, ancak DESTortam değişkeninde olduğunu unutmayın. Bu komut dosyası ile; DESTyukarıdaki komut dosyasını çalıştırmadan önce dizini kendiniz oluşturmalısınız .
Komut dosyası çalıştırıldıktan sonra aşağıdakileri karşılaştırabilmeniz gerekir:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... ve umarım aynı zaman damgalarını görürsünüz (sürüm kontrolü altındaki dosyalar için).
Umarım bu birine yardımcı olur,
Şerefe!