Git工作树执行git status显示内部文件,是否操作有误?
Git工作树中
git status显示Git内部文件的问题 在使用Git工作树时,在已检出分支执行git status命令,会看到HEAD、FETCH_HEAD、index.lock、ORIG_HEAD、commondir、gitdir、index、COMMIT_EDITMSG、logs/这类Git内部文件被标记为未跟踪文件。
复现步骤
$ git clone --bare https://github.com/octocat/Spoon-Knife $ cd Spoon-Knife.git $ git worktree add -B main worktrees/main main $ cd worktrees/main $ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) HEAD ORIG_HEAD commondir gitdir index logs/ nothing added to commit but untracked files present (use "git add" to track)
疑问
这些Git内部文件难道不应该被git status自动隐藏吗?是否存在操作失误?
临时解决方法
已将这些文件添加到myrepo.git\info\exclude中,但感觉本无需这么操作。
原因说明
这是从**裸仓库(bare repository)**创建工作树导致的特殊场景:
- 正常非裸仓库的工作区中,Git内部文件(如HEAD、index等)都存放在
.git目录下,不会暴露在工作区根目录,因此不会被git status检测为未跟踪文件。 - 而裸仓库本身没有工作区,当你在裸仓库目录下执行
git worktree add创建工作树时,Git会将这些内部文件直接放在工作树的根目录下,且不会自动配置忽略规则,所以git status会把它们识别为未跟踪文件。
你的操作本身没有失误,这是Git在裸仓库下使用工作树的预期行为之一。
更合适的解决方式
你可以选择两种方式处理:
- 针对单个工作树:在工作树根目录创建
.gitignore文件,添加以下规则:
HEAD ORIG_HEAD commondir gitdir index logs/ FETCH_HEAD index.lock COMMIT_EDITMSG
- 全局生效(针对该裸仓库的所有工作树):在裸仓库的
info/exclude文件中添加上述规则,和你当前的临时方法一致,这确实是当前场景下的必要操作。
内容的提问来源于stack exchange,提问作者Cesc
相关产品推荐
相关产品推荐

