在运行后台进程时更改分支会发生啥?

Posted

技术标签:

【中文标题】在运行后台进程时更改分支会发生啥?【英文标题】:What happens when you change branches while running a background process?在运行后台进程时更改分支会发生什么? 【发布时间】:2021-10-29 03:46:12 【问题描述】:

假设我在分支 main 的同一个 git 存储库中打开了两个 bash 终端。

在其中,我启动了一些需要一段时间才能运行的进程,每 2 秒将结果存储在子目录 /data 中。

然后,在另一个窗口中,我调用git checkout otherbranch 更改分支。

第一个窗口是否会继续第一个分支上的其余过程,将所有结果存储在main 上的/data,然后在完成时切换分支?还是会将结果的第一块写入main 上的/data,而将其他结果写入otherbranch 上的/data

【问题讨论】:

Git 在git checkout otherbranch 期间不向rm -rf ./data 承诺not(视情况而定)。如果这样做,您的输出文件可能会丢失。 Git 的结帐代码为了 speed 的目的而努力尽可能少地执行文件系统操作,因此取决于哪些文件(如果有),它需要在@987654334 中替换 @,你可能会摆脱这个。简短的回答是:为了安全,不要这样做。 Two related 问题... 【参考方案1】:

第一个窗口是否会继续第一个分支上的其余过程,将所有结果存储在main 上的/data 中,然后在完成时切换分支?

是的,在第一个终端启动的进程将继续。但是,根据存储在 /data 中的文件是否之前被 Git 跟踪,会发生以下两种情况之一:

    如果文件是新的,它们将在工作目录中显示为未跟踪。 如果文件被跟踪,如果这些文件在otherbranch 中有冲突的更改,Git 可能会拒绝切换分支。如果没有,它们只会在工作目录中显示为已修改

无论如何,重要的是要指出 Git 不会将文件存储在分支中,而是存储在单个提交引用的 tree structures 中。这意味着/data 中的文件在您提交之前不会成为任一分支的一部分。

【讨论】:

以上是关于在运行后台进程时更改分支会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

linux shell脚本执行命令时创建子进程问题(特定的情况,例如后台运行管道分支或子shell等,脚本可能会创建子进程执行命令)

linux shell脚本执行命令时创建子进程问题(特定的情况,例如后台运行管道分支或子shell等,脚本可能会创建子进程执行命令)

Linux后台进程

在网站中运行后台进程

当您在 Linux 中更改进程所有权 (uid/gid) 时,已打开的文件会发生啥情况?

Linux中从后台启动进程,应在命令结尾处加上啥符号