Answers:
UPDATE:在OP 丹尼尔Stutzbach指出,在评论这个简单的命令git diff-index
为他工作:
git update-index --refresh
git diff-index --quiet HEAD --
(nornagon提到的意见,如果有已经触及文件,但其内容是一样的指数,你需要运行git update-index --refresh
之前git diff-index
,否则diff-index
会错误地报告树是脏)
如果在bash脚本中使用命令,则可以看到“ 如何检查命令是否成功? ”:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
注:如评论由安东尼Sottile
git diff-index HEAD ...
将在没有提交的分支(例如新初始化的存储库)上失败。
我发现的一种解决方法是git diff-index $(git write-tree) ...
并haridsv
指出在评论即git diff-files
上一个新的文件,不检测它作为一个差异。
较安全的方法似乎是先git add
在文件规范上运行,然后再git diff-index
查看运行前是否将任何内容添加到索引中git commit
。
git add ${file_args} && \ git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
而6502在评论中报告:
我碰到的一个问题是,这
git diff-index
将告诉我们,除了文件的时间戳之外,实际上没有任何区别。
运行git diff
一次即可解决问题(令人惊讶的是,git diff
实际上确实更改了沙箱的内容,这意味着.git/index
)
如果git 在docker中运行,也会出现这些时间戳问题。
原始答案:
另请参见“ 使用Git检查脏索引或未跟踪的文件 ”以了解替代方法(如git status --porcelain
)
您可以从撰写本文时所写的新“ require_clean_work_tree
函数 ”中获得启发;)(2010年10月上旬)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}
git diff-index --quiet HEAD
。
HEAD
在工作目录中有一个文件,则可能会失败。更好地使用git diff-index --quiet HEAD --
。
git status --help
指出:-- porcelain 以易于解析的格式为脚本提供输出。这与简短的输出类似,但是无论用户配置如何,在Git版本之间都将保持稳定。有关详情,请参见下文。
虽然其他解决方案非常彻底,但是如果您想要快速又脏的东西,请尝试以下操作:
[[ -z $(git status -s) ]]
它只是检查状态摘要中是否有任何输出。
[[ ... ]]
语法的实际作用吗?我以前从未见过这样的东西。
--porcelain
参数如图所示这里
git status -s -uall
包括未跟踪的文件。
git diff --exit-code
如有任何更改,将返回非零值;git diff --quiet
一样,没有输出。由于您要检查工作树和索引,因此请使用
git diff --quiet && git diff --cached --quiet
要么
git diff --quiet HEAD
任何人都会告诉您是否存在未提交的更改。
git diff --quite HEAD
只会告诉您工作树是否干净,而不是索引是否干净。例如,如果file
在HEAD〜和HEAD之间进行了更改,则git reset HEAD~ -- file
即使在索引中存在分阶段的更改(wt == HEAD,但索引!= HEAD),它也会退出0。
git diff --quiet && git diff --cached --quiet
。
扩展@Nepthar的答案:
if [[ -z $(git status -s) ]]
then
echo "tree is clean"
else
echo "tree is dirty, please commit changes before running this"
exit
fi
$(git status -s "$file")
,然后在else
条款中git add "$file"; git commit -m "your autocommit process" "$file"
git status -s
一个git status --porcelain ; git clean -nd
代替,垃圾目录将在这里也浮出水面,这是不可见的git status
。
正如其他答案中所指出的那样,只要简单地执行以下命令即可:
git diff-index --quiet HEAD --
如果省略最后两个破折号,则如果文件名为,则命令将失败HEAD
。
例:
#!/bin/bash
set -e
echo -n "Checking if there are uncommited changes... "
trap 'echo -e "\033[0;31mFAILED\033[0m"' ERR
git diff-index --quiet HEAD --
trap - ERR
echo -e "\033[0;32mAll set!\033[0m"
# continue as planned...
请注意:此命令将忽略未跟踪的文件。
git add
并git clean
进行救援
我创建了一些方便的git别名来列出未暂存和暂存的文件:
git config --global alias.unstaged 'diff --name-only'
git config --global alias.staged 'diff --name-only --cached'
然后,您可以轻松地执行以下操作:
[[ -n "$(git unstaged)" ]] && echo unstaged files || echo NO unstaged files
[[ -n "$(git staged)" ]] && echo staged files || echo NO staged files
您可以通过在PATH
被调用的某处创建脚本来使其更具可读性git-has
:
#!/bin/bash
[[ $(git "$@" | wc -c) -ne 0 ]]
现在,以上示例可以简化为:
git has unstaged && echo unstaged files || echo NO unstaged files
git has staged && echo staged files || echo NO staged files
为了完整起见,以下是未跟踪和忽略文件的相似别名:
git config --global alias.untracked 'ls-files --exclude-standard --others'
git config --global alias.ignored 'ls-files --exclude-standard --others --ignored'
这是最好,最干净的方法。
function git_dirty {
text=$(git status)
changed_text="Changes to be committed"
untracked_files="Untracked files"
dirty=false
if [[ ${text} = *"$changed_text"* ]];then
dirty=true
fi
if [[ ${text} = *"$untracked_files"* ]];then
dirty=true
fi
echo $dirty
}
git status
是一个“瓷器”命令。不要在脚本中使用瓷器命令,因为它们可以在git版本之间进行更改。而是使用“管道”命令。
git status --porcelain
(这是为此目的–一种可以在脚本中解析的稳定格式),也可以使用-z(以空分隔而不是换行符),您可以对此做一些有用的事情。@ codyc4321 详情请参阅stackoverflow.com/questions/6976473/…–