Sanırım @Aredridel'in gönderisi en yakındı , ama bundan biraz daha fazlası var - bunu buraya ekleyeceğim; şey, svn
bir repo alt klasöründe iseniz ve yaparsanız:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
daha sonra svn
revizyon 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 .svn
burada alt klasörleri saymıyorum , ancak .o
dosyalar 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 export
belirttiğ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 git
zaman damgalarını korumadığını anlamak için, bu komutların çıktılarını karşılaştırın ( git
seç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 archive
arşivlenen dosyanın tüm zaman damgalarının aynı olmasına neden olduğunu görüyoruz ! git help archive
diyor:
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 bash
biraz 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 DEST
ortam değişkeninde olduğunu unutmayın. Bu komut dosyası ile; DEST
yukarı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!