我认为@Aredridel的帖子最近,但是还有更多内容-所以我将在此处添加;问题是在中svn
,如果您位于存储库的子文件夹中,则可以执行以下操作:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
然后svn
将导出所有受版本控制的文件(它们也可能是新添加的;或“已修改”状态)-并且如果该目录中还有其他“垃圾”文件(并且我不在.svn
这里计算子文件夹,而是.o
文件之类的可见内容) ,它将不会导出;仅导出由SVN存储库注册的那些文件。对我来说,一个好处是,这个出口还包括与已本地修改的文件不被提交尚未; 另一个好处是,导出文件的时间戳与原始时间戳相同。或者svn help export
说:
- 将PATH1指定的工作副本(如果已提供,版本为REV,否则为WORKING)中的干净副本目录树导出到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
说:
当给定树ID与给定提交ID或标签ID时,git存档的行为有所不同。在第一种情况下,当前时间用作存档中每个文件的修改时间。在后一种情况下,将使用在引用的提交对象中记录的提交时间。
...但是显然这两种情况都设置了“ 每个文件的修改时间”;从而不保留这些文件的实际时间戳!
因此,为了保留时间戳,下面是一个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
...,并希望看到相同的时间戳(对于那些受版本控制的文件)。
希望这对某人有帮助,
干杯!