【问题标题】:How to detach "git gui" started in "Git bash" on Windows?如何在 Windows 上的“Git bash”中分离“git gui”?
【发布时间】:2013-03-23 17:14:04
【问题描述】:

例如,

  1. 我开始“git bash”;
  2. 我导航到某些目录;
  3. 我开始git gui&;
  4. 我关闭控制台窗口或按 Ctrl+C。

Git-gui 的窗口消失了。即使我使用了git gui&disown。即使我按下 Ctrl+C 时它不在前台。

如何正确地从 Windows 控制台分离git gui

【问题讨论】:

  • 请考虑添加“msys”标签或类似的标签,因为 git-bash 是相同的重新打包并且相同的技术适用于您的情况。

标签: windows git git-bash msys git-gui


【解决方案1】:

在 Git for Windows 2.25 中,只需键入

git-gui

打开当前工作目录的 GUI,完全分离。 (注意连字符)。

【讨论】:

    【解决方案2】:

    以下命令适用于“git bash”:

    git gui </dev/null >/dev/null 2>&1 &
    

    我尝试了 Ctrl+CCtrl+D 并简单地关闭控制台窗口。 git gui 在所有情况下都保持打开状态。

    【讨论】:

    • 这是完美的,是唯一适合我的。这里发生了什么,为什么会起作用?
    • @Spike 我相信在 Windows 下,孩子的输入和输出流以某种方式与父母的保持连接。所以当父母退出时,流被关闭,杀死孩子。此命令将标准输入 (&lt;/dev/null)、标准输出 (&gt;/dev/null) 和错误流 (2&gt;&amp;1) 重定向到 /dev/null,从而有效地将它们与父级分离。这似乎足以让孩子在父母退出时继续运行。
    【解决方案3】:

    根据安东尼奥的回答,我想出了以下配方:

    cmd //c start //D "C:\Program Files\Git\bin" "wish.exe" "C:\Program Files\Git\libexec\git-core\git-gui"
    

    它可以工作,可以通过在 shell 中按 Ctrl-D 来测试。 shell 正常关闭,git gui 继续工作。

    缺点:此方案忽略当前目录,在C:\Program Files\Git\bin目录下打开git gui,不在当前目录下。

    有人可能会争辩说,Windows 上的 git gui 会记住最近的存储库,因此只需单击一下即可。没错,但问题是:如何在当前目录中获得一个分离的git gui...

    我尝试了一些变体来解决这个缺点,但没有一个真正令人满意的。

    下面的人总是问用什么打开git gui。在文件选择器中选择“C:\Program Files\Git\bin\wish.exe”可以,但每次都必须这样做。

    cmd //c start //D "E:\\escapedwindowsstyle\\path\\to\\my\\git\\repo\\" "C:\\Program Files\\Git\\bin\\wish.exe" "C:\\Program Files\\Git\\libexec\\git-core\\git-gui"
    
    cmd //c start "C:\\Program Files\\Git\\bin\\wish.exe" "C:\\Program Files\\Git\\libexec\\git-core\\git-gui"
    

    任何人都可以理解会发生什么和/或改进吗?

    【讨论】:

      【解决方案4】:

      为了其他人的利益,我将给出与git bashmsys bash 相关的更一般的答案。

      解决方案 1:不使用标准输出进行分离

      假设您要分离应用程序:

      "C:\Program Files\MyApp\MyApp.exe"
      

      它不会将您想要检索的任何信息输出到标准输出(或标准错误)。
      在您的 Windows bash shell 中使用:

      cmd //c start //D "C:\\Program Files\\MyApp"  MyApp.exe arg1 arg2 
      

      MyApp 将在单独的窗口中运行,并且关闭调用 bash shell 不会影响它(基本上就像 Linux 守护程序一样)。

      如前所述,您无法阅读应用程序消息,除非它们是对话消息,因此此解决方案适用于 GUI 应用程序。无论如何,如果MyApp.exe 是像MyApp.cmd 这样的Windows 批处理文件,它将调用它的cmd.exe 主机并在那里登录:简而言之,您将读取.cmd/.bat 案例的输出。

      类似 Mac 的用户

      cmd.exe 窗口会瞬间闪出。如果这对您(r 用户)来说不是很酷,请在上面的行中将 cmd 替换为 cmdowNirCmd 或类似的东西。

      解决方案 2:使用标准输出分离

      如果要将日志读取到 stdout 和 stderr,请使用:

      cmd //c start cmd //k  "C:\\Program Files\\MyApp\\MyApp" arg1 arg2 
      

      如果 MyApp 是控制台应用程序,通常建议使用此替代方法。现在你得到一个带有“家”的守护进程。 MyApp 将由第二个 cmd.exe 托管运行,您将在此处看到它的输出。
      对于 GUI 应用程序,您会以两个窗口结束:MyApp 窗口和调用 cmd 窗口。

      在这两种情况下,退出 MyApp 并不意味着关闭 cmd 窗口;而关闭 cmd 窗口只会关闭 MyApp 控制台。

      如果闪烁的一拳打到你,这里你只需要替换第一个cmd,第二个是你的守护进程的可见家。

      解决方案 3:分离以文档为中心的应用程序

      一些文档与一些处理应用程序密切相关,通过类似于 Linux shebang 语法的机制,但基于 Windows 的注册表;因此您无需调用相关应用程序即可打开文档。

      这种行为可以在 bash 中模拟,甚至可以在分离的样式中。

      对于不需要输出到stdout和stderr的应用,打开MyApp.doc:

      cmd //c start //D "C:\\Program Files\\MyApp"  MyApp.exe  "Path\\to\\MyApp.doc"
      

      可以简化为:

      cmd //c start //D "Path\\to" MyApp.doc
      

      对于需要 stdout 和 stderr 输出的应用,

      cmd //c start cmd //k  "C:\\Program Files\\MyApp\\MyApp" "Path\\to\\MyApp.doc"
      

      可以简化为:

      cmd //c start cmd //k  "Path\\to\\MyApp.doc"
      

      【讨论】:

      • 虽然这是一个很好且全面的答案,但它似乎与关于git gui 的原始问题没有太大关系。
      • @jeyk 我已经调整了上面的答案以实际回答git gui 的情况,请参阅我的答案stackoverflow.com/a/27002618/1429390
      【解决方案5】:

      如果 gitgui 已经启动,你可以disown 作业,这样它就不会以控制台结束:

      disown -h <jobid>
      

      如果您想在启动 Git GUI 时执行此操作(所以您只需启动并忘记)有 nohup 但由于未知原因它不在 MsysGit 分发的二进制文件中

      【讨论】:

      • 我不承认这份工作(至少它不再出现在jobs 命令输出中)。我输入exit。 Bash 离开,控制台窗口保持打开状态。我关闭控制台窗口。 Git-GUI 的窗口消失了。
      • 另外:我不承认 git bash 的工作。它未在jobs 输出中列出。但是 Ctrl+C 仍然会杀死 git-gui。问题不是如何在 bash 中放弃工作,而是如何在 Windows 中完成。
      猜你喜欢
      • 1970-01-01
      • 2020-09-21
      • 2013-01-05
      • 2014-11-04
      • 2018-04-17
      • 2021-05-28
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多