Git 如何创建shell脚本来检查两次提交是否相等

Git 如何创建shell脚本来检查两次提交是否相等,git,bash,shell,Git,Bash,Shell,我正在编写一个小的shell脚本,但语法不正确。它所做的只是通过使用revparse检查提交散列来检查git是否是最新的 因此:(git rev parse HEAD)=$(git rev parse@{u}) 应该告诉我是否需要执行git pull。如果两者返回相同的数字,那么我知道提交哈希是相同的,我不需要做任何事情。但是现在我试图把它放在一个shell脚本中,我遇到了一些问题。以下是我到目前为止的情况: #!/bin/sh export isNew = (git rev-parse HEA

我正在编写一个小的shell脚本,但语法不正确。它所做的只是通过使用revparse检查提交散列来检查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})'

你打算做这样的事吗

if [ $(git rev-parse HEAD) == $(git rev-parse @{u}) ] ; then
    echo "It's different"
fi
Linux:
那里没有“出口”的必要。
您不能单独使用“-eq”并保存其结果。
注意“[”后面的空格和“]”前面的空格,它们是必需的。


吉特:

不匹配的总数并不意味着哪一个在前面。

你打算这样做吗

if [ $(git rev-parse HEAD) == $(git rev-parse @{u}) ] ; then
    echo "It's different"
fi
#!/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
Linux:
那里没有“出口”的必要。
您不能单独使用“-eq”并保存其结果。
注意“[”后面的空格和“]”前面的空格,它们是必需的。


吉特:
不匹配的总数并不意味着哪一个在前面

#!/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=$?
。此外,如果您只打算在此脚本中使用
isNew
,则在您的情况下,
export
可能是不必要的

还有一点,
-eq
测试数值相等性。要测试两个字符串是否相等,您可能需要
=


编辑

但是,对于使用此脚本检查是否需要执行拉操作的意图,仅将
{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
方括号用于测试条件。 请注意,
[$(git rev parse HEAD)=$(git rev parse@{u})]
本身不输出任何内容,而是使用返回代码来指示其结果。 因此,如果希望保留最后执行的命令的返回代码以供以后使用,则需要使用
$?
,而不是直接将带括号的表达式分配给变量,它包含最后执行的命令的返回代码并将其分配给新变量

为了使作业有效,在
=
周围必须没有空格,这就是为什么您应该编写
isNew=$?
而不是
isNew=$?
。此外,如果您只打算在此脚本中使用
isNew
,则在您的情况下,
export
可能是不必要的

还有一点,
-eq
测试数值相等性。要测试两个字符串是否相等,您可能需要
=


编辑

但是,对于使用此脚本检查是否需要执行拉操作的意图,仅将
{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

其他人已经解决了其中一些问题;我将首先添加一些我喜欢与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
时,如果为true,则运行
;然后…
。当设置为false时,如果设置为false,我们将运行
;然后…
。我发现它以后读起来也很好,特别是如果您选择了好的变量名

前面、后面或两者都有 我在上面注意到(根据评论),您可能关心谁“领先”和/或“落后”(上游与当前分支)。请注意,在执行git fetch后,您可能会领先、落后,甚至两者兼而有之。例如,假设在branch
develope
上,您已经提交了3个您没有推送的提交。。。但一位同事做出了两项承诺,这是她推动的。你现在在git状态中是“3领先,2落后”

要获取这些值,请使用
git rev list--count
头部
-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})

(你可以从这些词中省略
,尽管我认为保留它读起来更好一些。)

其他人已经解决了一些问题;我将首先添加一些我喜欢与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
时,如果为true,则运行
;然后…
。当设置为false时,如果设置为false,我们将运行
;然后…
。我发现它以后读起来也很好,特别是如果您选择了好的变量名

前面、后面或两者都有 我注意到上面(根据评论)是y