我是一名有用的助手,可以为您翻译文本。
我认为@Aredridel的帖子最接近,但还有一些需要补充 - 所以我在这里补充一下; 问题是,在 svn
中,如果您在存储库的子文件夹中,并执行以下操作:
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
然后,
svn
将导出所有处于版本控制下的文件(它们也可能是新添加的或修改过的状态)- 如果该目录中有其他“垃圾”(我不算
.svn
子文件夹在内,而是可见的东西,比如
.o
文件),则不会导出;只有那些由 SVN 仓库注册的文件将被导出。对我来说,一个好处是这种导出还包括具有尚未提交的本地更改的文件;另一个好处是导出文件的时间戳与原始文件相同。或者,正如
svn help export
所说的:
- 从指定路径1的工作副本以修订版 REV(如果给出)或工作副本复制干净的目录树到路径2中。... 如果未指定 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
说:
当给定树ID时,git archive的行为与给定提交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
我希望能够查看相同的时间戳(对于那些处于版本控制下的文件)。希望这能帮到某些人,祝好!
git archive --format zip --output "output.zip" master -0
这个命令会生成一个未压缩的存档文件(-0 是未压缩的标志)。了解更多信息可以查看 http://git-scm.com/docs/git-archive。 - user456814git
,必须在服务器上启用archive
(所以我无法尝试)-从服务器进行“clone --depth 1”的操作仍然可能检索到大小为25 MB的仓库,其中.git
子文件夹单独占用了15MB。因此,我的答案仍然是“不行”。 - sdaaugit checkout-index
。 - nocachegit archive -o latest.zip HEAD
- Evgeni Sergeev