我执行了新的克隆,并将工作目录复制/粘贴到克隆的目录中。现在有已更改文件的列表:
$ 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
)。