git commit -am "Commit message" 无法在流浪机器上正常工作



我在Windows 7中使用Git Bash。对于我的项目,我在Windows上安装了VirtualBox和Vagrant。在我的主目录中,有一些项目文件夹,这些文件夹基于 nfs 同步到流浪机器中。所以Vagrant将保持文件同步。

该盒子是一个基于 debian/contrib-jessie64 的 Web 服务器,具有一些配置,如 Git,用于通过 Composer 安装多个软件包。Git 仅用于 BitBucket 目的,因为某些包需要 ssh 权限。但是 Git 本身从来没有被我在盒子里使用过,因为它非常慢。此外,Git 需要监听几个钩子。网络服务器确实安装了PHP和Composer,但我的主机(Windows(没有。我没有在Windows上安装所有东西的原因是在主机和来宾计算机上保持所有版本相同的情况。我确实希望服务器为我做所有php的事情,这很好。

因此,在Windows上使用Git需要在Windows上以及为盒子配置git钩子。所有在 Windows 上侦听更改的钩子都在流浪框中执行相应的钩子。当然,所有参数都是管道。

这是我在 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"

这工作正常。框中的预提交文件正在执行,并触发一个特殊的执行器,该执行器调用 ./vendor/bin/phpcs 文件进行代码嗅探。

我只想在暂存文件上触发代码嗅探规则,因此应嗅探已添加到暂存区域的所有已修改或未跟踪的文件。这也很好用。执行程序使用以下命令准备所有文件:

git -C /home/projects/foo diff --name-only --diff-filter=AM --cached

在 Windows 中,使用git add --all将所需文件添加到暂存区域并提交它们工作正常,预提交钩子会触发触发 CodeSniff 的框中的预提交钩子。

但是使用git commit -am "Foo bar">不能在上面的命令中正常工作。钩子会做出反应,但计算机中的 Executor 命令(尝试获取 --cached 文件(返回一个空集。

我假设在 Windows 上使用 git commit -am 命令后,流浪框的速度不够快,无法将更改的文件移动到暂存区域,或者命令git commit -am甚至不会将文件移动到暂存区域。

你有什么想法吗?

当你使用git commit -a时,Git 会构建一个新的临时索引来保存要提交的文件。 这个新的临时索引的存在是通过环境变量GIT_INDEX_FILE来传达的。

使用ssh在另一台计算机上运行命令时(即使它是 VM,但用于此目的也是另一台计算机(,该另一台计算机不会接收GIT_INDEX_FILE设置,因此它使用正常的日常索引。索引没有变化,因此您看到的行为是正确的:实际上,没有任何内容是阶段性的。

请注意,索引文件的内容在 Windows 和 Linux 上有所不同(Git 存储几乎原始stat系统调用数据(,因此尝试以这种方式在主机之间共享索引文件通常是不明智的。 事实上,Virtualbox共享文件夹有许多...特征?错误?功能不对?无论你想怎么称呼它们,在 Git 环境中表现不佳的东西。 我发现将每个 VM 视为真正独立的机器要可靠得多,尽可能少地使用共享文件夹功能,特别是永远不要使用它来存储正在进行的 Git 工作。

相关内容

最新更新