git commit -am "Commit message" 不能在 vagrant 机器上正常工作
Posted
技术标签:
【中文标题】git commit -am "Commit message" 不能在 vagrant 机器上正常工作【英文标题】:git commit -am "Commit message" doesn't work properly with vagrant machine 【发布时间】:2018-10-18 09:00:50 【问题描述】:我在 Windows 7 中使用 Git Bash。对于我的项目,我在 Windows 上安装了 VirtualBox 和 Vagrant。在我的主目录中,有一些项目文件夹基于 nfs 同步到 vagrant 机器中。所以 Vagrant 会保持文件同步。
该盒子是一个基于 debian/contrib-jessie64 的网络服务器,具有一些配置,如 Git,用于通过 Composer 安装多个包。 Git 仅用于 BitBucket 目的,因为某些包需要 ssh 权限。但是我从来没有在盒子里使用 Git 本身,因为它非常慢。此外,Git 需要监听几个钩子。网络服务器确实安装了 php 和 Composer,但我的主机 (Windows) 没有。我没有在 Windows 上安装所有东西的原因是在主机和来宾机器上保持所有版本相同的情况。我确实希望服务器为我完成所有的 php 工作,这很好。
因此,在 Windows 上使用 Git 需要在 Windows 和盒子上配置 git 挂钩。所有在 Windows 上监听变化的钩子都在 vagrant box 中执行相应的钩子。当然,所有参数都通过管道传输。
这是我在 Windows 上的预提交文件
#!/usr/bin/env bash
coreDirectory="$HOME/projects/foo"
arguments=""
for arg in "$@"
do
arguments="$arguments $arg"
done
cd $coreDirectory && vagrant ssh -c "cd /home/projects/foo &&
./.git/hooks/pre-commit $arguments"
这很好用。框中的预提交文件正在执行,并触发一个特殊的 Executor,它调用 ./vendor/bin/phpcs 文件进行代码嗅探。
我只想在暂存文件上触发代码嗅探规则,因此所有已添加到暂存区的已修改或未跟踪的文件都应被嗅探。这也很好用。 Executor 使用以下命令准备所有文件:
git -C /home/projects/foo diff --name-only --diff-filter=AM --cached
在 Windows 中,使用 git add --all 将所需文件添加到暂存区域并提交它们可以正常工作,并且预提交挂钩会触发框中的预提交挂钩,从而触发 CodeSniffer。
但是使用 git commit -am "Foo bar" 不能与上面的命令正常工作。钩子会做出反应,但机器内的 Executor 命令会尝试获取 --cached 文件,但会返回一个空集。
我假设在我使用 Windows 上的 git commit -am 命令或命令 git 之后,vagrant box 的速度不足以将更改的文件移动到暂存区commit -am 甚至不会将文件移动到暂存区。
你有什么想法吗?
【问题讨论】:
【参考方案1】:当您使用git commit -a
时,Git 会构建一个新的临时 索引来保存要提交的文件。这个新临时索引的存在是通过环境变量GIT_INDEX_FILE
传达的。
当您使用ssh
在另一台机器上运行命令时(即使它是一台虚拟机,它也是用于此目的的另一台机器),另一台机器不会收到GIT_INDEX_FILE
设置,因此它使用正常的日常索引。 那个索引没有变化,所以你看到的行为是正确的:事实上,没有任何是上演的。
请注意,索引文件的内容在 Windows 和 Linux 上有所不同(Git 存储几乎原始的stat
系统调用数据),因此尝试以这种方式跨主机共享索引文件通常是不明智的。事实上,Virtualbox 共享文件夹有许多...功能?错误?功能不全?不管你想怎么称呼它们,在 Git 环境中表现不佳的事物。我发现将每个 VM 视为真正独立的机器,尽可能少地使用共享文件夹功能,尤其是永远不要使用它来存储正在进行的 Git 工作,这样会更加可靠。
【讨论】:
你好托雷克。谢谢你的评论。不幸的是,机器中的 Vagrant + Server-Puppet + Git 等概念是我工作的这家公司的指导方针。我们的一些开发人员在他们的 PHPStorm IDE 上安装了 CodeSniffer 插件,但我非常喜欢使用 shell,还有其他人也在这样做。所以我需要以某种方式解决这个问题。如果除了在提交之前使用 git add . 之外没有其他可能性,那么我必须将此规则传达给我们的开发人员。 您可以尝试在 ssh 会话中复制GIT_INDEX_FILE
环境变量。看看你的 ssh 是否支持$HOME/.ssh/environment
。
那么,您的意思是,我需要在 Windows 上的挂钩文件中导出变量吗?喜欢export "GIT_INDEX_FILE=???"
不,您需要获取实现 ssh 协议的任何命令,以向 ssh 服务器发送环境设置请求,然后需要 ssh 服务器来支持该请求。如果这两个失败,您将需要编写自己的协议系统,而不是使用 ssh 直接运行 Git,使用 ssh 运行您的通信程序,或者使用您的程序而不是 ssh(但后者假设您知道如何编写安全外壳,或者处于安全不是问题的位置)。
我不使用 Windows,也不知道它的 ssh 客户端有什么功能。这些东西都内置在 Unix/Linux ssh 服务器和客户端中,每个服务器和客户端都可以调整。以上是关于git commit -am "Commit message" 不能在 vagrant 机器上正常工作的主要内容,如果未能解决你的问题,请参考以下文章