Re: Support for --stdin-paths in commit, add, etc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux