提交 c51f6cee 编写于 作者: E Erick Mattos 提交者: Junio C Hamano

commit -c/-C/--amend: reset timestamp and authorship to committer with --reset-author

When we use -c, -C, or --amend, we are trying one of two things: using the
source as a template or modifying a commit with corrections.

When these options are used, the authorship and timestamp recorded in the
newly created commit are always taken from the original commit.  This is
inconvenient when we just want to borrow the commit log message or when
our change to the code is so significant that we should take over the
authorship (with the blame for bugs we introduce, of course).

The new --reset-author option is meant to solve this need by regenerating
the timestamp and setting the committer as the new author.
Signed-off-by: NErick Mattos <erick.mattos@gmail.com>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 c8a58ac5
......@@ -9,7 +9,7 @@ SYNOPSIS
--------
[verse]
'git commit' [-a | --interactive] [-s] [-v] [-u<mode>] [--amend] [--dry-run]
[(-c | -C) <commit>] [-F <file> | -m <msg>]
[(-c | -C) <commit>] [-F <file> | -m <msg>] [--reset-author]
[--allow-empty] [--no-verify] [-e] [--author=<author>]
[--cleanup=<mode>] [--] [[-i | -o ]<file>...]
......@@ -69,6 +69,11 @@ OPTIONS
Like '-C', but with '-c' the editor is invoked, so that
the user can further edit the commit message.
--reset-author::
When used with -C/-c/--amend options, declare that the
authorship of the resulting commit now belongs of the committer.
This also renews the author timestamp.
-F <file>::
--file=<file>::
Take the commit message from the given file. Use '-' to
......
......@@ -51,7 +51,7 @@ static const char *template_file;
static char *edit_message, *use_message;
static char *author_name, *author_email, *author_date;
static int all, edit_flag, also, interactive, only, amend, signoff;
static int quiet, verbose, no_verify, allow_empty, dry_run;
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
static char *untracked_files_arg;
/*
* The default commit message cleanup mode will remove the lines
......@@ -91,8 +91,9 @@ static struct option builtin_commit_options[] = {
OPT_FILENAME('F', "file", &logfile, "read log from file"),
OPT_STRING(0, "author", &force_author, "AUTHOR", "override author for commit"),
OPT_CALLBACK('m', "message", &message, "MESSAGE", "specify commit message", opt_parse_m),
OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit "),
OPT_STRING('c', "reedit-message", &edit_message, "COMMIT", "reuse and edit message from specified commit"),
OPT_STRING('C', "reuse-message", &use_message, "COMMIT", "reuse message from specified commit"),
OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C-c/--amend)"),
OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"),
OPT_FILENAME('t', "template", &template_file, "use specified template file"),
OPT_BOOLEAN('e', "edit", &edit_flag, "force edit of commit"),
......@@ -381,7 +382,7 @@ static void determine_author_info(void)
email = getenv("GIT_AUTHOR_EMAIL");
date = getenv("GIT_AUTHOR_DATE");
if (use_message) {
if (use_message && !renew_authorship) {
const char *a, *lb, *rb, *eol;
a = strstr(use_message_buffer, "\nauthor ");
......@@ -747,6 +748,9 @@ static int parse_and_validate_options(int argc, const char *argv[],
if (force_author && !strchr(force_author, '>'))
force_author = find_author_by_nickname(force_author);
if (force_author && renew_authorship)
die("Using both --reset-author and --author does not make sense");
if (logfile || message.len || use_message)
use_editor = 0;
if (edit_flag)
......@@ -780,6 +784,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
use_message = edit_message;
if (amend && !use_message)
use_message = "HEAD";
if (!use_message && renew_authorship)
die("--reset-author can be used only with -C, -c or --amend.");
if (use_message) {
unsigned char sha1[20];
static char utf8[] = "UTF-8";
......
#!/bin/sh
#
# Copyright (c) 2009 Erick Mattos
#
test_description='git commit --reset-author'
. ./test-lib.sh
author_header () {
git cat-file commit "$1" |
sed -n -e '/^$/q' -e '/^author /p'
}
message_body () {
git cat-file commit "$1" |
sed -e '1,/^$/d'
}
test_expect_success '-C option copies authorship and message' '
echo "Initial" >foo &&
git add foo &&
test_tick &&
git commit -m "Initial Commit" --author Frigate\ \<flying@over.world\> &&
git tag Initial &&
echo "Test 1" >>foo &&
test_tick &&
git commit -a -C Initial &&
author_header Initial >expect &&
author_header HEAD >actual &&
test_cmp expect actual &&
message_body Initial >expect &&
message_body HEAD >actual &&
test_cmp expect actual
'
test_expect_success '-C option copies only the message with --reset-author' '
echo "Test 2" >>foo &&
test_tick &&
git commit -a -C Initial --reset-author &&
echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
author_header HEAD >actual
test_cmp expect actual &&
message_body Initial >expect &&
message_body HEAD >actual &&
test_cmp expect actual
'
test_expect_success '-c option copies authorship and message' '
echo "Test 3" >>foo &&
test_tick &&
EDITOR=: VISUAL=: git commit -a -c Initial &&
author_header Initial >expect &&
author_header HEAD >actual &&
test_cmp expect actual
'
test_expect_success '-c option copies only the message with --reset-author' '
echo "Test 4" >>foo &&
test_tick &&
EDITOR=: VISUAL=: git commit -a -c Initial --reset-author &&
echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
author_header HEAD >actual &&
test_cmp expect actual &&
message_body Initial >expect &&
message_body HEAD >actual &&
test_cmp expect actual
'
test_expect_success '--amend option copies authorship' '
git checkout Initial &&
echo "Test 5" >>foo &&
test_tick &&
git commit -a --amend -m "amend test" &&
author_header Initial >expect &&
author_header HEAD >actual &&
echo "amend test" >expect &&
message_body HEAD >actual &&
test_cmp expect actual
'
test_expect_success '--reset-author makes the commit ours even with --amend option' '
git checkout Initial &&
echo "Test 6" >>foo &&
test_tick &&
git commit -a --reset-author -m "Changed again" --amend &&
echo "author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> $GIT_AUTHOR_DATE" >expect &&
author_header HEAD >actual &&
test_cmp expect actual &&
echo "Changed again" >expect &&
message_body HEAD >actual &&
test_cmp expect actual
'
test_expect_success '--reset-author and --author are mutually exclusive' '
git checkout Initial &&
echo "Test 7" >>foo &&
test_tick &&
test_must_fail git commit -a --reset-author --author="Xyzzy <frotz@nitfol.xz>"
'
test_expect_success '--reset-author should be rejected without -c/-C/--amend' '
git checkout Initial &&
echo "Test 7" >>foo &&
test_tick &&
test_must_fail git commit -a --reset-author -m done
'
test_done
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册