Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: >> It is a good argument. I also heard a rumor that often branch names >> contain codewords given to pre-released hardware that are highly >> confidential in certain circles, and heard that it is one of the >> reasons why Gerrit has server side ACL that lets you hide some >> branches from authenticated users that can access other branches. > > Yes, branch names in general _can_ contain information users may prefer to > keep private. > > However, we're not talking about branch names in general. We are talking > about the default name of the main branch, to be picked in _all_ of your > new repositories. No, we are talking about the name of the branch, chosen to be the primary one, in one particular repository whose contents are exported via fast-export with explicit request from the user to anonymize end-user data. > Yes. And you're unlikely to configure the default name to be used for all > of your future `git init` operations to be something non-generic. > > Now, if you suggest that `git fast-export --anonymize` should either not > special-case the main branch, or at least have a configurable set of names > it skips from protecting, then I will be much more in favor of those > suggestions. However, those suggestions are quite a bit orthogonal to the > patch series at hand, so I would want to discuss them in their own code > contribution instead of here. I think after writing the message about your "two variable" approach, you would retract the "something non-generic" part in the above sentence. The original "we redact branch names but 'master' is used by and known by everybody so there is no need to redact" would have been a good argument. Perhaps there is a value to keep the primary branch identifiable even in an export stream that has all the refnames and payload anonymized, and leaving 'master' intact would have been a viable approach for solving that issue. That trick NO LONGER applies once you allow the name of the primary branch customizable, and the end user has used a name that is not to be exposed. Yes, "we want to ensure that readers of the export stream can identify which ref is the primary branch of the repository" is orthogonal from "how do we make primary branch configurable in a live repository?" and "how do we make the default name used for the primary branch in repositories newly created?". But because the old solution would not work in the new world order this topic created, a new solution needs to be found when you move the world to the new order. An easy solution would be to reserve "ref0" for the primary branch in the repository and anonymize other refs "ref1", "ref2", ... That can be done as a preparatory step regardless of the "'master' may not be in the name of the primary branch in this repository" topic. -- >8 -- Subject: [PATCH] fast-export: do anonymize the primary branch name 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 undistinguishable 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> --- builtin/fast-export.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 85868162ee..a306a60d25 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); } @@ -522,7 +522,7 @@ static const char *anonymize_refname(const char *refname) * anything interesting. */ if (!strcmp(refname, "refs/heads/master")) - return refname; + return "ref0"; strbuf_reset(&anon); for (i = 0; i < ARRAY_SIZE(prefixes); i++) {