【问题标题】:git subtree pull says that the working tree has modifications, but git status says it doesn't. What gives?git subtree pull 说工作树有修改,但 git status 说没有。是什么赋予了?
【发布时间】:2010-09-02 02:00:57
【问题描述】:

如果我在我的某个存储库中执行此操作:

git subtree pull --prefix=frameworks/AquaticPrime --squash AquaticPrime

我明白了:

Working tree has modifications.  Cannot add.

如果我这样做(当然是在同一个地方):

git status

我明白了:

# On branch master
nothing to commit (working directory clean)

我不太确定这里发生了什么。 git status 命令暗示我没有修改,所以我假设 git subtree pull 是指与子树相关的不同分支中的修改,但并不完全清楚。

谁能赐教?

【问题讨论】:

  • 快速查看源代码,git-subtree 打印出当git diff-index HEAD --exit-code --quiet 退出“失败”时,即存在更改。如果你运行 git diff-index HEAD 会发生什么?
  • 你也可以试试-d(调试)选项。
  • 当我运行 git diff-index HEAD 时,我得到“致命:不明确的参数 'HEAD':未知修订或路径不在工作树中。”。如果我使用 -d 调试标志,输出类似。所以问题是,为什么 HEAD 是未知的?
  • @BT 我认为您尝试在没有任何提交的情况下在 repo 中使用 git subtree。在这种情况下,应该增强 Git 以提供更有用的错误。我刚刚添加了一个任意提交来启动 repo,然后subtree 在那之后工作
  • 我收到了同样的信息,但我仍然需要提取 master 和我的功能,然后将 master 合并到功能,然后才能从子树中提取最近的提交。

标签: git subtree


【解决方案1】:

我也遇到了同样的问题。 从 GIT 源代码来看,当命令 git diff-index HEAD 返回结果时会引发错误,即使 git status 说工作树是干净的。

为了避免这个错误,就我而言,我重新检查了工作树的当前分支,一切似乎都正常:git checkout <branch>

有点困惑,但如果有人能解释为什么......

【讨论】:

  • 问题的描述很好,但我需要更多信息来实现它......哦,你只是想在主(非子树)中运行“git checkout master”模块。太好了!
  • git checkout 没有解决我的问题,但 git reset 解决了。
【解决方案2】:

git reset --hard 已将其修复给我

来自git reset --help

--hard 重置索引和工作树。此后对工作树中跟踪文件的任何更改都将被丢弃。

【讨论】:

  • 只有在你确定git reset --hard 的作用时才使用,你可能会失去工作。也许git stash save --include-untracked 会更安全? (因为您可以稍后检索隐藏的工作)
【解决方案3】:

我刚遇到这个问题,当我:

  • 添加了一个子树;
  • 意识到,我错误地添加了它(到错误的目录);
  • 用 rm 删除它;
  • 尝试再次导入(到正确的位置)。

尽管puppet diff —— 正确—— 没有显示任何内容,git diff-index HEAD 将我刚刚删除的每个文件都列为“已删除”——即使我从未提交(更不用说推送)任何内容。

我相信,这是 git 中的一个错误(此处使用 2.7.0)...无论是否存在错误,解决方法是切换到 any 其他分支(使用通常的 @987654323 @) 然后回到你的。希望这对某人有所帮助——即使不是最初的提问者。

【讨论】:

    【解决方案4】:

    我现在解决了这个问题。在我看来,我的问题是存储库是全新的:我从未向它提交过任何东西。一旦我向 repo 提交了一个文件,我就能够克服这个错误。

    但是,使用命令git subtree add C:\gitTest\repos\subA -d --prefix subA 我得到了新的错误:

    fatal just how do you expect me to merge 0 trees?

    搞砸了一分钟后,我发现它需要将特定的修订版本传递给它。所以这个命令似乎成功了:

    git subtree add C:\gitTest\repos\subA HEAD -d --prefix subA

    显然你不需要 -d 调试标志。

    【讨论】:

    • 非常感谢非常!!您对空存储库问题的观察结果证明在this question about problems with git tfs subtree add 的上下文中也是有效的。确切的错误消息是fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.,这完全是关于空仓库中 master 上的“缺少 HEAD”。
    【解决方案5】:

    尝试在没有--squash 的情况下拉取,如this stackoverflow question 中所述。

    【讨论】:

    • 谢谢,我觉得不投票/勾选你的答案有点粗鲁,但事实是,我已经很久没有使用子树了,我无法真正测试看看它是否有效的答案!
    • 我有同样的问题,删除 --squash 并不能解决它。
    • 我一开始没有使用壁球。事实上,我什至不知道为什么你会认为它会起作用,因为你发布的 SO 问题并没有询问我们收到的消息..
    【解决方案6】:

    如果您使用的是 Windows,请尝试使用 Git Bash 而不是 PowerShell 或 cmd.exe。 这解决了我的问题。

    【讨论】:

      【解决方案7】:

      我遇到了完全相同的错误。这发生在我的功能分支上。修复:

      1. 从远程功能分支拉到本地
      2. 从主远程拉到本地
      3. 将本地 master 合并到功能分支,提交并推送到远程
      4. 运行 `git subtree pull --prefix MySubdirection https://my/repository/url remotebranch --squash

      我不知道为什么我必须获得 master 并合并到我的功能分支,但这解决了问题。

      【讨论】:

        猜你喜欢
        • 2015-04-20
        • 2011-05-14
        • 2018-10-24
        • 2022-01-20
        • 2012-07-29
        • 1970-01-01
        • 2022-11-22
        • 2013-11-20
        • 1970-01-01
        相关资源
        最近更新 更多