Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git filter branch--subdirectory filter的对立面是什么?_Git_Version Control_Git Filter Branch - Fatal编程技术网

git filter branch--subdirectory filter的对立面是什么?

git filter branch--subdirectory filter的对立面是什么?,git,version-control,git-filter-branch,Git,Version Control,Git Filter Branch,使用git filter branch--subdirectory filter可以将当前存储库中的子目录转换为自己的存储库。然而,我想做的是一件相反的事情:创建一个存储库,将当前存储库的全部内容作为子目录包含,保持完整的历史记录,就好像它们总是在该子目录中一样。我不想使用子模块,因为我希望该目录是存储库的完整组成部分 背景:我的任务是编写一个简单的脚本,但是任务的范围已经扩大了,所以现在这个脚本变成了一个更大项目中的一个子目录。它也没有独立生活的意义,因此最好是没有子模块的解决方案。最简单的

使用
git filter branch--subdirectory filter
可以将当前存储库中的子目录转换为自己的存储库。然而,我想做的是一件相反的事情:创建一个存储库,将当前存储库的全部内容作为子目录包含,保持完整的历史记录,就好像它们总是在该子目录中一样。我不想使用子模块,因为我希望该目录是存储库的完整组成部分



背景:我的任务是编写一个简单的脚本,但是任务的范围已经扩大了,所以现在这个脚本变成了一个更大项目中的一个子目录。它也没有独立生活的意义,因此最好是没有子模块的解决方案。

最简单的解决方案是不去管历史:只需
git mv
将所有文件放入子目录,提交更改,然后继续生活

如果您真的想假装一直在子目录中执行此工作,最简单的方法是使用以下内容:

git filter-branch --tree-filter "mkdir SUBDIR && bash -c 'git mv -k {,.[!.],..[!.]}* SUBDIR/'"

用目标子目录的名称替换SUBDIR。

您只需将子项目存储库中的文件移动到您希望它们位于更大存储库中的目录中,然后将这些提交合并到最终存储库中即可。这将完全保留两个存储库的历史记录,包括所有提交ID

这可以通过类似以下命令来完成:

cd /path/to/subproject
mkdir subproject_dir
git mv file1 dir2 dir3... subproject_dir
git commit
cd /path/to/main_project
git pull /path/to/subproject

使用
git子树
命令。假设您拥有新的回购协议:

$ cd $ROOT_OF_NEW_REPO
$ git subtree add --prefix=subdirectory/for/old/repo <old git repo URL or checkout> <commit ref>

history
目录将在
头部包含oldrepo文件以及所有历史记录。

Jamey,谢谢,这就是问题:)至于命令行,它几乎可以正常工作,但不幸的是它跳过了隐藏文件。我发现,这也不是现成的。不幸的是,这似乎需要显式运行
bash
(默认情况下
git
是否使用
sh
)。所以我建议对你的答案进行编辑,这会使代码有点膨胀,但也适用于隐藏文件。编辑对我来说很有意义!我打赌你是对的,
git filter branch
确实显式调用了
sh
来运行给定的命令。。。您必须手动移动被忽略的文件。顺便说一句。我也移动了。Gitis。。。
$ git subtree add --prefix=history ~/repos/oldrepo HEAD