On 01/08/2019 14:25, Alexandr Miloslavskiy wrote:
On 31.07.2019 19:19, Jeff King wrote:
I don't have any real objection to adding stdin support for more
commands. Bu tin the specific case you're discussing, it seems like
using "git update-index" might already solve your problem. It's the
intended plumbing for scripted index updates, and it already supports
receiving paths from stdin.
I have now studied which git commands already use commandline splitting
in our application. For some of them, I didn't find comparable plumbing;
for others, I feel that a lot of new edge cases will arise, and it will
need a lot of testing to make sure things work as expected.
Therefore, for us it would be best if high-level commands also accepted
--stdin-paths. If I develop good enough patches for that, will you
accept them?
We're interested in these high-level commands:
1) git add
2) git rm
3) git checkout
4) git reset
5) git stash
6) git commit
Here's the list of detailed commands and plumbings I found:
01) git add
'git update-index' doesn't seem to be able to skip ignored files.
No but it only takes paths not pathspecs, can you filter out the ignored
paths first? From a UI point of view it would be better not to allow
users to select ignored files if you don't want to be able to add them.
If you want to use a pathspec then you can do 'git ls-files
--exclude-standard -o -z <pathspec ...> | git update-index --add -z --stdin'
git check-ignore --stdin should help if you have a list of paths and you
want to remove the ignored ones (it's not great as it tells you which
ones are ignored rather than filtering the list for you)
02) git add --force
Probably 'git update-index --add --stdin'.
03) git checkout
Probably 'git checkout-index --stdin'
04) git checkout HEAD
Didn't find a plumbing to only affect named paths.
You can use a temporary index and do
GIT_INDEX_FILE=$tmp_index git read-tree HEAD &&
GIT_INDEX_FILE=$tmp_index git checkout-index --stdin &&
rm $tmp_index
05) git checkout --ours
Probably 'git checkout-index --stage=2 --force --stdin'
06) git checkout --theirs
Probably 'git checkout-index --stage=3 --force --stdin'
07) git rm [--force] [--cached]
Probably 'git update-index --force-remove'
Didn't find how to delete files from working tree.
You have to delete them yourself.
08) git reset -q HEAD
Didn't find a plumbing to only affect named paths.
It's a bit of a pain but you can use 'git update-index -q --unmerged
--refresh && git diff-index --cached -z HEAD' to get a list of paths in
the index that differ from HEAD. The list contains the old oid for each
path (see the man page for the format) and you can feed those into 'git
update-index --index-info' to update the index.
09) git add --update
Probably 'git update-index --again --add --stdin'
Not sure that --again is good replacement.
or something like 'git update-index -q --refresh && git diff-files
--name-only -z | git update-index -z --stdin'
10) git stash push [--keep-index] [--include-untracked] [--message]
Didn't find plumbing for stashes.
stashes are just commits really so there are no plumbing commands
specifically related to them.
11) git commit [--allow-empty] [--amend] [--signoff] [--no-verify]
--file=CommitMessage.txt -o
Didn't find a plumbing to only affect named staged paths.
You can use a temporary index, add the files you want to commit with
update-index --stdin and then run 'git commit'
When I've been scripting I've sometimes wished that diff-index and
diff-files had a --stdin option.
Best Wishes
Phillip