Tôi nghĩ rằng bài đăng của @Aredridel là gần nhất, nhưng có thêm một chút về điều đó - vì vậy tôi sẽ thêm bài này vào đây; điều này là, svnnếu bạn đang ở trong thư mục con của repo và bạn làm:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
sau đó svnsẽ xuất tất cả các tệp nằm dưới sự kiểm soát sửa đổi (chúng cũng có thể được thêm mới; hoặc trạng thái đã sửa đổi) - và nếu bạn có "rác" khác trong thư mục đó (và tôi không đếm các .svnthư mục con ở đây, nhưng có thể nhìn thấy .ocác tệp như tệp) , nó sẽ không được xuất khẩu; chỉ những tệp được đăng ký bởi repo SVN mới được xuất. Đối với tôi, một điều tuyệt vời là việc xuất này cũng bao gồm các tệp có thay đổi cục bộ chưa được cam kết; và một điều tuyệt vời nữa là dấu thời gian của các tệp được xuất giống như tệp gốc. Hoặc, như svn help exportđặt nó:
- Xuất khẩu một cây thư mục sạch từ bản sao làm việc được chỉ định bởi PATH1, tại REV sửa đổi nếu nó được đưa ra, nếu không thì tại LÀM VIỆC, vào PATH2. ... Nếu REV không được chỉ định, tất cả các thay đổi cục bộ sẽ được giữ nguyên. Các tập tin không thuộc kiểm soát phiên bản sẽ không được sao chép.
Để nhận ra rằng gitsẽ không bảo toàn dấu thời gian, hãy so sánh đầu ra của các lệnh này (trong thư mục con của gitrepo bạn chọn):
/media/disk/git_svn/subdir$ ls -la .
... và:
/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... Và trong mọi trường hợp, tôi nhận thấy rằng git archivetất cả các dấu thời gian của tệp lưu trữ đều giống nhau! git help archivenói:
git archive hoạt động khác nhau khi được cung cấp ID cây so với khi được cung cấp ID cam kết hoặc ID thẻ. Trong trường hợp đầu tiên, thời gian hiện tại được sử dụng làm thời gian sửa đổi của mỗi tệp trong kho lưu trữ. Trong trường hợp sau, thời gian cam kết như được ghi trong đối tượng cam kết được tham chiếu được sử dụng thay thế.
... nhưng rõ ràng cả hai trường hợp đều đặt "thời gian sửa đổi của mỗi tệp"; do đó không bảo toàn dấu thời gian thực tế của các tệp đó!
Vì vậy, để bảo toàn dấu thời gian, đây là một bashtập lệnh, thực sự là "một lớp", mặc dù hơi phức tạp - vì vậy bên dưới nó được đăng thành nhiều dòng:
/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 \
)
Lưu ý rằng giả định rằng bạn đang xuất nội dung trong thư mục "hiện tại" (ở trên /media/disk/git_svn/subdir) - và đích bạn đang xuất vào được đặt hơi bất tiện, nhưng nó nằm trong DESTbiến môi trường. Lưu ý rằng với kịch bản này; bạn phải tự tạo DESTthư mục trước khi chạy đoạn script trên.
Sau khi tập lệnh được chạy, bạn sẽ có thể so sánh:
ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB # DEST
... và hy vọng sẽ thấy các dấu thời gian tương tự (đối với các tệp nằm dưới sự kiểm soát phiên bản).
Hy vọng điều này sẽ giúp ai đó,
Chúc mừng!