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

标签 git

问题

我有一个 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/

相关文章:

git - 如何将已删除的文件添加到要提交的索引?

git - git reset 会删除历史记录吗?

git - 配置 git log 默认使用 mailmap

git - 使用 Laravel 的 Envoyer 上传特定的供应商文件

git - 通过 API 在 ECS 上挂载目录?

GitLab.com 下载计数器

git - 由于 Git 是累积的,当 repo 变成 5GB 时如何长期处理?

git - 如何做 "You' 需要使用有效的应用程序密码进行身份验证。”克隆 Bitbucket 存储库时?

java - 无法让 Github 在 intellij 上显示受控版本

git - 在 git 中重新定位功能分支后 merge