如何在Windows上从“Git bash”中启动的“git gui”中分离?

8
例如:
  1. 我启动“git bash”;
  2. 我导航到特定目录;
  3. 我启动 git gui&
  4. 我关闭控制台窗口或按Ctrl+C。
Git-gui的窗口消失了。即使我使用了 git gui&disown 。 即使在按下Ctrl + C时它不在前景中。
如何正确地从Windows控制台分离 git gui

请考虑添加“msys”标签或类似标签,因为git-bash是相同的重新打包方式,相同的技术适用于您的情况。 - antonio
5个回答

4

为了让其他人受益,我将提供一个更一般的答案,涉及到 git bashmsys bash

解决方案1:不带stdout分离

假设您想要分离应用:

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

如果没有任何你想要检索的信息输出到标准输出(stdout)或标准错误(stderr),则可以在Windows bash shell中使用以下命令:

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

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

正如所述,除非是对话框消息,否则您无法读取应用程序消息,因此此解决方案适用于GUI应用程序。无论如何,如果MyApp.exe是Windows批处理文件,例如MyApp.cmd,它将调用其cmd.exe主机并在其中记录:简而言之,您将读取.cmd/.bat情况下的输出。

类似Mac用户

cmd.exe窗口会一闪而过。如果这对您(的用户)不太酷,请在上面的行中用cmdowNirCmd或类似工具替换cmd

解决方案2:使用stdout分离

如果要读取标准输出和标准错误日志,请使用:

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

如果 MyApp 是一个控制台应用程序,这种方法是推荐的替代方法。现在你得到了一个 "home" 的守护进程,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"

1
虽然这是一个很好而全面的答案,但似乎与关于“git gui”的原始问题没有太多关系。 - jeyk
@jeyk 我已经根据上面的情况调整了答案,实际回答了 git gui 的情况,请查看我的答案 https://dev59.com/-HDYa4cB1Zd3GeqPAGku#27002618 - Stéphane Gourichon

3
以下命令在我的“git bash”中有效:
git gui </dev/null >/dev/null 2>&1 &

我尝试了Ctrl+CCtrl+D和直接关闭控制台窗口,但git gui在所有情况下都保持打开状态。


这很完美,是唯一一个对我有效的。这里发生了什么事,为什么它能够起作用? - Spike
1
@Spike 我相信在Windows下,子进程的输入和输出流会保持与父进程的连接。因此,当父进程退出时,这些流会被关闭,从而杀死子进程。这个命令将标准输入(</dev/null)、标准输出(>/dev/null)和错误流(2>&1)重定向到/dev/null,有效地将它们与父进程分离。这似乎足以在父进程退出时让子进程继续运行。 - jeyk

2

根据Antonio的答案,我已经找到了以下的方法:

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"

有人能理解发生了什么并/或改进吗?


2
如果gitgui已经启动,您可以使用disown命令将作业脱离控制台,以防止其随着控制台的关闭而结束:
disown -h <jobid>

如果您希望在启动Git GUI时执行此操作(因此您只需启动并忘记),则有nohup,但由于某种未知原因,它不包含在MsysGit分发的二进制文件中。


1
我放弃了这个任务(至少在“jobs”命令输出中不再出现)。我输入“exit”。Bash离开,控制台窗口保持打开状态。我关闭控制台窗口。Git-GUI的窗口消失了。 - Vi.
1
另外:我在git bash中放弃了这个任务。它没有出现在“jobs”输出中。但是Ctrl+C仍然会终止git-gui。问题不在于如何在bash中放弃工作,而在于如何在Windows中执行此操作。 - Vi.

1
在Git for Windows 2.25中,只需键入

即可。

git-gui

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接