मुझे लगता है कि @Aredridel का पद सबसे नज़दीक था, लेकिन इसके लिए थोड़ा अधिक है - इसलिए मैं इसे यहाँ जोड़ूंगा ; बात यह है कि svn, यदि आप एक रेपो के सबफ़ोल्डर में हैं, और आप करते हैं:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
फिर svnसभी फाइलें जो कि संशोधन नियंत्रण में हैं (वे नए सिरे से जोड़ सकते हैं; या संशोधित स्थिति) - और यदि आपके पास उस निर्देशिका में अन्य "जंक" है (और मैं .svnयहां सबफ़ोल्डर्स की गिनती नहीं कर रहा हूं , लेकिन .oफाइलों की तरह दिखाई देने वाला सामान निर्यात करेगा ) , यह निर्यात नहीं किया जाएगा; एसवीएन रेपो द्वारा पंजीकृत केवल उन फाइलों को निर्यात किया जाएगा। मेरे लिए, एक अच्छी बात यह है कि इस निर्यात का भी स्थानीय परिवर्तन है कि है के साथ फ़ाइलें शामिल है नहीं अभी तक किया गया; और एक और अच्छी बात यह है कि निर्यात की गई फाइलों का टाइमस्टैम्प मूल के समान ही हैं। या, जैसा svn help exportकि यह कहते हैं:
- PATH1 द्वारा निर्दिष्ट कार्य प्रति से एक साफ निर्देशिका वृक्ष का निर्यात करता है, यदि संशोधन दिया गया है, तो अन्यथा संशोधन पर, PATH2 में। ... यदि REV निर्दिष्ट नहीं है, तो सभी स्थानीय परिवर्तन संरक्षित किए जाएंगे। वर्जन कंट्रोल में नहीं आने वाली फाइलों को कॉपी नहीं किया जाएगा।
यह समझने के लिए कि gitटाइमस्टैम्प संरक्षित नहीं करेंगे, इन कमांड के आउटपुट की तुलना करें ( gitअपनी पसंद के रेपो के सबफ़ोल्डर में ):
/media/disk/git_svn/subdir$ ls -la .
... तथा:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... और मैं, किसी भी मामले में, ध्यान दें कि git archiveसंग्रहीत फ़ाइल के सभी टाइमस्टैम्प समान होने का कारण बनता है! git help archiveकहते हैं:
git अर्काइव तब अलग तरीके से व्यवहार करता है जब एक वृक्ष ID बनाम जब एक प्रतिबद्ध ID या टैग ID दिया जाता है। पहले मामले में संग्रह में प्रत्येक फ़ाइल के संशोधन समय के रूप में वर्तमान समय का उपयोग किया जाता है। उत्तरार्द्ध मामले में संदर्भित कमिट ऑब्जेक्ट में दर्ज किए गए प्रतिबद्ध समय का उपयोग इसके बजाय किया जाता है।
... लेकिन स्पष्ट रूप से दोनों मामलों में " प्रत्येक फ़ाइल का संशोधन समय" निर्धारित किया गया है ; जिससे उन फ़ाइलों के वास्तविक टाइमस्टैम्प को संरक्षित नहीं किया जा सकता है !
इसलिए, टाइमस्टैम्प को संरक्षित करने के लिए, यहां एक bashस्क्रिप्ट है, जो वास्तव में "वन-लाइनर" है, भले ही कुछ जटिल हो - इसलिए नीचे इसे कई लाइनों में पोस्ट किया गया है:
/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 \
)
ध्यान दें कि यह माना जाता है कि आप "वर्तमान" निर्देशिका (ऊपर /media/disk/git_svn/subdir) में सामग्री निर्यात कर रहे हैं - और जिस गंतव्य में आप निर्यात कर रहे हैं वह कुछ हद तक असुविधाजनक है, लेकिन यह DESTपर्यावरण चर में है। ध्यान दें कि इस स्क्रिप्ट के साथ; आपको बनाना होगाDESTउपरोक्त स्क्रिप्ट चलाने से पहले, आपको मैन्युअल रूप निर्देशिका स्वयं ।
स्क्रिप्ट के चलने के बाद, आपको तुलना करने में सक्षम होना चाहिए:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... और उम्मीद है कि समान टाइमस्टैम्प (उन फ़ाइलों के लिए जो संस्करण नियंत्रण में थे)।
आशा है कि यह किसी की मदद करता है,
चीयर्स!