Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

[BUG] `watch` rebuilds in an endless loop when the watched path contains `.git`

已关闭 适合新手
#14,362 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@htoyoda18 已经在做这个了。

开始于 2026年10月19日。

  • #14363 来自 @htoyoda18 —— 未关闭

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
70/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
docker, docker-compose, go
领域
devtools

调研方向

从 pkg/compose/watch.go 中添加 .git/ 忽略规则的两个 watch.NewDockerPatternMatcher 调用处开始。检查模式如何与基路径拼接,并将匹配结果与 issue 中描述的完整事件路径进行比较;报告称 **/.git 会停止循环。更新忽略模式并验证:编辑源文件会触发一次重建,而 .git 的更改会被忽略。

由索引模型根据 Issue 内容生成。

描述

kind/bug status/0-triage
Description

With a rebuild watch rule whose path contains the repository's .git directory (for example path: . in a project at the repository root), a single source edit makes docker compose watch rebuild over and over: about 30 rebuilds in 30 seconds, and it never stops. An empty git commit starts the same loop. With a sync rule, git operations sync the .git contents into the container.

.git/ is meant to be always ignored (pkg/compose/watch.go adds a hardcoded .git/ ignore rule), but that rule never matches inside the project. Every build then feeds the loop: buildx reads the git state of the build context for provenance and updates .git while doing so, and watch sees that as a new change.

Expected: changes under .git/ are ignored, so one edit triggers one rebuild.

Workaround: add .git to .dockerignore, or set BUILDX_GIT_INFO=0.

Expected: changes under .git/ inside the watched path are ignored.

Steps To Reproduce
# Dockerfile
FROM alpine
COPY app.txt /app.txt
CMD ["sleep", "infinity"]
# compose.yaml
services:
  app:
    build: .
    init: true
    develop:
      watch:
        - action: rebuild
          path: .
$ echo hi > app.txt
$ git init -q && git add . && git commit -qm init
$ docker compose up -d --build
$ docker compose watch --no-up > /tmp/watch.log 2>&1 &   # log outside the watched path
$ echo x >> app.txt                                      # one edit
$ sleep 30; grep -c Rebuilding /tmp/watch.log
32

With nothing edited, the count stays at 0. With .git in .dockerignore or BUILDX_GIT_INFO=0, one edit gives 1.

Compose Version
Docker Compose version 5.0.1
Also reproduced on main (289d8a037).
buildx v0.30.1-desktop.1 (also v0.24.0)
Docker Environment
Docker Engine 29.1.3 (linux/arm64, Docker Desktop on macOS)
Anything else?

The rule is built with watch.NewDockerPatternMatcher("/", []string{".git/"}) in pkg/compose/watch.go (two places). Patterns are joined to the base path, so this becomes /.git/ and only matches a .git at the filesystem root. Events carry full paths such as /home/me/project/.git/index, so they never match.

With **/.git instead, a local build of main stops the loop: one edit gives 1 rebuild, an empty commit gives 0, and .git is no longer synced. **/.git matches .git and its contents at any depth, but not .gitignore or .github/.

#14217 changes the same ignore set (it excludes the Dockerfile and compose files) but does not touch .git.

主要语言
Go
星标
38.4k
派生
5.9k
平均合并
2 天 1 小时
30 天内合并 PR
70

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

docker/compose 的其他 Issue

查看 docker/compose 的全部 Issue

相似的 Issue

更多 Go Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。