From: Junio C Hamano <gitster@xxxxxxxxx> In a fast-export stream with --anonymize option, all the end-user data including refnames are munged to prevent exposure, but the 'master' branch is left intact. There is a comment that explains why it is OK to leave 'master' unanonymized (because everybody calls the primary branch 'master' and it is no secret), but that does not justify why it is bad to anonymize 'master' and make it indistinguishable from other branches. Assuming there _is_ a need to allow the readers of the output to tell where the tip of the primary branch is, let's keep the special casing of 'master', but still anonymize it to "ref0". Because all other branches will be given ref+N where N is a positive integer, this will keep the primary branch identifiable in the output stream, without exposing what the name of the primary branch is in the repository the export stream was taken from. This is in preparation for introducing a mechanism to affect the name of the primary branch used in the repository. Once the mechanism is in use, the name of the primary branch won't be 'master', and may not be allowed to be exposed. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin/fast-export.c | 9 +++++---- t/t9351-fast-export-anonymize.sh | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 85868162eec..1072bbf041f 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -497,7 +497,7 @@ static void *anonymize_ref_component(const void *old, size_t *len) { static int counter; struct strbuf out = STRBUF_INIT; - strbuf_addf(&out, "ref%d", counter++); + strbuf_addf(&out, "ref%d", ++counter); return strbuf_detach(&out, len); } @@ -518,11 +518,12 @@ static const char *anonymize_refname(const char *refname) int i; /* - * We also leave "master" as a special case, since it does not reveal - * anything interesting. + * In certain circumstances, it might be interesting to be able to + * identify the main branch. For that reason, let's force its name to + * be anonymized to `ref0`. */ if (!strcmp(refname, "refs/heads/master")) - return refname; + return "refs/heads/ref0"; strbuf_reset(&anon); for (i = 0; i < ARRAY_SIZE(prefixes); i++) { diff --git a/t/t9351-fast-export-anonymize.sh b/t/t9351-fast-export-anonymize.sh index 897dc509075..2415f0ec213 100755 --- a/t/t9351-fast-export-anonymize.sh +++ b/t/t9351-fast-export-anonymize.sh @@ -26,8 +26,9 @@ test_expect_success 'stream omits path names' ' ! grep xyzzy stream ' -test_expect_success 'stream allows master as refname' ' - grep master stream +test_expect_success 'stream translates master to ref0' ' + grep refs/heads/ref0 stream && + ! grep master stream ' test_expect_success 'stream omits other refnames' ' @@ -57,7 +58,7 @@ test_expect_success 'import stream to new repository' ' test_expect_success 'result has two branches' ' git for-each-ref --format="%(refname)" refs/heads >branches && test_line_count = 2 branches && - other_branch=$(grep -v refs/heads/master branches) + other_branch=$(grep -v refs/heads/ref0 branches) ' test_expect_success 'repo has original shape and timestamps' ' @@ -65,7 +66,7 @@ test_expect_success 'repo has original shape and timestamps' ' git log --format="%m %ct" --left-right --boundary "$@" } && (cd .. && shape master...other) >expect && - shape master...$other_branch >actual && + shape ref0...$other_branch >actual && test_cmp expect actual ' -- gitgitgadget