我认为@Aredridel的帖子最接近,但还有更多内容 - 所以我将在此处添加此内容;问题是,svn
如果你在一个 repo 的子文件夹中,你这样做:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
然后svn
将导出所有受修订控制的文件(它们也可能是新添加的;或修改状态) - 如果您在该目录中有其他“垃圾”(我.svn
这里不计算子文件夹,而是可见的东西,如.o
文件) ,它不会被导出;只有那些由 SVN repo 注册的文件才会被导出。对我来说,一件好事是这个导出还包括尚未提交的本地更改的文件;另一个好处是导出文件的时间戳与原始文件相同。或者,正如svn help export
它所说:
- 从 PATH1 指定的工作副本中导出一个干净的目录树,如果给出,则在修订版本 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 archive 在给定树 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
...并希望看到相同的时间戳(对于那些受版本控制的文件)。
希望这对某人有帮助,
干杯!