Git:如何仅从子目录中复制版本化文件?

时间:2016-08-17 20:41:36

标签: git

问题

我在根:/a:/b下有两个子目录的git repo,我想将:/a中的所有版本化文件复制到{{ 1}}。

基本上,我想做

:/a-copy

没有实际移动git mv a a-copy

更多细节

a中还有很多非版本化文件,我不想删除它们,所以我不能这样做

:/a

我发现的最佳解决方法(在Linux上)是

git clean -df a
cp -r a a-copy

但我希望有一种更简单的方法。

此问题是否与#34; Do a “git export” (like “svn export”)?"?

重复

That question类似,但它仅涵盖复制/导出整个回购的情况。我只想复制部分回购,即mkdir a-copy cd a git ls-files -z | xargs -0 -i cp --parents {} ../a-copy 下的文件,而不是:/a下的文件。在发布此问题之前,我已阅读该问题及其答案。现在我已经回答了我的问题,我发现基于:/b的解决方案也解决了我的问题。

1 个答案:

答案 0 :(得分:3)

您正在寻找的命令序列是:

git archive HEAD a | tar -x -C /tmp
mv /tmp/a b

或等效

cd a
git archive --prefix=b/ HEAD . | tar -x -C ..

git archive使用包含tar子目录中文件的a存档创建。它使用HEAD修订版中的这些文件的版本;如果您愿意,可以指定其他Git版本。

归档文件写入stdout,它通过管道(|)到tar程序,该程序提取文件(-x)并将它们放入目录/tmp-C)。

由于Git将文件与其封闭目录(a)一起添加,tar会将目录a创建为/tmp,并且它包含您的文件想。

您使用mv移动(并重命名)/tmp/a并将其放置在您需要的位置。