git:如何轻松判断我是否处于变基过程中
git: how can I easily tell if I'm in the middle of a rebase
我正在写一个 bash 单行代码,我希望每次在 while [ true ]
循环中 运行 git rebase --continue
时自动执行某些操作。当它停止时,如果我还在 rebase,我会做 X,然后我会要求 rebase 再次继续。是否有一个简单的方法可以判断我是否仍在变基?我尝试使用 if [ ! -f .git/REBASE_HEAD ]; then break; fi
但在 rebase 完成后文件仍然存在。我看到 .git/rebase-merge
在变基时存在并在完成后消失。我可以用它作为我的小费吗?
是的,行得通。查看 how git-prompt.sh
does it 以设置您的 PS1
:
if [ -d "$g/rebase-merge" ]; then
__git_eread "$g/rebase-merge/head-name" b
__git_eread "$g/rebase-merge/msgnum" step
__git_eread "$g/rebase-merge/end" total
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
r="|REBASE-m"
fi
else
if [ -d "$g/rebase-apply" ]; then
__git_eread "$g/rebase-apply/next" step
__git_eread "$g/rebase-apply/last" total
if [ -f "$g/rebase-apply/rebasing" ]; then
__git_eread "$g/rebase-apply/head-name" b
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
else
r="|AM/REBASE"
fi
我们可以看到how git-prompt.sh
detects being in a rebase.
if [ -d "$g/rebase-merge" ]; then
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
r="|REBASE-m"
fi
else
if [ -d "$g/rebase-apply" ]; then
if [ -f "$g/rebase-apply/rebasing" ]; then
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
else
r="|AM/REBASE"
fi
elif [ -f "$g/MERGE_HEAD" ]; then
r="|MERGING"
elif __git_sequencer_status; then
:
elif [ -f "$g/BISECT_LOG" ]; then
r="|BISECTING"
fi
并且 __git_sequencer_status
中还有其他状态。
因为Git目录并不总是.git
,脚本使用git rev-parse --git-dir
获取git目录(上面的$g
)。然后从上面就可以看出里面有哪些目录和文件对应了哪些动作。
归根结底,您正在寻找两个目录之一。
$g/rebase-merge
$g/rebase-apply
我正在写一个 bash 单行代码,我希望每次在 while [ true ]
循环中 运行 git rebase --continue
时自动执行某些操作。当它停止时,如果我还在 rebase,我会做 X,然后我会要求 rebase 再次继续。是否有一个简单的方法可以判断我是否仍在变基?我尝试使用 if [ ! -f .git/REBASE_HEAD ]; then break; fi
但在 rebase 完成后文件仍然存在。我看到 .git/rebase-merge
在变基时存在并在完成后消失。我可以用它作为我的小费吗?
是的,行得通。查看 how git-prompt.sh
does it 以设置您的 PS1
:
if [ -d "$g/rebase-merge" ]; then
__git_eread "$g/rebase-merge/head-name" b
__git_eread "$g/rebase-merge/msgnum" step
__git_eread "$g/rebase-merge/end" total
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
r="|REBASE-m"
fi
else
if [ -d "$g/rebase-apply" ]; then
__git_eread "$g/rebase-apply/next" step
__git_eread "$g/rebase-apply/last" total
if [ -f "$g/rebase-apply/rebasing" ]; then
__git_eread "$g/rebase-apply/head-name" b
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
else
r="|AM/REBASE"
fi
我们可以看到how git-prompt.sh
detects being in a rebase.
if [ -d "$g/rebase-merge" ]; then
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
r="|REBASE-m"
fi
else
if [ -d "$g/rebase-apply" ]; then
if [ -f "$g/rebase-apply/rebasing" ]; then
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
else
r="|AM/REBASE"
fi
elif [ -f "$g/MERGE_HEAD" ]; then
r="|MERGING"
elif __git_sequencer_status; then
:
elif [ -f "$g/BISECT_LOG" ]; then
r="|BISECTING"
fi
并且 __git_sequencer_status
中还有其他状态。
因为Git目录并不总是.git
,脚本使用git rev-parse --git-dir
获取git目录(上面的$g
)。然后从上面就可以看出里面有哪些目录和文件对应了哪些动作。
归根结底,您正在寻找两个目录之一。
$g/rebase-merge
$g/rebase-apply