我遇到了与此处提出的问题相同的问题:根目录中的新git存储库包含子目录中的存在存储库
我在这里听到了这个答案:根目录中的新git存储库包含子目录中的存在存储库
现在,gitk --all显示两个历史:一个在当前达到高潮master,一个命名original/refs/heads/master.
我不知道这第二个历史是什么,或者如何从回购中删除它.我的存储库中不需要两个历史记录.
我怎么摆脱它?
重现自己:
mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)
现在我们有原始海报的问题.让我们使用上面链接的答案将git repo的根目录移动到project-root:
git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard
Run Code Online (Sandbox Code Playgroud)
现在,看看我目前的问题:
gitk …Run Code Online (Sandbox Code Playgroud) 通常情况下,您正在编写某种类型的项目,过了一段时间后,很明显项目的某些组件实际上可用作独立组件(可能是库).如果您从早期开始就有这个想法,那么大部分代码都存在于自己的文件夹中.
有没有办法将git项目的子目录之一转换为子模块?理想情况下会发生这样的情况,即该目录中的所有代码都从父项目中删除,并且子模块项目被添加到其中,具有所有适当的历史记录,并且所有父项目提交都指向正确的子模块提交.
基本上我的问题是我不能让git明白这~/main-project/submodule是一个子模块.
我对git子模块有很好的经验:
在我的dotfiles存储库中我创建了.gitmodules文件,~/dotfiles-repo并添加了路径和URL.从那时起,如果我对子模块中的文件进行更改并运行git status,我会得到类似的结果:.vim/bundle/auto-complete (new commits) # in red
我创建了.gitmodules文件~/main-project但是:
~/main-project/submodule,甚至推的变化,我没有得到这样一个类似的反应<submodule> (new commits) # in red中运行时git status在~/main-project.我只是得到了在这些目录中所做的更改当我点击github这些目录的文件夹链接时,它并没有指示我自己的存储库,但我留在同一个存储库中.
~/main-project/submodule到索引中吗?我读过这个问题导致我得到了这个答案,但我不确定是否需要git-subtree.我不想做那些可能难以改变的事情.
编辑:这个建议的重复解决方案也不起作用,我收到了一个错误
Updates were rejected because the remote contains work that you do not have locally.似乎@GabLeRoux几乎告诉我要推 …
我有源代码(大部分的存储库*.php,*.js)和文档文件(主要是*.md,*.html,*.svg)自动从注释生成.所有文档都位于./doc存储库中的单独子目录()中.
一方面,我希望通过跟踪文档,git如果它发生变化,我希望它被提交/推送到服务器,因为它有一个很好的可浏览和最新文档很不方便由github显示.
另一方面,在输出git diff命令期间看到自动生成的文件是非常烦人的.例如,如果在两次提交之间更改了一行源代码,则git diff不仅会输出此单行,而且还会输出所有自动生成的文档,因为整个自动生成的文档已更改.
有没有办法告诉git跟踪文档但diff默认情况下将其排除?如果git将所有文档文件视为blob,我也会对我好.然后,至少diff只会声称文件已更改,但不会显示所有文档行每行.
我已经成功地使用命令(例如这两个示例中概述的方法)将子模块转换为子目录:
挑战是在目录上成功实现此目的,通过每次转换保留其历史记录.
上面列出的这两种方法在一个简单的实验存储库上运行良好,但不处理更复杂的存储库.例如,具有任意提交模式的repo.
执行时问题会暴露出来
git filter-branch --subdirectory-filter <lib-directory> -- --all
尝试将目录(以前是子模块)转换为子模块时.如果我理解正确的话.这是扔:
Rewrite c95281d27e4602e9af50146eefcf7c28f5bb4f35
(2/11)a989b207d3757f9803fd50fa2d77908a4dc1330e
fatal: failed to unpack tree object
c95281d27e4602e9af50146eefcf7c28f5bb4f35:lib/test_submodule
Could not initialize the index`
Run Code Online (Sandbox Code Playgroud)
其中绝对没有类似的结果在线.
据认为,这是由于对INDEX中子模块的重复引用而发生的,因此当转换子模块时,会发生上述错误.
有没有办法执行一个filter-branch允许避免这些早期的子模块引用?
编辑:我再次回来看这个问题,我仍然没有找到解决方法.使用Subdir-> Submodule方法git filter-branch可以正常用于普通目录; 但碰到子模块时会崩溃.git中此部分发生的崩溃:
https://github.com/github/git-msysgit/blob/master/git-filter-branch.sh#L300
但是我对此无法理解.