我希望在 pre-commit git hook 中运行脚本,我想让该脚本从 docker 映像中运行。以下是 pre-commit hook 的示例代码:
换句话说,在 Docker 中,
我错过了什么?
# pre-commit hook
#!/bin/bash
repo_root=$(git rev-parse --show-toplevel)
docker run -v ${repo_root}:${repo_root} -w ${repo_root} <my_docker_image> <path_to_my_script.py>
my_script.py
内部运行 git status
来确定在 pre-commit hook 中要处理哪些文件。
问题: 当我运行 git commit --all
时,git status
在 pre-commit hook 中和 docker 容器内不同。例如:
# pre-commit hook
#!/bin/bash
git status
echo "------------------------------------"
repo_root=$(git rev-parse --show-toplevel)
docker run -v ${repo_root}:${repo_root} -w ${repo_root} <my_docker_image> git status
我原以为在Docker容器内运行git commit --all
,然后在其中运行git status
,就可以看到所有已暂存的更改。
然而,在Docker容器内未暂存更改。我之前编写的代码输出如下:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: tools/git-hooks/pre-commit
------------------------------------
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: tools/git-hooks/pre-commit
换句话说,在 Docker 中,
git status
命令不会检测 --all
选项,也就是说更改不会被暂存。我错过了什么?
`repo_root=$(git rev-parse --show-toplevel)` `docker run -v ${repo_root}:${repo_root} -w ${repo_root} alpine/git status`
- user1011113git commit
或git commit --all
时,一些检查脚本(如 linters 等)可以分析 staged 文件,即提交的文件。我希望这些脚本从 Docker 镜像中运行,以确保每个开发人员都拥有相同的环境。使用git commit
没有问题,但是使用git commit --all
时会出现问题,因为--all
选项似乎没有在 docker 容器内反映出来(未暂存的更改未添加到暂存区)。 - user1011113--all
选项会进行一些魔法,并将文件暂存到一个无法访问的单独索引中,但我真的不知道,我不理解 --all 标志发生了什么。 - user1011113