我有一个很小的shell脚本我写作,但我无法正确使用语法。它所做的只是通过使用rev-parse检查提交哈希来检查git是否是最新的。
所以:(git rev-parse HEAD) == $(git rev-parse @{u})
应该告诉我是否需要git pull
。如果两者都返回相同的数字,那么我知道提交哈希是相同的,我不需要做任何事情。但现在我试图把它放在一个shell脚本中,我有问题。以下是我到目前为止的情况:
#!/bin/sh
export isNew = (git rev-parse HEAD) -eq $(git rev-parse @{u})
if [$isNew -eq 0]; then
echo "its new"
fi
但是我收到以下错误:
$./myscript.sh
./myscript.sh: line 2: syntax error near unexpected token `('
./myscript.sh: line 2: `export isNew = (git rev-parse HEAD) -eq $(git rev-parse @{u})'
答案 0 :(得分:1)
#!/bin/sh
# Test for equality
[ $(git rev-parse HEAD) == $(git rev-parse @{u}) ]
# Assign result to a new variable (0 for true)
isNew=$?
# Then you can check isNew
if [ $isNew -eq 0 ]
then
echo "its new"
fi
方括号用于测试条件。
请注意,[ $(git rev-parse HEAD) == $(git rev-parse @{u}) ]
本身不会输出任何内容,只会使用返回码来指示其结果。
因此,不需要直接将括号表达式赋给变量,而是需要使用$?
,其中包含上次执行的命令的返回码,并将其分配给新变量,如果您想保留它以供以后使用。
为了分配工作,=
周围必须没有空格,这就是为什么你应该写isNew=$?
而不是isNew = $?
。此外,如果您只打算在此脚本中使用export
,则isNew
可能不必要。
还有一点,-eq
测试数字相等。要测试两个字符串是否相等,您可能需要==
。
编辑
但是,至于您打算使用此脚本来检查是否需要执行提取,只需将HEAD
与@{u}
进行比较是不够的,因为@{u}
指的是提示自上次你做git fetch
以来,你的上游分支保持在本地,并且从那时起远程分支提示可能已经改变了,但你只是通过检查@{u}
就不会知道它。
您的脚本不会检测是否有人推送到远程分支,除非您事先获取“刷新”您的存储库。
考虑到这一点,做一些事情可能会更好:
#!/bin/sh
# Fetch the remote branch, tracked by your current local branch.
# This will set FETCH_HEAD to the latest commit in remote branch
# without affecting your working copy.
git fetch
# Test for equality between HEAD and FETCH_HEAD
[ $(git rev-parse HEAD) == $(git rev-parse FETCH_HEAD) ]
# Assign result to a new variable (0 for true)
isNew=$?
# Then you can check isNew
if [ $isNew -eq 0 ]
then
echo "its new"
fi
答案 1 :(得分:1)
其他人已经解决了其中一些问题;我将首先添加一些我喜欢使用的shell变量,后来用于布尔测试。
让我们使用您的设置:
if [ $(git rev-parse HEAD) == $(git rev-parse @{u}) ]; then
upstream_matches_HEAD=true
# more code here as desired
else
upstream_matches_HEAD=false
# more code here if desired, again
fi
# whatever code here
if $upstream_matches_HEAD; then
# still more code
fi
将变量设置为true
时,我们最终会运行if true; then ...
。将其设置为false时,我们最终会运行if false; then ...
。我发现它的读取也很晚,特别是如果你选择了好的变量名。
我注意到上面(根据评论)你可能会关注谁是“前方”和/或“后方”(上游与当前分支)。请注意,在执行git fetch
之后,您可能会领先,落后甚至两者。例如,假设在分支develop
上你已经做了3次你没有推送的提交......但是一个同事做了2次提交,她已经推送了。你现在在git status
条款中“领先3,落后2”。
要获取这些值,请在git rev-list --count
上使用HEAD
- vs - @{u}
:
# find out how many un-pushed commits we have,
# i.e., commits that are on HEAD but not on the upstream
ahead=$(git rev-list --count @{u}..HEAD)
# same for un-merged un-rebased-onto commits: what is
# on the upstream that we don't have?
behind=$(git rev-list --count HEAD..@{u})
(你可以省略这些词HEAD
,虽然我认为保留它会更好一点。)
答案 2 :(得分:0)
你想要这样的事吗?
if [ $(git rev-parse HEAD) == $(git rev-parse @{u}) ] ; then
echo "It's different"
fi
Linux操作系统:
没有必要出口'那里。
你不能使用' -eq'单独并保存其结果。
请注意' ['以及之前的空间,他们是必要的。
Git的方法:
不匹配的总和并不意味着哪一个未来。