我想将我的工作git存储库中的远程git存储库合并为其子目录。我希望生成的存储库包含两个存储库的合并历史记录,并且合并到的存储库的每个文件都保留其在远程存储库中的历史记录。我尝试使用How to use the subtree merge strategy中提到的子树策略,但是在遵循该过程之后,尽管生成的存储库确实包含两个存储库的合并历史记录,但来自远程存储库的单个文件没有保留其历史记录(`git log'on他们中的任何一个都只显示一条消息“合并分支...”)。在子目录中合并git存储库
另外我不想使用子模块,因为我不希望两个组合的git存储库再分开。
是否有可能将另一个远程git存储库合并为一个子目录,并将远程存储库中的单个文件保留其历史记录?
非常感谢您的帮助。
编辑: 我目前正在尝试使用git filter-branch重写合并版本库历史记录的解决方案。它似乎工作,但我需要再测试一下。我会回来报告我的发现。
编辑2: 希望我能让自己更清楚我给出了我在git的子树策略中使用的确切命令,这会导致远程存储库文件的历史记录明显丢失。 让A是我目前工作的git repo,B是git repo,我想将它作为子目录并入到A中。它做了以下内容:
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
这些命令后,并进入目录子目录/ Iwant /到/把/ B /中,我看到他们中的任何一个B的所有文件,但git log
却与此提交信息“合并B作为subdir/Iwant/to/put/B/in中的子目录”。它们在B中的文件历史记录丢失。
似乎什么工作(因为我在混帐初学者我可能是错的)如下:
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
上面过滤器分支的命令是从git help filter-branch
拍摄,我在其中只改变了subdir路径。
'gitk'对历史有何说法?我过去成功地使用过git subtree merge。也许你可以揭示你的确切命令?我不确定git-filter-branch是否正确。我可能会建议尝试git-fast-export和git-fast-import来合成一个新的历史记录。 –
在完成子树过程后,'gitk'显示两个在他们的提示上合并的回购和他们的初始提交无关。 (如果我发布gitk的历史视图截图,它会有帮助吗?我可以吗?)不幸的是,如果我在终端'git log'中,远程仓库的单个文件没有保留它们的历史记录。我研究'git-fast-export'和'git-fast-import';我对git很陌生。我将编辑我的问题,以确切地显示我使用git子树的命令。非常感谢您的回复。 –
christosc
@christosc:你的第二种方法非常简单,非常感谢!我只需要改变subdir/Iwant/to/put/B/in /并使其成为一个线索(因为Windows上的msysgit似乎不支持带\的命令行回车): git filter-branch --index-过滤'git ls-files -s | sed“s- \ t \”* - &subdir/Iwant/to/put/B/in/- “| GIT_INDEX_FILE = $ GIT_INDEX_FILE.new git update-index --index-info && mv”$ GIT_INDEX_FILE.new“”$ GIT_INDEX_FILE“'HEAD – gaborous