ฉันคิดว่าโพสต์ของ@Aredridelอยู่ใกล้ที่สุด แต่ก็มีอะไรเพิ่มเติมอีกหน่อย - ดังนั้นฉันจะเพิ่มที่นี่ สิ่งนั้นคือsvn
ถ้าคุณอยู่ในโฟลเดอร์ย่อยของ repo และคุณ:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
จากนั้นsvn
จะส่งออกไฟล์ทั้งหมดที่อยู่ภายใต้การควบคุมการแก้ไข (พวกเขาอาจเพิ่มสดใหม่หรือแก้ไขสถานะ) - และถ้าคุณมี "ขยะ" อื่น ๆ ในไดเรกทอรีนั้น (และฉันไม่นับ.svn
โฟลเดอร์ย่อยที่นี่ แต่สิ่งที่มองเห็นได้เช่น.o
ไฟล์) มันจะไม่ถูกส่งออก; เฉพาะไฟล์ที่ลงทะเบียนโดย repo SVN เท่านั้นที่จะถูกส่งออก สำหรับฉันสิ่งหนึ่งที่ดีคือการส่งออกนี้มีไฟล์ที่มีการเปลี่ยนแปลงในเครื่องซึ่งยังไม่ได้ทำ และสิ่งที่ดีอีกอย่างก็คือการประทับเวลาของไฟล์ที่ส่งออกนั้นเหมือนกับของดั้งเดิม หรือตามที่svn help export
วางไว้:
- เอ็กซ์พอร์ตแผนผังไดเร็กทอรีแบบคลีนจากสำเนาการทำงานที่ระบุโดย PATH1, ที่ revision REV หากกำหนดไว้, ไม่เช่นนั้นที่ WORKING, ไปที่ PATH2. ... หากไม่ได้ระบุ REV การเปลี่ยนแปลงในระบบทั้งหมดจะถูกเก็บไว้ ไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันจะไม่ถูกคัดลอก
หากต้องการทราบว่าgit
จะไม่เก็บบันทึกเวลาให้เปรียบเทียบผลลัพธ์ของคำสั่งเหล่านี้ (ในโฟลเดอร์ย่อยของgit
repo ที่คุณเลือก):
/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 ในกรณีแรกเวลาปัจจุบันถูกใช้เป็นเวลาการแก้ไขของแต่ละไฟล์ในไฟล์เก็บถาวร ในกรณีหลังนี้ใช้เวลาการส่งมอบตามที่บันทึกไว้ในการส่งมอบวัตถุอ้างอิงแทน
... แต่เห็นได้ชัดว่าทั้งสองกรณีตั้งค่า "เวลาแก้ไขของแต่ละไฟล์"; จึงไม่ได้เก็บรักษาบันทึกเวลาที่เกิดขึ้นจริงของไฟล์เหล่านั้น!
ดังนั้นเพื่อรักษาเวลาประทับต่อไปนี้เป็น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
... และหวังว่าจะเห็นการประทับเวลาเดียวกัน (สำหรับไฟล์ที่อยู่ภายใต้การควบคุมเวอร์ชัน)
หวังว่านี่จะช่วยใครซักคน
ไชโย!