【问题标题】:Before Archiving check If there is any commit to do?归档前检查是否有任何提交要做?
【发布时间】:2021-12-07 03:52:35
【问题描述】:

在我的 shell 脚本中,我得到了提交数和发布号。 但是我想知道在归档应用程序之前是否有任何方法可以知道是否有任何提交要做,如果有任何提交要做,那么不要归档应用程序显示错误消息。 这是我的shell脚本:

git=$(sh /etc/profile; which git)
number_of_commits=$("$git" rev-list HEAD --count)
git_release_version=$("$git" describe --tags --always --abbrev=0)

target_plist="$TARGET_BUILD_DIR/$INFOPLIST_PATH"
dsym_plist="$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME/Contents/Info.plist"

for plist in "$target_plist" "$dsym_plist"; do
  if [ -f "$plist" ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $number_of_commits" "$plist"
    /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${git_release_version#*v}" "$plist"
  fi
done

【问题讨论】:

  • 能否请您定义您所说的“承诺做”是什么意思?这是否意味着更改提交或提交拉/推?
  • 嗨@Reda,我的意思是更改提交
  • $(sh /etc/profile; which git) 包含一个无用的sh /etc/profile 步骤。它运行一个 shell,它在子 shell 中读取 /etc/profile,然后丢弃读取 /etc/profile 的结果。主 shell 完全丢弃了子 shell 的结果,然后运行which git。所以git=$(which git) 就足够了。但是,which git 只是说明主 shell 将使用哪个 Git,即运行 git 将获得的 Git,因此在此处设置 $git 没有意义。
  • 也许写这个脚本的人意味着运行git=$(. /etc/profile; which git),这将启动一个子shell sources /etc/profile——可能改变shell的@ 987654331@–然后运行 ​​which git 并进行潜在的更改。 将解释设置变量git。但是“修复”这个“错误”可能会破坏事情。您应该确定正确的调用是什么,或者完全删除$git 的使用——只需运行git——或者在此处修复$git 的设置。
  • 嗨@torek 你能解释一下,你的意思是最好删除$git吗?改为添加 git。

标签: xcode git github sh script


【解决方案1】:

我认为您正在寻找的条件是:

git diff --name-status | wc -l

它应该为您提供自上次提交以来更改的文件数。

【讨论】:

  • git diff --quiet 根本不产生任何文本输出,但会设置退出代码(类似于 git diff --exit-code),它为 shell 脚本提供了完全正确的测试类型。这通常优于 git diff ... | wc -l,后者提供了更多信息,但这些信息您将被丢弃:您想要的只是此处的行数是否为零。
  • 然而,一般来说,如果你想知道工作树是否“脏”,要做的就是使用git-sh-setup脚本,它定义了一堆shell函数,例如@987654326 @。您可以检查定义以了解其工作原理,以便更好地进行控制。
  • @torek 使用shell git diff --exit-code,它不起作用,我的意思是即使有提交,它也会存档。
  • @Shallow:您将不得不展示一些代码。要测试 shell 脚本中的退出代码,您可以使用 if$?:如果 program 以状态 0 退出,if program arg1 arg2; then ...; fi 运行 then 部分,而 if ! program args; then ...; fi 运行 then 部分如果有问题的程序以任何非零状态退出。
  • 你也可以使用&&||构造:prog1 && prog2运行prog1,然后,如果它退出零,运行prog2。如果 both 程序退出为零,则整个prog1 && prog2 序列的退出状态为零。同时prog1 || prog2 运行prog1,然后,如果它退出零,则运行prog2。如果设置了-e,这些构造有点棘手。
猜你喜欢
  • 2011-07-16
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
相关资源
最近更新 更多