如何创建一个脚本来添加,提交和逐文件推送一组新的或更改的文件?



我想创建一个shell脚本,add,commitpush新的或更改的文件到存储库。目前,我的脚本是通过逐个文件迭代来实现这一点的,这花费了太多的时间。我的要求仍然是逐个文件执行此操作,但这次我只想迭代新的或更改的文件。

我的shell脚本如下:
#!/bin/sh
CUR_DIR=$(pwd)
PROJECT_DIR="${CUR_DIR}"
for fileToCommit in $(find ${PROJECT_DIR}/* -type f);
do
test -f "$fileToCommit" || continue
printf "%sn" "${fileToCommit}"
git add "${fileToCommit}"
git commit -a -m "[ADD] New ${fileToCommit##*/} File"
git push
done

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

来自git status文档:

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

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

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

"瓷器"这个词是什么意思?意思是在Git中?

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

filesToPush=$(git status --porcelain | awk '{print $2}')
for file in $filesToPush; do
# Your actions.
done

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

如何从命令输出中获得第二列?

试试这个!

for file in $(git ls-files --others)
do
git add $file
git commit -m "adding $file ✅"
git push -u origin main
done

这是一个联机者:

for f in $(git status --porcelain | sed "s/^...//");do git add $f; git commit -sam "commit message - $f";done

最新更新