Git:如果未跟踪或修改则添加和提交?

时间:2017-05-15 06:37:41

标签: git bash

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

1 个答案:

答案 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,或者可以使用ifelif来解决该问题,如果第一个找到未跟踪的文件,也可以避免冗余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