git - 修复 git diff-files 列出 docker 中的所有文件

标签 git docker docker-compose

我正在尝试编写一个脚本,该脚本将使用 git 获取已更改的文件并基于该文件运行命令。我使用 docker-compose 进行开发,这是我正在处理的 repo https://github.com/my-grocery-price-book/www

当从容器内部运行 git diff-files 时,它会列出所有文件。 当从容器外部运行 git diff-files 时,没有文件。

将容器内的 git 升级到最新版本的 2.16 仍然给出相同的输出。

重现步骤:

git clone https://github.com/my-grocery-price-book/www.git
docker-compose run --rm app bash
git diff-files

有人知道我需要做什么才能让 git 在 docker 中正常运行吗?

最佳答案

git diff-files使用哈希算法比较工作树和索引中的文件。工作树中的文件与本地环境中的文件具有相同的哈希值。

我的假设是,当您在 docker 容器中运行 git diff-files 时,由于 docker 卷挂载和输出,索引没有正确反射(reflect)。如果您要在 docker 容器本身中重新克隆整个存储库,则不会发生这种情况。但是,如果您在此之后立即将上下文切换回本地环境并执行 git diff-files,则行为会相反(即,当您在容器外而不是在容器内时,它会列出所有文件容器)。

由于您可能要在 docker 容器和本地环境之间切换,因此您可以执行以下操作:

git diff > /dev/null && git diff-files

使用git diff刷新索引,强制输出到/dev/null,然后git diff-files会反射(reflect)正确输出。您需要在两种环境中都这样做,尤其是从一种环境切换到另一种环境时。如果你觉得整个命令太长,你可能会发现 git aliases有帮助。

关于git - 修复 git diff-files 列出 docker 中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185186/

相关文章:

eclipse - 如何在不提交的情况下使用 git 同步代码?

java - 无法从文件(Docker)打开指定的文件输入流

.net - 如何在 gitlab 中的 .net 解决方案构建管道中运行 git 命令

Docker 只向 localhost 公开一个端口

ruby-on-rails - 从 DBeaver 连接到 Docker 容器中的 PostgreSQL 数据库

r - 如何在Dockerfile中的多个CMD语句之间保留R工作区?

Docker-compose 来自守护进程 : manifest for nginx:1. 15-alphine 的错误响应未找到: list 未知: list 未知

mysql - Docker-Rails 无法连接 localhost mysql 数据库

git - 为什么我使用 Git GUI checkout 时没有列出我的标签?

java - Cygwin "git clone"针对 Ubuntu 10.04.1 给出 "remote end hung up unexpectedly"