【发布时间】:2019-10-16 17:50:19
【问题描述】:
对于我的工作区环境,我目前正在创建一个脚本,以便在我的开发和发布分支之间轻松切换。不幸的是,repo 并不总是具有相似的分支名称,因此我检查分支是否存在以及分支是否已合并到 master。如果分支还没有合并到master,我知道我有最新的release分支。
set repo_has_changes (git status --porcelain --untracked-files=no)
if test -n $repo_has_changes
echo 'Repo has changes...'
else
git checkout master
for b in $releaseVersions
set branch_on_origin (git branch -r --list origin/$b)
set branch_not_merged_to_master (git branch -r --list --no-merged master origin/$b)
if test -n $branch_on_origin
if test -z $branch_not_merged_to_master
git checkout $b
git pull
break
end
end
end
end
在我的无知中,我以为我存储了 git 命令的结果,并将其存储在一个变量中。我将其解释为字符串。根据fish文档,我可以测试一个字符串是否非零。
-n STRING 如果 STRING 的长度不为零,则返回 true。
此脚本将始终回显“Repo has changes...”,而我 100% 确定它没有更改。 如果我回显 $repo_has_changes 我会看到一个空行。此外,如果我检查字符串的长度(以防字符串返回空格?xD),它也会返回一个空行。所以我假设 $repo_has_changes 是一个字符串可能是错误的。另外我不确定我是否能够以这种方式存储 git 结果。不幸的是,我无法找到一个好的来源。
【问题讨论】:
-
我不使用fish,也无法说出它的特定规则,但是在其他shell中,
if test -n $foo必须拼写if test -n "$foo"如果$foo可以永远是空的,否则你运行test -n而不是test -n <the-empty-string>。除此之外,请参阅git_sh_setup(与 Git 一起分发,但为 sh/bash 编写),因为它具有用于测试索引和工作树清洁度的实用功能。您的测试以查看origin/$b是否存在可以拼写为git rev-parse -q --verify refs/remotes/origin/$b,如果远程跟踪名称存在则退出 0(并打印哈希 ID),否则退出 1。 -
谢谢先生为我解决这个问题:)