From: Igor Djordjevic <email@example.com>
To: Simon Doodkin <firstname.lastname@example.org>
Subject: Re: feature-request: git "cp" like there is git mv.
Date: Mon, 18 Dec 2017 01:28:11 +0100 [thread overview]
Message-ID: <email@example.com> (raw)
On 12/12/2017 11:53, Simon Doodkin wrote:
> please develop a new feature, git "cp" like there is git mv
> tomovefile1 tofile2 (to save space).
> there is a solution in https://stackoverflow.com/a/44036771/466363
> however, it is not single easy command.
While having `git cp` alongside `git mv` would make sense, I`m afraid
that is not what you are really after, nor it would help in your case.
Looking at referenced "Stack Overflow" post, it tries to address
`git blame` not following "file copy", where it does "file rename".
Proposed steps seem to be "solution" from your perspective, and while
that may be absolutely valid and acceptable for your specific case, I
would argue it`s the wrong approach in general - because `git blame`
already supports what you want (just not by default), and making
three additional, unneeded and possibly confusing commits (one being
a merge), just to "bend" `git blame` to fit your (out of line?) usage
expectations doesn`t seem right.
I would say a better direction might be using `git blame` "-C[<num>]"
option, where desired effect is achieved without any artificial
Example being worth more than plain words, I`m providing a script
that demonstrates what I`m talking about :)
 Demo script showing how using (multiple) "-C" option(s), with
specified numeric value, can make `git blame` provide desired
information, recognizing "file copy" operation (line copy, actually,
but that is what we are really interested in, using `git blame`):
--- >8 ---
echo a >A
echo b >>A
echo c >>A
git add A
git commit -m "create file A"
git mv A B
git commit -m "rename file A -> B"
# (A) regular flow
cp B C
git add C
git commit -m "copy file B -> C"
# (B) proposed "solution", https://stackoverflow.com/a/44036771/466363
# git mv B C
# git commit -n -m "rename file B -> C"
# SAVED=`git rev-parse HEAD`
# git reset --hard HEAD^
# git mv B B-temp
# git commit -n -m "rename file B -> B-temp"
# git merge $SAVED # This will generate conflicts
# git commit -a -n --no-edit # Trivially resolved like this
# git mv B-temp B
# git commit -n -m "rename file B-temp -> B"
echo '(1) blames B back to A, as expected:'
git blame -- B
# git blame shows that file B has a history (back to file A)...
echo '(2) blames C only, missing B and A:'
git blame -- C
# ... while file C doesn't have a history
echo '(3) blames C back to A, as expected:'
git blame -C -C3 -- C
# git blame shows that file C has a history (back to file A)
prev parent reply other threads:[~2017-12-18 0:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-12 10:53 feature-request: git "cp" like there is git mv Simon Doodkin
2017-12-13 16:39 ` Johannes Schindelin
2017-12-13 17:21 ` Randall S. Becker
2017-12-16 1:31 ` Jonathan Nieder
2017-12-31 19:11 ` Stefan Moch
2017-12-31 19:11 ` [PATCH 1/2] Add test case for mv --dry-run to t7001-mv.sh Stefan Moch
2017-12-31 19:11 ` [PATCH 2/2] mv: remove unneeded 'if (!show_only)' Stefan Moch
2018-02-07 19:49 ` feature-request: git "cp" like there is git mv Junio C Hamano
2018-02-07 20:27 ` Stefan Beller
2018-03-18 20:09 ` Stefan Moch
2018-03-19 20:03 ` Junio C Hamano
2017-12-18 0:28 ` Igor Djordjevic [this message]
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:
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
* 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.
Code repositories for project(s) associated with this public inbox
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 read-only IMAP folder(s) and NNTP newsgroup(s).