将文件列表通过管道传输到“git add”

将文件列表通过管道传输到“git add”

我执行了新的克隆,并将工作目录复制/粘贴到克隆的目录中。现在有已更改文件的列表:

$ git status --short | grep -v "??" | cut -d " " -f 3 
GNUmakefile
Readme.txt
base32.h
base64.h
...

当我尝试让 Git 添加它们时,会导致错误(我不关心一次添加 1):

$ git status --short | grep -v "??" | cut -d " " -f 3 | git add
Nothing specified, nothing added.
Maybe you wanted to say 'git add .'?

添加-

$ git status --short | grep -v "??" | cut -d " " -f 3 | git add -
fatal: pathspec '-' did not match any files

--

$ git status --short | grep -v "??" | cut -d " " -f 3 | git add --
Nothing specified, nothing added.
Maybe you wanted to say 'git add .'?

尝试使用交互的从手册页来看,事情似乎变得更加混乱:

$ git status --short | grep -v "??" | cut -d " " -f 3 | git add -i
           staged     unstaged path
  1:    unchanged        +1/-1 GNUmakefile
  2:    unchanged      +11/-11 Readme.txt
  ...

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
Huh (GNUmakefile)?
What now> *** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
Huh (Readme.txt)?

(我已经删除了 Git 弄乱的目录,所以我不想解决这个问题)。

我如何告诉 Git 添加通过管道传输到其中的文件?

答案1

git add期望文件被列为参数,而不是通过管道传输到stdin.尝试一下

git status --short | grep -v "??" | cut -d " " -f 3 | xargs git add

或者

for file in $(git status --short | grep -v "??" | cut -d " " -f 3); do
    git add $file;
done

答案2

我用了

git add `cat filelist`

我只有 100 个文件。 1000秒可能有问题。

但也许不是。使用“-n”进行试运行。

答案3

如果文件已经在索引中(即,当您运行“git status”时,它们显示为“已修改”,而不是未跟踪),那么您可以运行

git commit -am "Useful commit message here"

这会自动添加所有已跟踪但已修改的文件。

答案4

类似于大卫·金的:

git status --short | perl -lane '$F[0] == "M" and print $F[1]' | xargs -n 20 git add

该示例仅查找处于“已修改”状态的文件,并添加它们。为了防止参数列表过长,xargs请使用该-n 20参数将每次调用 git 限制为 20 个文件。

根据需要更改 perl 脚本中的匹配条件。另一个例子:

| perl -lane '$F[0] == "M" and $F[1] =~ m/py$/ and print $F[1]' |

该示例查找修改后的 Python 文件(以 结尾py)。

相关内容