Git:如何将gh-pages分支的内容移动到docs/目录并保留历史记录?

5

Github最近实现了一个功能,使用master中的docs/目录代替gh-pages分支。对于某些用例来说是好事。

情景是一个带有mastergh-pages分支(旧的Github Pages方式)的git仓库,我想将gh-pages分支的所有内容移动到master中的docs/目录中(新的Github Pages方式)。

我知道可以使用git checkout master; git checkout gh-pages -- docs,但这将删除gh-pages文件的历史记录,这是不希望发生的。

我已经尝试过git subtreegit filter-branch,但都没有成功。

因此问题是:是否有一个神奇的一行git命令,可以将另一个分支的内容移到子目录中,并保留历史记录?


我没有意识到这是“新”的酷炫做法? - Akin Hwan
3个回答

2

Git subtrees非常适合此类需求。您提到尝试过“摆弄”它们,但是否尝试过以下操作:

git subtree add --prefix=docs origin gh-pages

请查看我的docs-subtree分支


1

我不知道是否有一行命令,但你可以尝试使用rebase,然后将其合并到master分支中:

git checkout gh-pages
git rebase master
git checkout master
git merge --no-ff gh-pages

我确实尝试过使用git mv * docs/首先迁移,但是gh-pages的分支可以追溯到2011年,合并冲突巨大无比 - IvanSanchez

0

我没有找到任何神奇的一行代码,但是执行 git merge(感谢 @Wikiti 激励我再次尝试该选项)似乎起作用了。

最终我采用的方法并不完美,需要多次运行 git reset

这并不完美,我鼓励任何 Git 专家或 GitLab 员工提出更好的解决方案。 希望这能帮助其他试图摆脱 gh-pages 分支的人,以下是我的做法:

git checkout master
git checkout -b master-docs
git merge gh-pages

# Reset the "master" files so that files deleted are left untouched by the merge
git reset src/
git checkout src/
git reset any-other-master-files
git checkout any-other-master-files

# Manually edit any conflicts, e.g. in .gitignore (with your favourite editor)
vi .gitignore
git add .gitignore
vi any-other-conflicting-files
git add any-other-conflicting-files

# Move the "gh-pages" files into "docs/" directory
mkdir docs
git mv *.md docs/
git mv *.html docs/
git mv _posts docs/
git mv _layout docs/
git mv any-other-gh-pages-files docs/

# Check that everything looks OK, there should be only files added to docs/
# If not, go through last steps again
git status

# Confirm the merge
git commit

# Push to origin
git push -u master-docs

# Go to github, make a pull req from master-docs to master for peer review

结果看起来不错


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接