I tried to make an alias for committing several different git projects. I tried something like
cat projectPaths | \
xargs -I project git --git-dir=project/.git --work-tree=project commit -a
where projectPaths is a file containing the paths to all the projects I want to commit. This seems to work for the most part, firing up vi in sequence for each project so that I can write a commit msg for it. I do, however, get a msg:
“Vim: Warning: Input is not from a terminal”
and afterward my terminal is weird: it doesn’t show the text I type and doesn’t seem to output any newlines. When I enter “reset” things pretty much back to normal, but clearly I’m doing something wrong.
Is there some way to get the same behavior without messing up my shell?
Thanks!
The problem is that since you’re running xargs (and hence git and hence vim) in a pipeline, its stdin is taken from the output of
cat projectPathsrather than the terminal; this is confusing vim. Fortunately, the solution is simple: add the-oflag to xargs, and it’ll start git (and hence vim) with input from /dev/tty, instead of its own stdin.