如何强制子树推送覆盖远程更改?
How do I force a subtree push to overwrite remote changes?
我们使用子树部署 lá this Gist to deploy a subdirectory of our Yeoman 项目。在我们的例子中,分支被称为 production,而不是 gh-pages.
直到昨天 Git 服务器拒绝了命令 git subtree push --prefix dist origin production
,说
! [rejected] 9fe1683aa574eae33ee6754aad702488e0bd37df -> production (non-fast-forward)
error: failed to push some refs to 'git@gitlab.sdstate.edu:web-and-new-media/graduation2015.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart.
如果我在本地切换到生产分支(干净),git pull
returns Your branch is up-to-date with 'origin/production'.
即使我使用 --rebase
选项。
我可以通过我们的 web UI 在服务器上看到生产分支的内容,没有什么不应该的,只是我们 dist
目录的编译输出,就像我一样' d期待。
为此,我似乎应该能够安全地强制覆盖这些文件,但是如何呢? git subtree push
没有 --force
选项。
诀窍是将拆分为强制推送的子树链接起来:
git push origin `git subtree split --prefix dist master`:production --force
我从 Stack Overflow 上 http://clontz.org/blog/2014/05/08/git-subtree-push-for-deployment/, who actually references this 答案的附录中得到了这个。我之前浏览过这个,但 Steve Clontz 的 post 让我很感兴趣。
实际上有一个更简单的解决方案。
来源:https://gist.github.com/cobyism/4730490#gistcomment-2337463
设置
$ rm -rf dist
$ echo "dist/" >> .gitignore
$ git worktree add dist gh-pages
进行更改
$ make # or what ever you run to populate dist
$ cd dist
$ git add --all
$ git commit -m "$(git log '--format=format:%H' master -1)"
$ git push origin production --force
$ cd ..
有一个更简单的解决方案
这对我来说总是有效的。
- 设置一个 bash 脚本来帮助您执行以下操作:
cd dist
git init
git add .
git commit -am "deploy"
git push --force <remote URL> master
rm -rf .git
cd ..
这会在您指定的子目录中创建一个新的 git 存储库,并强制从那里推送所有内容。
- 利润
我刚刚增强了 的答案,添加了通用表达式 <>
以使其更清晰:
git push <remote> `git subtree split --prefix <local-folder> <local-branch>`:<remote-branch> --force
示例值
<remote>
origin
other-origin-name
https://github.com/full-url/of-repo
<local-folder>
相对于 repo root 的本地文件夹路径例如:/dist
(顺便说一句,你需要在 root 中执行此命令)
<remote-branch>
master
any-other-branchname
我们使用子树部署 lá this Gist to deploy a subdirectory of our Yeoman 项目。在我们的例子中,分支被称为 production,而不是 gh-pages.
直到昨天 Git 服务器拒绝了命令 git subtree push --prefix dist origin production
,说
! [rejected] 9fe1683aa574eae33ee6754aad702488e0bd37df -> production (non-fast-forward)
error: failed to push some refs to 'git@gitlab.sdstate.edu:web-and-new-media/graduation2015.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart.
如果我在本地切换到生产分支(干净),git pull
returns Your branch is up-to-date with 'origin/production'.
即使我使用 --rebase
选项。
我可以通过我们的 web UI 在服务器上看到生产分支的内容,没有什么不应该的,只是我们 dist
目录的编译输出,就像我一样' d期待。
为此,我似乎应该能够安全地强制覆盖这些文件,但是如何呢? git subtree push
没有 --force
选项。
诀窍是将拆分为强制推送的子树链接起来:
git push origin `git subtree split --prefix dist master`:production --force
我从 Stack Overflow 上 http://clontz.org/blog/2014/05/08/git-subtree-push-for-deployment/, who actually references this 答案的附录中得到了这个。我之前浏览过这个,但 Steve Clontz 的 post 让我很感兴趣。
实际上有一个更简单的解决方案。
来源:https://gist.github.com/cobyism/4730490#gistcomment-2337463
设置
$ rm -rf dist
$ echo "dist/" >> .gitignore
$ git worktree add dist gh-pages
进行更改
$ make # or what ever you run to populate dist
$ cd dist
$ git add --all
$ git commit -m "$(git log '--format=format:%H' master -1)"
$ git push origin production --force
$ cd ..
有一个更简单的解决方案
这对我来说总是有效的。
- 设置一个 bash 脚本来帮助您执行以下操作:
cd dist
git init
git add .
git commit -am "deploy"
git push --force <remote URL> master
rm -rf .git
cd ..
这会在您指定的子目录中创建一个新的 git 存储库,并强制从那里推送所有内容。
- 利润
我刚刚增强了 <>
以使其更清晰:
git push <remote> `git subtree split --prefix <local-folder> <local-branch>`:<remote-branch> --force
示例值
<remote>
origin
other-origin-name
https://github.com/full-url/of-repo
<local-folder>
相对于 repo root 的本地文件夹路径例如:/dist
(顺便说一句,你需要在 root 中执行此命令)
<remote-branch>
master
any-other-branchname