4

我有一个 bash 脚本,可以将项目的一些文件添加到 git,然后同步该分支,随着文件数量的增加,我注意到脚本变得慢得多,所以我想知道我是否正在这样做正确的方法。

这是添加文件的脚本部分:

echo "Adding files..."
find . -name '*.js' -exec git add {} \;
find . -name '*.html' -exec git add {} \;
find . -name '*.css' -exec git add {} \;
find . -name '*.py' -exec git add {} \;
find . -name '*.txt' -exec git add {} \;
find . -name '*.jpg' -exec git add {} \;
find . -name '*.sh' -exec git add {} \;

echo "Commit"
git commit -m "'$1'"

我不确定一次调用 find 是否会比使用所有这些单独的命令更快,但我这样做是为了更简单地删除某些类型的文件或添加新文件。

我非常感谢任何提高效率的建议,以不同的方式使用命令或使用不同的命令是完全可以接受的答案。

4

5 回答 5

6

如果 git 支持在一个命令中添加多个文件,您可以做的最简单的事情是使用+后缀 for -exec

find . -name '*.js' -exec git add {} \+

这会收集大量文件并将它们全部传递给一个命令行中的命令。

那么将要执行的是:

git add a.js b.js c.js d.js

代替

git add a.js
git add b.js
git add c.js
git add d.js

如果您正在处理数百或数千个文件,这将在执行时间上产生很大差异。

要将所有文件模式组合成一个find命令,请使用 find 的“或”运算符:

find . \( -name '*.js' -o   \
          -name '*.html' -o \
          -name '*.css' -o  \
          -name '*.py' -o   \
          -name '*.txt' -o  \
          -name '*.jpg' -o  \
          -name '*.sh' \) -exec git add {} +

需要使用\before()来保护它们免受其特殊外壳含义的影响。您同样可以使用引号代替:'(', ')'.

findfind有一些复杂的选项,学习它们并熟悉它们必须费些力气通过 grep 和 awk 等命名。

我目前最喜欢的扫描 maven/subversion java 项目同时忽略无趣文件的模式之一是:

find . \( \( \( -iname .svn -o -iname target -o -iname classes \) -type d -prune -false \) -o \( <your filter expression> \) \) -exec grep -li xxx {} +
于 2012-11-09T23:19:00.960 回答
4
find . \( -name '*.js'   -o \
          -name '*.html' -o \
          -name '*.css'  -o \
          -name '*.py'   -o \
          -name '*.txt'  -o \
          -name '*.jpg'  -o \
          -name '*.sh'   \) -exec git add {} +

这意味着您只扫描一次目录结构,这是加速'multiple finds'的主要方式;您将“多个”替换为“一个”。这+是 POSIX 2008 的补充,find但使其更像是xargs完全独立的。如果它对您不可用,请考虑使用-printand xargs(或者,如果您的名称中可能有空格并且您有 GNU findand xargs,那么-print0and xargs -0,但如果您有它们,您(可能 - 但请参阅评论)有+符号也)。

于 2012-11-10T00:19:02.583 回答
2

如果你

  • 有重击 4
  • 仅按名称搜索(不按其他条件)

你也可以使用它:

shopt -s globstar
git add **/*.{js,html,css,py,txt,jpg,sh}


笔记:

  1. 大括号扩展在文件名扩展之前执行,所以这相当于写

    git add **/*.js **/*.html etc...
    
  2. globstar通过关键字启用递归文件名扩展**

于 2012-11-10T05:28:00.790 回答
2

git add命令可以在没有任何其他 shell 脚本的情况下执行此操作。

git add -- '*.js' '*.html' '*.css' ...
于 2012-11-10T06:29:23.730 回答
1

这可能会更快:

F='\.js$|\.html$|\.css$|\.py$|\.txt$|\.jpg$|\.sh$'
find . | egrep $F | xargs git add

如果您希望文件名中有空格或其他特殊字符,则可以使用它的一些变体。

于 2012-11-09T23:24:25.860 回答