filter-branch之后重复提交以移动根目录

时间:2012-02-12 16:09:27

标签: git

我的存储库设置有问题:我在错误的目录中初始化了我的存储库并开始使用它。我已经做了一些分支并再次合并它们。我想保留那段历史。

现在如何:

wrongRootProjectDir/
|
+-.git
|
+-realProjectDir
   |
   +-<Project files>

它应该如何:

realProjectDir
|
+-.git
|
+-<Project files>

所以基本上我想将一个目录的所有内容都移动起来。 wrongRootProjectDir还仅包含.git文件和realProjectDir目录。

我在SO How can I move a directory in a Git repo for all commits?找到了一些可能有办法的提示。我运行git clone oldrepo newrepo来获取备份仓库并运行

git filter-branch --subdirectory-filter realProjectDir -- --all

关于新的回购。它似乎工作,但我已从旧存储库中丢失了我的合并和分支结构。已过滤的repo具有正确的路径,但缺少合并提交。此外,旧的提交仍然存在,因此repo看起来像这样:

(Commit A)
|
(Commit B)
|
(Commit C)
|
(Commit A')
|
(Commit B')
|
(Commit C')

其中A'是新提交。我的多个分支是否存在问题并使用filter-branches?所以现在我每次提交两次,一次使用错误的旧路径,一次使用新路径。

摘要

有没有办法将一个完整的目录树向上移动一层并保留所有分支和合并而不生成双重提交?

更新 我仍然无法保持我的合并提交和正确的分支布局。一切都变成了一连串的承诺。

更新

之前添加了历史记录树:

Commit history before filter-branch

并使用gitk运行filter-branch后:

Commit history after filter-branch

运行此命令时,工作目录是干净的。为了测试一些东西,我使用简单的cp -r将整个目录树复制到另一个目录并在那里进行测试。 filter-branch命令的作用就是它移动子目录,但它仍然会使历史记录变平。据我所知,我没有做过任何太复杂的事情,只是正常的分支和合并。

更新

我为之前的状态显示了错误的图片。我试图转换一个未重写的存储库。

2 个答案:

答案 0 :(得分:1)

带有子目录过滤器的

filter-branch正是执行此操作的工具。这就是它的全部目的。如果你遇到问题,那是因为你做错了,你没有告诉我们。 filter-branch并未压缩历史。您可能正在查看gitk --all并查看重写的历史记录和旧历史记录(它将标记为{{ 1}}) - 在这种情况下,请注意两个历史没有连接。你也可能在过滤器分支之前做了一些事情来搞乱。当你再次尝试时,你是否在一个新的克隆中进行,从你想要的确切原始历史开始?

这是关于最简单的可能示例,证明这完全符合它的工作原理:

original/refs/heads/...

原始参考文件保留在refs / original / refs / ...中,这样如果你搞砸了,你可以回复它们。如果你检查结果,并确定一切都很好,那么你可以删除它们。该联机帮助页中给出的方法是:

git init
mkdir subdir
touch x subdir/a subdir/b subdir/c
git add subdir/a
git commit -m 'a'
git add subdir/b
git commit -m 'b'
git checkout -b foo HEAD^
git add subdir/c
git commit -m 'c'
git checkout master
git merge foo
git add x
git commit -m 'x'
git filter-branch --subdirectory-filter subdir -- --all
# now inspect e.g. with gitk --all

虽然在实践中你也可以git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

答案 1 :(得分:0)

这应该为你做(将realProjectDir更改为该文件夹的名称):

git filter-branch --prune-empty --subdirectory-filter realProjectDir master

Reference