问题
我有一个 git 存储库,其根目录下有两个子目录 :/a
和 :/b
,我想复制所有版本文件从 :/a
到 :/a-copy
。
基本上,我想做
git mv a a-copy
没有实际移动a
。
更多详细信息
:/a
中还有很多非版本化文件,我不想删除它们,所以我不能简单地这样做
git clean -df a
cp -r a a-copy
我发现的最好的解决方法(在 Linux 上)是
mkdir a-copy
cd a
git ls-files -z | xargs -0 -i cp --parents {} ../a-copy
但我希望有一个更简单的方法。
此问题是否与“Do a “git export” (like “svn export”)?”重复?
That question类似,但它只涵盖复制/导出整个存储库的情况。我只想复制存储库的部分,即 :/a
下的文件,而不是 :/b
下的文件。在发布这个问题之前,我阅读了这个问题及其答案。现在我有了问题的答案,我发现基于 git archive
的其他问题的解决方案也解决了我的问题。
最佳答案
您正在寻找的命令序列是:
git archive HEAD a | tar -x -C /tmp
mv /tmp/a b
或者同等的
cd a
git archive --prefix=b/ HEAD . | tar -x -C ..
git archive
使用包含 a
子目录中的文件创建一个 tar
存档。它使用来自 HEAD
修订版的这些文件的版本;如果您愿意,可以指定其他 Git
修订版。
存档被写入stdout
,并通过管道(|
)到达tar
提取文件 (-x
) 并将其放入目录 /tmp
(-C
) 的程序。
因为 Git
将文件及其封闭目录 (a
) 添加到一起,所以 tar
创建目录 a
进入 /tmp
,它包含您想要的文件。
您可以使用mv
移动(并重命名)/tmp/a
并将其放置在您需要的位置。
关于Git:如何从子目录中仅复制版本控制的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005924/