在运行后台进程时更改分支会发生啥?
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等,脚本可能会创建子进程执行命令)