【问题标题】:How to create a script to add, commit and push file by file a set of new or changed files?如何创建脚本以逐个文件添加、提交和推送文件一组新的或更改的文件?
【发布时间】:2021-12-11 16:10:55
【问题描述】:

我想创建一个shell 脚本,将addcommitpush 新文件或更改文件添加到存储库。目前,我的脚本通过逐个文件迭代来执行此操作,这需要太多时间。我的要求是仍然逐个文件地执行此文件,但这次我只想迭代新的或更改的文件。

我的shell脚本如下:

#!/bin/sh

CUR_DIR=$(pwd)
PROJECT_DIR="${CUR_DIR}"

for fileToCommit in $(find ${PROJECT_DIR}/* -type f);
do
  test -f "$fileToCommit" || continue
  printf "%s\n" "${fileToCommit}"
  git add "${fileToCommit}"
  git commit -a -m "[ADD] New ${fileToCommit##*/} File"
  git push
done

我怎样才能毫不费力地做到这一点?

【问题讨论】:

  • 为什么要一个文件一个文件?无论如何,即使每次提交一个文件的奇怪要求,您至少可以让推送线脱离循环。仍然会很长,但要快得多。
  • 由于 GitHub 的限制。由于我的项目使用的是小尺寸,但每个存储库有大量文件,我需要一个文件commit。因此,我需要逐个文件进行。
  • 不确定,如果将其缩放为多个文件,它可能会破坏管道。虽然你是对的,但它可能很危险。事实上,在循环线之外获取push 会使事情变得更快。但是,GitHub 对 push 指令的大小有限制。
  • 我只是在这里建议,如果你正在努力克服一些 GitHub 限制,使用一些代码来自动回避该限制,那么你可能设置当 GitHub 关闭那个特殊的解决方法漏洞时,你自己也要为未来的痛苦做好准备。联系 GitHub 支持并了解他们为什么有一些特殊限制以及您可以做些什么来与他们合作 以克服它更有意义,而不是偷偷摸摸地绕过它......

标签: git shell


【解决方案1】:

来自git statusdocumentation

--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.

这是为脚本收集所有已更改/未跟踪/已删除文件的预期方式。它将为您提供易于解析的输出,如果需要,仍然允许您单独处理所有文件。

此外,我认为在 git 术语中研究 porcelain 的含义是明智的。它将帮助您编写跨不同 git 版本的可靠脚本。

What does the term "porcelain" mean in Git?

一个如何使用它的小例子:

filesToPush=$(git status --porcelain | awk '{print $2}')

for file in $filesToPush; do
    # Your actions.
done

此示例认为您希望对git status 返回的所有文件执行相同的操作。如果您希望不同文件状态(已更改、删除、未跟踪)的不同行为,您还需要提取第 1 列并根据此更改行为。

How to get the second column from command output?

【讨论】:

  • 我应该如何更改我的脚本以具有这种行为?
  • @FranciscoMariaCalisto 我添加了一个最小的解释。如果你想要更复杂的行为,我会更多地研究像 awksed 这样的命令。
  • 它工作正常。感谢您的解决方案。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 2022-11-27
  • 2019-08-08
  • 2019-04-05
  • 2019-07-01
  • 2020-03-23
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多