Bash脚本中最可接受的方式是添加和提交存在且未跟踪或更改的Git存储库文件?
如果文件不存在, git add -A "$dir"
将返回错误,但即使未添加任何内容,也会返回0。然后,后续的git commit -m "Update $dir"
可能会产生错误,无法提交任何内容。我的解决方案似乎很笨重,而且我不确定它是否严格(因为git add …
在git ls-files …
什么都不返回时会永远不会添加任何东西):
[[ -n $(git ls-files --exclude-standard -om $dir) ]] &&
git add -A "$dir" &&
git commit -m "Update $dir"
富勒示例
这个Bash脚本说明了几个函数,允许在初始提交文件时提交不同的提交消息,而不是提交更改。请注意,它不适用于目录,因为commit_if_untracked
将更改已更改的文件以及未跟踪的文件。我当前的用例涉及单个文件(因此下面的-A
是不需要的,并且--exclude-standard
可以说是不需要的,假设我想要一个错误,如果我试图提交一个被忽略的文件),但上面的例子是一个目录就像我可以举一个例子一样精炼!
#!/usr/bin/env bash
main () {
command_that_might_create_or_change_$file
commit_if_untracked "$file" "Initial $file"
commit_if_modified "$file" "Update $file"
}
# Usage: commit_if_* <file> <msg>
commit_if_untracked () {
# [[ $(git ls-files --exclude-standard -o) =~ ($'\n'|^)$1($'\n'|$) ]] || return 0
[[ -n $(git ls-files --exclude-standard -o $1) ]] || return 0
git add -A "$1" && git commit -m "$2"
}
commit_if_modified () {
[[ -n $(git ls-files --exclude-standard -m $1) ]] || return 0
git add -A "$1" && git commit -m "$2"
}
commit_if_untracked_or_modified () {
[[ -n $(git ls-files --exclude-standard -om $1) ]] || return 0
git add -A "$1" && git commit -m "$2"
}
main
答案 0 :(得分:1)
在写这个问题时,我了解到我可以使用git status --porcelain
来略微缩短代码。我仍然希望有更好的方法。
对于第一种情况,只有在需要提交时才添加和提交:
[[ -z $(git status --porcelain) ]] ||
git add -A "$dir" && git commit -m "Update $dir"
根据将要提交的未跟踪文件的存在来处理不同的提交消息:
[[ ! $(git status --porcelain $dir) =~ (^|$'\n')\\?\\? ]] ||
git add -A "$dir" && git commit -m "Initial $dir"
[[ -z $(git status --porcelain) ]] ||
git add -A "$dir" && git commit -m "Update $dir"
请注意,[[ ! … ]] || …
可能会略微简化为[[ … ]] && …
,如果您没有使用set -o errexit
,或者可以使用if
和elif
来解决该问题,如果第一个找到未跟踪的文件,也可以避免冗余git status
调用:
if [[ $(git status --porcelain $dir) =~ (^|$'\n')\\?\\? ]]; then
git add -A "$dir" && git commit -m "Initial $dir"
elif [[ -z $(git status --porcelain) ]]; then
git add -A "$dir" && git commit -m "Update $dir"
fi