git commit -am "Commit message" 无法在 vagrant 机器上正常工作
git commit -am "Commit message" doesn't work properly with vagrant machine
我在 Windows 中使用 Git Bash 7. 对于我的项目,我在 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"
这很好用。框中的预提交文件正在执行并触发一个特殊的执行器调用./vendor/bin/phpcs文件进行代码嗅探。
我只想触发暂存文件的代码嗅探规则,所以应该嗅探所有已添加到暂存区的已修改或未跟踪的文件。这也很好用。执行器使用以下命令准备所有文件:
git -C /home/projects/foo diff --name-only --diff-filter=AM --cached
在 Windows 中使用 git 添加所需的文件到暂存区并提交它们正常工作并且预提交挂钩触发在触发 CodeSniffer 的框中预提交挂钩。
但是使用 git commit -am "Foo bar" 不能正常使用上面的命令。钩子反应但是机器内的执行器命令,它试图获取 --cached 文件,returns 一个空集。
我假设在我使用 git commit -am 命令后,vagrant box 的速度不够快,无法将更改的文件移动到暂存区在 Windows 或命令 git commit -am 上甚至不会将文件移动到临时区域。
你有什么想法吗?
当您使用 git commit -a
时,Git 构建一个 新的临时 索引来保存要提交的文件。这个新的临时索引的存在是通过环境变量 GIT_INDEX_FILE
.
传达的
当您在另一台机器上使用 ssh
到 运行 命令时(即使它是虚拟机,它是用于此目的的另一台机器),那台机器不会收到 GIT_INDEX_FILE
设置,所以它使用正常的日常索引。 索引没有任何变化,因此您看到的行为是正确的:事实上, 没有上演任何内容。
请注意,索引文件的内容在 Windows 和 Linux 上不同(Git 存储近乎原始的 stat
系统调用数据),因此通常不明智尝试以这种方式跨主机共享索引文件。事实上,Virtualbox 共享文件夹有一些... 功能?错误?缺陷?不管你怎么称呼它们,事物 在 Git 环境中表现不佳。我发现将每个 VM 视为真正独立的机器更可靠,尽可能少地使用共享文件夹功能,尤其是从不使用它来存储正在进行的工作 Git.
我在 Windows 中使用 Git Bash 7. 对于我的项目,我在 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"
这很好用。框中的预提交文件正在执行并触发一个特殊的执行器调用./vendor/bin/phpcs文件进行代码嗅探。
我只想触发暂存文件的代码嗅探规则,所以应该嗅探所有已添加到暂存区的已修改或未跟踪的文件。这也很好用。执行器使用以下命令准备所有文件:
git -C /home/projects/foo diff --name-only --diff-filter=AM --cached
在 Windows 中使用 git 添加所需的文件到暂存区并提交它们正常工作并且预提交挂钩触发在触发 CodeSniffer 的框中预提交挂钩。
但是使用 git commit -am "Foo bar" 不能正常使用上面的命令。钩子反应但是机器内的执行器命令,它试图获取 --cached 文件,returns 一个空集。
我假设在我使用 git commit -am 命令后,vagrant box 的速度不够快,无法将更改的文件移动到暂存区在 Windows 或命令 git commit -am 上甚至不会将文件移动到临时区域。
你有什么想法吗?
当您使用 git commit -a
时,Git 构建一个 新的临时 索引来保存要提交的文件。这个新的临时索引的存在是通过环境变量 GIT_INDEX_FILE
.
当您在另一台机器上使用 ssh
到 运行 命令时(即使它是虚拟机,它是用于此目的的另一台机器),那台机器不会收到 GIT_INDEX_FILE
设置,所以它使用正常的日常索引。 索引没有任何变化,因此您看到的行为是正确的:事实上, 没有上演任何内容。
请注意,索引文件的内容在 Windows 和 Linux 上不同(Git 存储近乎原始的 stat
系统调用数据),因此通常不明智尝试以这种方式跨主机共享索引文件。事实上,Virtualbox 共享文件夹有一些... 功能?错误?缺陷?不管你怎么称呼它们,事物 在 Git 环境中表现不佳。我发现将每个 VM 视为真正独立的机器更可靠,尽可能少地使用共享文件夹功能,尤其是从不使用它来存储正在进行的工作 Git.