3

我在 Git GUI 和 TortoiseGit 如何调用 Git 钩子方面看到了一些奇怪的东西。鉴于以下结帐后挂钩,人们会期望 git 执行 powershell 命令并创建文件:

#!/bin/sh
c:/windows/system32/WindowsPowerShell/v1.0/PowerShell.exe -Command "New-Item File.txt -type file"

如果我使用 Git Bash 运行这个钩子,该文件会在我的存储库中创建。如果我使用 Atalassian 的 SourceTree 运行这个钩子,我也会得到文件。当从 TortoiseGit 或 GitGui 调用结帐时,钩子开始表现得很奇怪。既不产生文件。

我已经能够获得钩子(bash)来调用我创建的简单 exe。问题似乎与powershell或我如何调用powershell有关。我曾尝试使用 -Sta、-ExecutionPolicy RemoteSigned 和 -NoProfile 调用 powershell,但在 Git Gui 或 TortoiseGit 中似乎没有任何效果。

对我来说最大的惊喜是钩子不能与 GitGui 一起正常工作。有谁知道这可能是什么原因造成的?

如何重现:

  1. 在Win7上运行
  2. 有 Git-Gui 版本 0.17.GITGUI
  3. 拥有 Git 版本 1.8.3.msysgit.0
  4. 初始化一个新的仓库
  5. 在 .git/hooks 下的新仓库中创建一个名为 post-checkout 的文件
  6. 将以下脚本放入新创建的结帐后挂钩中:

--

#!/bin/sh
c:/windows/system32/WindowsPowerShell/v1.0/PowerShell.exe -Command "New-Item File.txt -type file"

--

  1. 将任何文件添加/提交到您的新仓库
  2. 使用 git bash 在你的新仓库中运行 git checkout master
  3. 查找名为 File.txt 的文件(确认 git bash 正确调用了 powershell)
  4. 删除新文件
  5. 在同一个 repo 中打开 GitGui 或 TortoiseGit 并在 master 上运行 checkout
  6. 查找名为 File.txt 的文件(不存在)

任何帮助,想法?我不了解 TCL,所以我无法真正理解 GitGui 是如何调用钩子的。

4

2 回答 2

1

我尝试了重现并获得相同结果的步骤。将 powershell 路径更改为 /c/... 什么也没做,但我能够使用该start命令调用 PowerShell 脚本。查看 start 文件(C:\Program Files (x86)\Git\bin\start在我的系统上),它似乎只是用以下内容包装了调用:

cmd //c start "$@"

我尝试了几种变体,但似乎无法让 PowerShell 脚本运行以及返回输出(任何控制台/错误消息或退出代码)。

长话短说,如果您只需要确保脚本已运行,您可以使用:

start PowerShell.exe [params]

如果有人对如何获得输出和退出代码有想法,我很想听听。

于 2013-09-04T12:49:44.490 回答
0

我想我以前见过这种情况。在交互式 shell 与由脚本生成的 shell 中,ExecutionPolicy 是不同的。尝试这个:

c:/windows/system32/WindowsPowerShell/v1.0/PowerShell.exe -ExecutionPolicy:Bypass -Command "New-Item File.txt -type file" 
于 2013-09-03T17:24:07.047 回答