git状态显示令人困惑的结果

时间:2017-08-17 03:03:56

标签: git

除了主人之外我有两个分支,比如BR1和BR2。现在,我做了以下

git checkout BR1
git submodule add <submodule1_repo_url> path/to/submodule1
git submodule add <submodule2_repo_url> path/to/submodule2
git add path/to/submodule1
git add path/to/submodule2
git commit -m "Some commit msg"

当我现在执行git status时,我看到我的更改已提交,并且没有任何内容可以提交。

现在,当我切换到BR2并执行git status时,我发现path/to/submodule1path/to/submodule2显示为未跟踪的文件。关键是我在BR1中添加了这些子模块。为什么他们在BR2中显示为未跟踪,如何确保他们不会在BR2中未跟踪,因为我不想在BR2下提交这些子模块。

任何帮助都将不胜感激。

修改: BR1上git status的输出

On branch BR1
nothing to commit, working tree clean

BR2上git status的输出

On branch BR2
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    path/to/submodule1/
    path/to/submodule2/

nothing added to commit but untracked files present (use "git add" to track)

2 个答案:

答案 0 :(得分:2)

切换分支时,

git不会删除子模块目录的内容。它们显示为未跟踪,因为您尚未将它们添加到BR2。你可以放心地忽略它们。

您只看到顶级子模块目录而不是其内容,因为它们是git存储库(它们包含.git目录),因此git在理论上忽略了它们的内容,您不会尝试直接添加它在任何情况下都到父存储库。

答案 1 :(得分:1)

如果您有一些具有不同子模块集的分支,则可能有两种方法来处理它们。

变体1:处理子模块的post-checkout钩子。像这样的东西(我真的有这样的钩子):

#!/bin/sh

# post-checkout hook that switches submodules

prev_HEAD="$1"
new_HEAD="$2"
new_branch="$3"

if [ "$new_branch" = 1 ]; then
   if ! cat .gitmodules | grep -Fq SUBMODULE1; then
      rm -rf SUBMODULE1 SUBMODULE2
   fi

   git submodule update
fi

exit 0

变式2:工作树。我的git有点旧,所以我不使用git worktree。我刚刚创建了克隆,检查了长寿分支,从不检查克隆中的不同分支。