我在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"
这很好。框中的pre-commit文件正在执行,并触发一个特殊的Executor,该Executor调用./vendor/bin/phpcs文件进行代码嗅探。
我只想触发暂存文件上的代码嗅探规则,因此应侦听已添加到暂存区的所有已修改或未跟踪的文件。这也很好。执行器使用以下命令准备所有文件:
git -C /home/projects/foo diff --name-only --diff-filter=AM --cached
在Windows中,使用 git add --all 将所需文件添加到暂存区域中并提交它们可以正常工作,并且pre-commit钩会触发框中的pre-commit钩,从而触发CodeSniffer。< / p>
但是使用 git commit -am“ Foo bar” 不能与上面的命令一起正常工作。钩子会做出反应,但是试图获取--cached文件的计算机中的Executor命令将返回一个空集。
我认为在我在Windows上使用 git commit -am 命令或命令 git后,无业游民的盒子不够快,无法将更改的文件移动到暂存区commit -am 甚至不会将文件移到暂存区域。
您有什么想法吗?
答案 0 :(得分:1)
当您使用1
时,Git会构建一个新的和临时的索引来保存要提交的文件。通过环境变量git commit -a
传达此新临时索引的存在。
当您使用GIT_INDEX_FILE
在另一台机器上运行命令时(即使它是VM,也为此目的是另一台机器),该另一台机器没有收到ssh
设置,因此它使用正常的日常指标。 该索引没有任何变化,因此您看到的行为是正确的:实际上,没有上演任何 。
请注意,索引文件的内容在Windows和Linux上有所不同(Git存储几乎原始的GIT_INDEX_FILE
系统调用数据),因此尝试以这种方式在主机之间共享索引文件通常是不明智的。实际上,Virtualbox共享文件夹具有许多...功能吗?虫子?功能不对?无论您要如何称呼它们,事物在Git环境中的表现都不理想。我发现将每个VM视为真正独立的机器更加可靠,尽可能少地使用共享文件夹功能,尤其是永远不要使用它来存储Git正在进行的工作。