有些脚本在检查更改时无法正常工作.
我试过这样的:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
Run Code Online (Sandbox Code Playgroud)
是否存在某种布尔检查,如果自上次提交以来发生了更改,或者我如何才能真正测试我的本地存储库是否有新的更改?
我正在为版本创建脚本(我在这里找到的地方)做这一切.
小智 254
使用git status
:
cd /git/directory
if [[ `git status --porcelain` ]]; then
# Changes
else
# No changes
fi
Run Code Online (Sandbox Code Playgroud)
Cas*_*bel 178
你正在做什么几乎可以工作:$CHANGED
如果它是空的你应该引用,并且-z
测试为空,这意味着没有变化.你的意思是:
if [ -n "$CHANGED" ]; then
VN="$VN-mod"
fi
Run Code Online (Sandbox Code Playgroud)
Git的引用GIT-VERSION-GEN
:
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-dirty"
Run Code Online (Sandbox Code Playgroud)
看起来你正在复制它,但你只是忘记了引用的细节.
当然,你也可以这样做:
if git diff-index --quiet HEAD --; then
# No changes
else
# Changes
fi
Run Code Online (Sandbox Code Playgroud)
或者,如果你只关心"有所改变"的情况:
if ! git diff-index --quiet HEAD --; then
VN="$VN-mod"
fi
Run Code Online (Sandbox Code Playgroud)
使用--quiet
Git可以在遇到单个差异时立即停止处理,因此可能不必检查整个工作树.
Arr*_*ter 16
虽然Jefromi的答案很好,但我发布这个仅供参考.
从Git源代码中有一个sh
包含以下内容的脚本.
require_clean_work_tree () {
git rev-parse --verify HEAD >/dev/null || exit 1
git update-index -q --ignore-submodules --refresh
err=0
if ! git diff-files --quiet --ignore-submodules
then
echo >&2 "Cannot $1: You have unstaged changes."
err=1
fi
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
then
if [ $err = 0 ]
then
echo >&2 "Cannot $1: Your index contains uncommitted changes."
else
echo >&2 "Additionally, your index contains uncommitted changes."
fi
err=1
fi
if [ $err = 1 ]
then
test -n "$2" && echo >&2 "$2"
exit 1
fi
}
Run Code Online (Sandbox Code Playgroud)
jto*_*mpl 11
我在 Stack Overflow 上查找了数十个答案,但似乎没有一个能满足我的期望。也就是说,如果出现以下情况,脚本应该出错:
origin/master
(包括:对现有文件的更改;新的未提交和已提交的文件以及文件删除)之间存在任何差异,或者master
有尚未推送到 的提交origin/master
。最终脚本可以这样使用:
if ! (git diff --exit-code origin/master..master > /dev/null) \
|| ! (git diff --exit-code master > /dev/null) \
|| ! [[ -z "$(git status --porcelain)" ]] ; then
echo "Your local repo has some changes that aren't pushed to origin/master ."
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
解释:
git status --porcelain
将呈现尚未提交的文件列表。[[ -z "$(...)" ]]
如果命令返回非空字符串,则用 包裹起来会出错。git diff --exit-code master > /dev/null
master
如果您当前提交的存储库状态与分支不同,将会出错。git diff --exit-code origin/master..master > /dev/null
master
如果您当前的分支与 不同,将会出错origin/master
。例如,如果您想确保您的存储库可以安全地删除/清除,这非常有用。
为什么这样更好?
git diff --exit-code ...
不会出错;git status --porcelain
不会告诉您您有尚未推送到远程的提交。小智 7
OP的问题已经有9年多了。我不知道man git-status
当时说了什么,但现在是这样的:
--porcelain[=<version>]
Give the output in an easy-to-parse format for scripts. This is similar to the
short output, but will remain stable across Git versions and regardless of user
configuration. See below for details.
The version parameter is used to specify the format version. This is optional and
defaults to the original version v1 format.
Run Code Online (Sandbox Code Playgroud)
这表明该--porcelain
参数非常适合测试回购状态的更改。
关于OP的问题,“是否有某种布尔检查自上次提交以来是否有更改,或者我如何真正测试我的本地存储库是否有新更改?”
我认为它本身bash
没有布尔数据类型,但这可能足够接近:
--porcelain[=<version>]
Give the output in an easy-to-parse format for scripts. This is similar to the
short output, but will remain stable across Git versions and regardless of user
configuration. See below for details.
The version parameter is used to specify the format version. This is optional and
defaults to the original version v1 format.
Run Code Online (Sandbox Code Playgroud)
这可以重新转换为脚本的形式,或者在 git repo 文件夹中if-then-else
通过 CLI 按原样执行。否则,请使用带有路径规范的选项到感兴趣的存储库:-C
[ -z "`git status --porcelain`" ] && echo "NULL-NO DIFFS" || echo "DIFFS EXIST"
Run Code Online (Sandbox Code Playgroud)
-u, --untracked-file
选项来避免报告人们希望忽略的文件的状态。请注意,这会带来一个不幸的副作用:新添加的文件也不会显示状态。该选项在某些情况下很有用,但在使用前请仔细考虑。我有类似的问题,但我还要检查添加的文件.所以我做了以下事情:
cd /local/repo
RUN=0
git diff --no-ext-diff --quiet --exit-code || RUN=1
if [ $RUN = 0 ]; then
RUN=`git ls-files --exclude-standard --others| wc -l`
fi
if [ $RUN = 0 ]; then
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
这也有效:
if [ $(git status --porcelain | wc -l) -eq "0" ]; then
echo " Git repo is clean."
else
echo " Git repo dirty. Quit."
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
git status
是你的朋友
转到Git目录git status
以工作:
cd c:/path/to/.git
Run Code Online (Sandbox Code Playgroud)
设置变量以设置工作树,这样就不会出现“此操作必须在工作树中运行”错误:
WORKTREE=c:/path/to/worktree
Run Code Online (Sandbox Code Playgroud)
将git status
输出捕获到Bash变量中
--porcelain
保证标准格式且可解析的用途:
CHANGED=$(git --work-tree=${WORKTREE} status --porcelain)
Run Code Online (Sandbox Code Playgroud)
如果-n(不为null),则有更改。
if [ -n "${CHANGED}" ]; then
echo 'changed';
else
echo 'not changed';
fi
Run Code Online (Sandbox Code Playgroud)