From: Alan Mackenzie <acm@muc.de>
To: git@vger.kernel.org
Subject: Difficulties of scripting git
Date: Sat, 9 Jan 2021 19:14:13 +0000 [thread overview]
Message-ID: <X/oAhdZlLwcFRCrR@ACM> (raw)
Hello, git.
I want to write a bash script (more precisely, correct an existing
script) which uses git, and it is DIFFICULT!!!
I need a git pull in the script. Fine, but how does the script know if
it's worked or not? I couldn't find any description of a return code in
the git-pull man page (or in the git-merge man page).
The big problem is when I have modified, uncommitted files in the target
repo, and those same files are to be updated in commits coming from the
source repo. Sadly, git is unable to merge these changes. It just
fails, putting an error message onto stderr, but doesn't tell the
calling script in any way that I can see.
One idea would be always to call git stash before doing the pull, then
git stash pop afterwards. Trouble is, git stash is unreliable - it
doesn't always add a new stash entry, so the stash pop at the end would
sometimes/often pop off an entry it shouldn't. git stash doesn't have a
--force argument. git stash doesn't set a result code, either, that I
can see. One way around this would be to do
$ git stash list | wc -l
both before and after the git stash and compare the answers, but really?
So, next idea, feed the output from git status --porcelain through grep
before and after the git pull, so as to find out whether there are any
modified files before the git pull (thus making a stash necessary) and
any files with conflicts after the git stash pop. Shouldn't be too
difficult.
Except, how does one recognise a file with conflicts from this git
status output? The man page says that
" For paths with merge conflicts, `X' and `Y' show the modification
states of each side of the merge. For paths that do not have merge
conflicts, `X' shows the status of the index, and `Y' shows the status
of the work tree. For untracked paths, `XY' are `??'. Other status
codes can be interpreted as follows: ...."
I've spent nearly an hour trying to make sense of this bit of man page.
How is one meant to distinguish an XY of a merge conflict from the XY of
an index/work tree entry? I can't find that key bit of information
anywhere.
What am I missing? Why does writing scripts using git have to be so
hard?
--
Alan Mackenzie (Nuremberg, Germany).
next reply other threads:[~2021-01-09 19:21 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-09 19:14 Alan Mackenzie [this message]
2021-01-09 21:42 ` Difficulties of scripting git brian m. carlson
2021-01-09 22:06 ` [PATCH] docs: add description of status output table brian m. carlson
2021-01-10 1:41 ` Junio C Hamano
2021-01-10 1:58 ` brian m. carlson
2021-01-10 12:28 ` Alan Mackenzie
2021-01-10 18:32 ` brian m. carlson
2021-01-10 19:04 ` [PATCH v2] docs: rephrase and clarify the git status --short format brian m. carlson
2021-01-11 20:22 ` Junio C Hamano
2021-01-16 21:45 ` brian m. carlson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=X/oAhdZlLwcFRCrR@ACM \
--to=acm@muc.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).