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à, svn
nế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 đó svn
sẽ 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 .svn
thư mục con ở đây, nhưng có thể nhìn thấy .o
cá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 git
sẽ 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 git
repo 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 archive
tất cả các dấu thời gian của tệp lưu trữ đều giống nhau! git help archive
nó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 bash
tậ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 DEST
biến môi trường. Lưu ý rằng với kịch bản này; bạn phải tự tạo DEST
thư 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!