Git子树推送总是失败

Posted

技术标签:

【中文标题】Git子树推送总是失败【英文标题】:Git subtree push always fails 【发布时间】:2013-01-26 05:13:11 【问题描述】:

尝试使用 git subtree 跨多个项目共享公共库文件。这是我一直遇到的问题。

1) 添加子树,以便我的项目的“lib”子目录来自 lib-dk 存储库。

$ git subtree add --prefix=lib --squash git@bitbucket.org:dwknight/lib-dk.git master

2) 更改“lib”中的文件

3) 向主项目 repo 提交更改

$ git commit -am "update project"

4) 将更新推送到主项目仓库

$ git push origin master

5) 将“lib”中的更改推送回“lib-dk”repo

$ git subtree push --prefix=lib git@bitbucket.org:dwknight/lib-dk.git master
git push using:  git@bitbucket.org:dwknight/lib-dk.git master
To git@bitbucket.org:dwknight/lib-dk.git
 ! [rejected]        f455c24a79447c6e3fe1690f5709357b7f96828a -> master (non-fast-forward)
error: failed to push some refs to 'git@bitbucket.org:dwknight/lib-dk.git'
hint: Updates were rejected because the tip of your current branch is behind its remote counterpart. Merge the remote changes (e.g. 'git pull') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

6) 即使 lib-dk 存储库中没有任何更改,我也会收到此拒绝。当我尝试拉动时,它的行为就像有东西一样,但我可以通过拉动进行更新。推送仍然被拒绝。

【问题讨论】:

我没有使用subtree 命令的经验,但--squash 操作看起来像rebase 选项。它有什么作用?如果它以某种方式修改分支历史记录,则可能会导致此问题。 【参考方案1】:

当我在没有--squash 选项到git subtree add 的情况下尝试此操作时,它可以工作。我认为,正如评论者所建议的那样,--squash 正在以一种无益的方式摆弄历史。

【讨论】:

【参考方案2】:

您可能需要使用git add -A . 然后git commit 而不是git commit -am <message>

因为-A in git-add 会这样做:

   -A, --all, --no-ignore-removal
       Update the index not only where the working tree has a file matching <pathspec> but also where the
       index already has an entry. This adds, modifies, and removes index entries to match the working
       tree.

       If no <pathspec> is given when -A option is used, all files in the entire working tree are updated
       (old versions of Git used to limit the update to the current directory and its subdirectories).

另一方面,git-commit 中的 -a 可以(手册页没有提供太多细节):

   -a, --all
       Tell the command to automatically stage files that have been modified and deleted, but new files
       you have not told Git about are not affected.

this 可能会有所帮助。作者明确调用了git add -A .

【讨论】:

【参考方案3】:

如果您在添加子树时使用了--squash,则必须在推送之前执行git subtree pull --prefix=prefix remote branch --squash

【讨论】:

以上是关于Git子树推送总是失败的主要内容,如果未能解决你的问题,请参考以下文章

由于 ssh 密钥,Git 推送失败:主机密钥验证失败。从码头工人内部

git 错误:gnutls_handshake() 推送失败

推送通知:我几乎总是得到“连接失败”,但它工作了几次

Git 强制推送后 Xcode 持续集成机器人失败

解决Git推送时密码认证失败

mvn 发布:准备在 git 推送操作时失败?