From 6207011ae3fe813159e92762e86f33c9bd42cd7f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 8 May 2009 21:49:14 -0700 Subject: [PATCH 01/14] Start 1.6.3.1 maintenance series. Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.3.1.txt | 12 ++++++++++++ RelNotes | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Documentation/RelNotes-1.6.3.1.txt diff --git a/Documentation/RelNotes-1.6.3.1.txt b/Documentation/RelNotes-1.6.3.1.txt new file mode 100644 index 0000000000..98c02250bb --- /dev/null +++ b/Documentation/RelNotes-1.6.3.1.txt @@ -0,0 +1,12 @@ +GIT v1.6.3.1 Release Notes +========================== + +Fixes since v1.6.3 +------------------ + +-- +exec >/var/tmp/1 +O=v1.6.3 +echo O=$(git describe maint) +git shortlog $O..maint + diff --git a/RelNotes b/RelNotes index dd8bc4bb4a..0f6a588f1d 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes-1.6.3.txt \ No newline at end of file +Documentation/RelNotes-1.6.3.1.txt \ No newline at end of file From 5a0e4a2a326966aabb566164a7571291e34adabd Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 8 May 2009 21:56:57 -0700 Subject: [PATCH 02/14] Start 1.6.4 development Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.4.txt | 59 ++++++++++++++++++++++++++++++++ RelNotes | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 Documentation/RelNotes-1.6.4.txt diff --git a/Documentation/RelNotes-1.6.4.txt b/Documentation/RelNotes-1.6.4.txt new file mode 100644 index 0000000000..b70ec11c26 --- /dev/null +++ b/Documentation/RelNotes-1.6.4.txt @@ -0,0 +1,59 @@ +GIT v1.6.4 Release Notes +======================== + +With the next major release, "git push" into a branch that is +currently checked out will be refused by default. You can choose +what should happen upon such a push by setting the configuration +variable receive.denyCurrentBranch in the receiving repository. + +To ease the transition plan, the receiving repository of such a +push running this release will issue a big warning when the +configuration variable is missing. Please refer to: + + http://git.or.cz/gitwiki/GitFaq#non-bare + http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007 + +for more details on the reason why this change is needed and the +transition plan. + +For a similar reason, "git push $there :$killed" to delete the branch +$killed in a remote repository $there, if $killed branch is the current +branch pointed at by its HEAD, gets a large warning. You can choose what +should happen upon such a push by setting the configuration variable +receive.denyDeleteCurrent in the receiving repository. + +When the user does not tell "git push" what to push, it has always +pushed matching refs. For some people it is unexpected, and a new +configuration variable push.default has been introduced to allow +changing a different default behaviour. To advertise the new feature, +a big warning is issued if this is not configured and a git push without +arguments is attempted. + + +Updates since v1.6.3 +-------------------- + +(subsystems) + +(performance) + +(usability, bells and whistles) + +(developers) + + +Fixes since v1.6.3 +------------------ + +All of the fixes in v1.6.3.X maintenance series are included in this +release, unless otherwise noted. + +Here are fixes that this release has, but have not been backported to +v1.6.3.X series. + + +--- +exec >/var/tmp/1 +echo O=$(git describe master) +O=v1.6.3 +git shortlog --no-merges $O..master ^maint diff --git a/RelNotes b/RelNotes index 0f6a588f1d..f8e49a5070 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes-1.6.3.1.txt \ No newline at end of file +Documentation/RelNotes-1.6.4.txt \ No newline at end of file From 3e1629f5a6c832941cc329c381de8b88ea775cb6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 7 May 2009 01:08:19 -0700 Subject: [PATCH 03/14] archive-tar.c: squelch a type mismatch warning On some systems, giving a value of type time_t to printf "%lo" that expects an unsigned long would give a type mismatch warning. Signed-off-by: Junio C Hamano --- archive-tar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archive-tar.c b/archive-tar.c index ba890ebdec..cee06ce3cb 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -180,7 +180,7 @@ static int write_tar_entry(struct archiver_args *args, sprintf(header.mode, "%07o", mode & 07777); sprintf(header.size, "%011lo", S_ISREG(mode) ? size : 0); - sprintf(header.mtime, "%011lo", args->time); + sprintf(header.mtime, "%011lo", (unsigned long) args->time); sprintf(header.uid, "%07o", 0); sprintf(header.gid, "%07o", 0); From ac9f71cf766ab1affdfc4d4c4b58238bf9c76700 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 7 May 2009 01:57:08 +0300 Subject: [PATCH 04/14] git config: clarify --add and --get-color Signed-off-by: Felipe Contreras Signed-off-by: Junio C Hamano --- Documentation/git-config.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 7131ee3c66..f68b198205 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -69,7 +69,8 @@ OPTIONS --add:: Adds a new line to the option without altering any existing - values. This is the same as providing '^$' as the value_regex. + values. This is the same as providing '^$' as the value_regex + in `--replace-all`. --get:: Get the value for a given key (optionally filtered by a regex @@ -155,7 +156,7 @@ See also <>. When the color setting for `name` is undefined, the command uses `color.ui` as fallback. ---get-color name default:: +--get-color name [default]:: Find the color configured for `name` (e.g. `color.diff.new`) and output it as the ANSI color escape sequence to the standard From 718135e3b6b5317f763477f5b0f408d888d79a8e Mon Sep 17 00:00:00 2001 From: Alex Riesen Date: Wed, 29 Apr 2009 23:40:50 +0200 Subject: [PATCH 05/14] Clarify kind of conflict in merge-one-file helper Not as verbose as the recursive merge driver, but better still. Signed-off-by: Alex Riesen Signed-off-by: Junio C Hamano --- git-merge-one-file.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh index e1eb963266..9c2c1b7202 100755 --- a/git-merge-one-file.sh +++ b/git-merge-one-file.sh @@ -113,6 +113,10 @@ case "${1:-.}${2:-.}${3:-.}" in src1=`git-unpack-file $2` git merge-file "$src1" "$orig" "$src2" ret=$? + msg= + if [ $ret -ne 0 ]; then + msg='content conflict' + fi # Create the working tree file, using "our tree" version from the # index, and then store the result of the merge. @@ -120,7 +124,10 @@ case "${1:-.}${2:-.}${3:-.}" in rm -f -- "$orig" "$src1" "$src2" if [ "$6" != "$7" ]; then - echo "ERROR: Permissions conflict: $5->$6,$7." + if [ -n "$msg" ]; then + msg="$msg, " + fi + msg="${msg}permissions conflict: $5->$6,$7" ret=1 fi if [ "$1" = '' ]; then @@ -128,7 +135,7 @@ case "${1:-.}${2:-.}${3:-.}" in fi if [ $ret -ne 0 ]; then - echo "ERROR: Merge conflict in $4" + echo "ERROR: $msg in $4" exit 1 fi exec git update-index -- "$4" From ec00d6e0038e030cf73182374e21025c2776cb23 Mon Sep 17 00:00:00 2001 From: Alexander Potashev Date: Thu, 7 May 2009 16:04:08 +0400 Subject: [PATCH 06/14] Documentation: cloning to empty directory is allowed Cloning into an existing empty directory is now allowed: commit 55892d23981917aefdb387ad7d0429f90cbd446a ("Allow cloning to an existing empty directory") Signed-off-by: Alexander Potashev Signed-off-by: Junio C Hamano --- Documentation/git-clone.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 4072f40d7a..b14de6c407 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -149,7 +149,7 @@ then the cloned repository will become corrupt. part of the source repository is used if no directory is explicitly given ("repo" for "/path/to/repo.git" and "foo" for "host.xz:foo/.git"). Cloning into an existing directory - is not allowed. + is only allowed if the directory is empty. :git-clone: 1 include::urls.txt[] From 74fd8728e2abd46a6276f6d48bfc6c9f01d74570 Mon Sep 17 00:00:00 2001 From: Jakub Narebski Date: Thu, 7 May 2009 19:11:29 +0200 Subject: [PATCH 07/14] gitweb: Remove function prototypes (cleanup) Use of function prototypes is considered bad practice in Perl. The ones used here didn't accomplish anything anyhow, so they've been removed. >From perlsub(1): [...] the intent of this feature [prototypes] is primarily to let you define subroutines that work like built-in functions [...] you can generate new syntax with it [...] We don't want to have subroutines behaving exactly like built-in functions, we don't want to define new syntax / syntactic sugar, so prototypes in gitweb are not needed... and they can have unintended consequences. Signed-off-by: Jakub Narebski Signed-off-by: Junio C Hamano --- gitweb/gitweb.perl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 3f99361ed0..06e91608fa 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -838,7 +838,7 @@ exit; ## ====================================================================== ## action links -sub href (%) { +sub href { my %params = @_; # default is to use -absolute url() i.e. $my_uri my $href = $params{-full} ? $my_url : $my_uri; @@ -1036,7 +1036,7 @@ sub esc_url { } # replace invalid utf8 character with SUBSTITUTION sequence -sub esc_html ($;%) { +sub esc_html { my $str = shift; my %opts = @_; @@ -1296,7 +1296,7 @@ use constant { }; # submodule/subproject, a commit object reference -sub S_ISGITLINK($) { +sub S_ISGITLINK { my $mode = shift; return (($mode & S_IFMT) == S_IFGITLINK) @@ -2615,7 +2615,7 @@ sub parsed_difftree_line { } # parse line of git-ls-tree output -sub parse_ls_tree_line ($;%) { +sub parse_ls_tree_line { my $line = shift; my %opts = @_; my %res; @@ -3213,7 +3213,6 @@ sub git_print_header_div { "\n\n"; } -#sub git_print_authorship (\%) { sub git_print_authorship { my $co = shift; @@ -3269,8 +3268,7 @@ sub git_print_page_path { print "
\n"; } -# sub git_print_log (\@;%) { -sub git_print_log ($;%) { +sub git_print_log { my $log = shift; my %opts = @_; From be427d758b53343d31debb520c0bc251a62013a9 Mon Sep 17 00:00:00 2001 From: Sitaram Chamarty Date: Tue, 28 Apr 2009 20:51:20 +0530 Subject: [PATCH 08/14] allow -t abbreviation for --track in git branch also makes it consistent with git-checkout Signed-off-by: Junio C Hamano --- Documentation/git-branch.txt | 1 + builtin-branch.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index cbd4275871..ae201deb7a 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -111,6 +111,7 @@ OPTIONS --no-abbrev:: Display the full sha1s in the output listing rather than abbreviating them. +-t:: --track:: When creating a new branch, set up configuration to mark the start-point branch as "upstream" from the new branch. This diff --git a/builtin-branch.c b/builtin-branch.c index 91098ca9b1..6aaa708473 100644 --- a/builtin-branch.c +++ b/builtin-branch.c @@ -547,7 +547,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) struct option options[] = { OPT_GROUP("Generic options"), OPT__VERBOSE(&verbose), - OPT_SET_INT( 0 , "track", &track, "set up tracking mode (see git-pull(1))", + OPT_SET_INT('t', "track", &track, "set up tracking mode (see git-pull(1))", BRANCH_TRACK_EXPLICIT), OPT_BOOLEAN( 0 , "color", &branch_use_color, "use colored output"), OPT_SET_INT('r', NULL, &kinds, "act on remote-tracking branches", From eb127887faa8771f2cf11d6809abfc51eb661e6e Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 12 May 2009 02:01:51 -0700 Subject: [PATCH 09/14] t3900: ISO-2022-JP has more than one popular variants When converting from other encodings (e.g. EUC-JP or UTF-8), there are subtly different variants of ISO-2022-JP, all of which are valid. At the end of line or when a run of string switches to 1-byte sequence, ESC ( B can be used to switch to ASCII or ESC ( J can be used to switch to ISO 646:JP (JIS X 0201) but they essentially are the same character set and are used interchangeably. Similarly the set ESC $ @ switches to (JIS X 0208-1978) and ESC $ B switches to (JIS X 0208-1983) are in practice used interchangeably. Depending on the iconv library and the locale definition on the system, a program that converts from another encoding to ISO-2022-JP can produce different byte sequence, and GIT_TEST_CMP (aka "diff -u") will report the difference as a failure. Fix this by converting the expected and the actual output to UTF-8 before comparing when the end result is ISO-2022-JP. The test vector string in t3900/ISO-2022-JP.txt is expressed with ASCII and JIS X 0208-1983, but it can be expressed with any other possible variant, and when converted back to UTF-8, these variants produce identical byte sequences. Signed-off-by: Junio C Hamano --- t/t3900-i18n-commit.sh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/t/t3900-i18n-commit.sh b/t/t3900-i18n-commit.sh index 784c31aec9..5dbbcb6345 100755 --- a/t/t3900-i18n-commit.sh +++ b/t/t3900-i18n-commit.sh @@ -9,7 +9,15 @@ test_description='commit and log output encodings' compare_with () { git show -s $1 | sed -e '1,/^$/d' -e 's/^ //' >current && - test_cmp current "$2" + case "$3" in + '') + test_cmp "$2" current ;; + ?*) + iconv -f "$3" -t utf8 >current.utf8 expect.utf8 <"$2" && + test_cmp expect.utf8 current.utf8 + ;; + esac } test_expect_success setup ' @@ -103,11 +111,17 @@ done for J in EUCJP ISO-2022-JP do + if test "$J" = ISO-2022-JP + then + ICONV=$J + else + ICONV= + fi git config i18n.logoutputencoding $J for H in EUCJP ISO-2022-JP do test_expect_success "$H should be shown in $J now" ' - compare_with '$H' "$TEST_DIRECTORY"/t3900/'$J'.txt + compare_with '$H' "$TEST_DIRECTORY"/t3900/'$J'.txt $ICONV ' done done From 49d833dc07f28bf67119c4060044fc829a7e044f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 12 May 2009 09:41:28 -0700 Subject: [PATCH 10/14] Revert "checkout branch: prime cache-tree fully" The logic in 83ae209 (checkout branch: prime cache-tree fully, 2009-04-20) is bogus; checkout can switch branches with a dirty index and in such a case the tree won't match HEAD. Add t2014-switch to catch this breakage. Signed-off-by: Junio C Hamano --- builtin-checkout.c | 9 +-------- t/t2014-switch.sh | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100755 t/t2014-switch.sh diff --git a/builtin-checkout.c b/builtin-checkout.c index efa1ebfe07..ffdb33aef5 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -368,17 +368,14 @@ static int merge_working_tree(struct checkout_opts *opts, int ret; struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file)); int newfd = hold_locked_index(lock_file, 1); - int reprime_cache_tree = 0; if (read_cache() < 0) return error("corrupt index file"); - cache_tree_free(&active_cache_tree); if (opts->force) { ret = reset_tree(new->commit->tree, opts, 1); if (ret) return ret; - reprime_cache_tree = 1; } else { struct tree_desc trees[2]; struct tree *tree; @@ -414,9 +411,7 @@ static int merge_working_tree(struct checkout_opts *opts, init_tree_desc(&trees[1], tree->buffer, tree->size); ret = unpack_trees(2, trees, &topts); - if (ret != -1) { - reprime_cache_tree = 1; - } else { + if (ret == -1) { /* * Unpack couldn't do a trivial merge; either * give up or do a real merge, depending on @@ -460,8 +455,6 @@ static int merge_working_tree(struct checkout_opts *opts, } } - if (reprime_cache_tree) - prime_cache_tree(&active_cache_tree, new->commit->tree); if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(lock_file)) die("unable to write new index file"); diff --git a/t/t2014-switch.sh b/t/t2014-switch.sh new file mode 100755 index 0000000000..ccfb147113 --- /dev/null +++ b/t/t2014-switch.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +test_description='Peter MacMillan' +. ./test-lib.sh + +test_expect_success setup ' + echo Hello >file && + git add file && + test_tick && + git commit -m V1 && + echo Hello world >file && + git add file && + git checkout -b other +' + +test_expect_success 'check all changes are staged' ' + git diff --exit-code +' + +test_expect_success 'second commit' ' + git commit -m V2 +' + +test_expect_success 'check' ' + git diff --cached --exit-code +' + +test_done From 4774780ab196ff4ace780445c06c8e5bfffffc49 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 12 May 2009 22:28:22 -0700 Subject: [PATCH 11/14] GIT 1.6.3.1 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.3.1.txt | 10 ++++------ GIT-VERSION-GEN | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Documentation/RelNotes-1.6.3.1.txt b/Documentation/RelNotes-1.6.3.1.txt index 98c02250bb..2400b72ef7 100644 --- a/Documentation/RelNotes-1.6.3.1.txt +++ b/Documentation/RelNotes-1.6.3.1.txt @@ -4,9 +4,7 @@ GIT v1.6.3.1 Release Notes Fixes since v1.6.3 ------------------ --- -exec >/var/tmp/1 -O=v1.6.3 -echo O=$(git describe maint) -git shortlog $O..maint - +* "git checkout -b new-branch" with a staged change in the index + incorrectly primed the in-index cache-tree, resulting a wrong tree + object to be written out of the index. This is a grave regression + since the last 1.6.2.X maintenance release. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 39cde784c9..d292e3a2d3 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.6.3.GIT +DEF_VER=v1.6.3.1 LF=' ' From 00652369ff285f84e440f5d41d708283e30825d7 Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Fri, 8 May 2009 18:23:32 -0700 Subject: [PATCH 12/14] bash completion: complete variable names for "git config" with options This makes it easier for users to get and unset their configuration variables without having to open documentation or dig through their configuration file. __git_config_get_set_variables() retrieves the set configuration variables from the appropriate configuration file. For example, if the user has previously specified --global only the global variables are returned. The same applies for --system, and --file. If no location has been specified, all set variables are returned. Signed-off-by: Stephen Boyd Acked-by: Shawn O. Pearce Signed-off-by: Junio C Hamano --- contrib/completion/git-completion.bash | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 1683e6d7b8..ad26b7c5ae 100755 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1322,6 +1322,35 @@ _git_send_email () COMPREPLY=() } +__git_config_get_set_variables () +{ + local prevword word config_file= c=$COMP_CWORD + while [ $c -gt 1 ]; do + word="${COMP_WORDS[c]}" + case "$word" in + --global|--system|--file=*) + config_file="$word" + break + ;; + -f|--file) + config_file="$word $prevword" + break + ;; + esac + prevword=$word + c=$((--c)) + done + + for i in $(git --git-dir="$(__gitdir)" config $config_file --list \ + 2>/dev/null); do + case "$i" in + *.*) + echo "${i/=*/}" + ;; + esac + done +} + _git_config () { local cur="${COMP_WORDS[COMP_CWORD]}" @@ -1388,6 +1417,10 @@ _git_config () __gitcomp "$__git_send_email_suppresscc_options" return ;; + --get|--get-all|--unset|--unset-all) + __gitcomp "$(__git_config_get_set_variables)" + return + ;; *.*) COMPREPLY=() return From 1a2872595409fbdd5d448730953884ef8d8c6613 Mon Sep 17 00:00:00 2001 From: Michael J Gruber Date: Wed, 13 May 2009 17:43:06 +0200 Subject: [PATCH 13/14] Documentation: clarify / requirement in 'git check-ref-format' 'git check-ref-format' checks for the presence of at least one '/', the idea being that there should be no refs directly below 'refs/', so there should be a category like 'heads/' or 'tags/' in a refname. Try and make this clearer in the man page. Signed-off-by: Michael J Gruber Signed-off-by: Junio C Hamano --- Documentation/git-check-ref-format.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index c1ce26884e..0873e60f7f 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -25,6 +25,10 @@ imposes the following rules on how references are named: grouping, but no slash-separated component can begin with a dot `.`. +. They must contain at least one `/`. This enforces the presence of a + category like `heads/`, `tags/` etc. but the actual names are not + restricted. + . They cannot have two consecutive dots `..` anywhere. . They cannot have ASCII control characters (i.e. bytes whose From 95405ba6cf7adeaa4a066e8a3a1b76b73f7b9341 Mon Sep 17 00:00:00 2001 From: Alex Riesen Date: Wed, 13 May 2009 20:08:53 +0200 Subject: [PATCH 14/14] Quote LF in urls git fetch saves in FETCH_HEAD The fmt-merge-msg does a strong syntax checking of its input and fails with if it is incorrect. The LF character is the only character important for fmt-merge-msg. As the url in FETCH_HEAD plays only informational role, a quoted representation of the url should be good and true enough. The url often comes from either user-editable config or command line, so it is reasonable to expect all kinds of characters in it, including the characters which the format of FETCH_HEAD considers special (line separator in this case). Noticed and reported by Hugo Mildenberger. Signed-off-by: Alex Riesen Signed-off-by: Junio C Hamano --- builtin-fetch.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/builtin-fetch.c b/builtin-fetch.c index 3c998ea740..ec75df0900 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -353,12 +353,18 @@ static int store_updated_refs(const char *url, const char *remote_name, kind); note_len += sprintf(note + note_len, "'%s' of ", what); } - note_len += sprintf(note + note_len, "%.*s", url_len, url); - fprintf(fp, "%s\t%s\t%s\n", + note[note_len] = '\0'; + fprintf(fp, "%s\t%s\t%s", sha1_to_hex(commit ? commit->object.sha1 : rm->old_sha1), rm->merge ? "" : "not-for-merge", note); + for (i = 0; i < url_len; ++i) + if ('\n' == url[i]) + fputs("\\n", fp); + else + fputc(url[i], fp); + fputc('\n', fp); if (ref) rc |= update_local_ref(ref, what, note);