除了主人之外我有两个分支,比如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/submodule1
和path/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)
答案 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
。我刚刚创建了克隆,检查了长寿分支,从不检查克隆中的不同分支。