threads / patch / 57839

patch, 9 partsMakefile: sort "po/git.pot" by file location

Subject: [PATCH 1/9] Makefile: sort "po/git.pot" by file location

## tl;dr

110 messages between May 3, 2022 and May 26, 2022. Diffs are folded; open one to read it.

replies: 109people: 5as markdown or json

Jiang Xin· May 3, 2022, 13:23 UTC · lore

[PATCH 0/9] Incremental po/git.pot update and new l10n workflow

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Ævar and I started discussing this topic (incremental po/git.pot update and new l10n workflow) on a GitHub issue[^1] a month ago. There are several improvements to the l10n workflow:

* Variable "LOCALIZED_C" is not stable, that cause the "po/git.pot" file
  generated by different user may have different number of entries.
  This issues is fixed in patch 2/9.
* Generate "po/git.pot" in an incremental way, so we do not need to munge
  source files in-place, do not need a clean checkout, and do not need
  "reset --hard". See patch 3/9.
* Remove file "po/git.pot" from tree. It can be generated at runtime.
  See patch 5/9, 6/9.
* L10n contributors can update theire "po/XX.pot" using:
  "make po-update PO_FILE=po/XX.po". See patch 7/9.
* L10n contributors for new language can initialize "po/XX.pot" using:
  "make po-init PO_FILE=po/XX.po". See patch 8/9.
* L10n contributors can start translations at any time, even before the
  l10n announcing l10n window open. We must have a new l10n workflow,
  see patch 9/9.
@Ævar, range-diff between your worktree[^2] and this.

[^1]: https://github.com/git-l10n/git-po-helper/issues/12 [^2]: https://github.com/avar/git/commits/avar/Makefile-incremental-po-git-pot-rule

## range-diff avar/Makefile-incremental-po-git-pot-rule...HEAD
 1:  6f3483eb63 <  -:  ---------- po/git: regenerate with "make pot"
 -:  ---------- >  1:  88470f57b8 Makefile: sort "po/git.pot" by file location
 -:  ---------- >  2:  1f6ef16028 Makefile: generate "po/git.pot" from stable LOCALIZED_C
 2:  6cf9c1f702 !  3:  a991919bfb Makefile: have "make pot" not "reset --hard"
    @@ Metadata
      ## Commit message ##
         Makefile: have "make pot" not "reset --hard"
     
    -    Change "make pot" to work on copies of the working tree files in a new
    -    ".build/pot/" directory, instead of altering them in place and doing a
    -    "reset --hard" afterwards.
    -
    -    This both speeds up the "make pot" target on an initial run, and makes
    -    it *much* faster for incremental runs, and will allow us to implement
    -    related targets in subsequent commits.
    +    Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
    +    custom PRItime format, 2017-07-20) we'd consider source files as-is
    +    with gettext, but because we need to understand PRItime in the same way
    +    that gettext itself understands PRIuMAX we'd first check if we had a
    +    clean checkout, then munge all of the processed files in-place with
    +    "sed", generate "po/git.pot", and then finally "reset --hard" to undo
    +    our changes.
    +
    +    By generating "pot" snippets in ".build/pot/po" for each source file
    +    and rewriting certain source files with PRItime macros to temporary
    +    files in ".build/pot/po", we can avoid running "make pot" by altering
    +    files in place and doing a "reset --hard" afterwards.
    +
    +    This speed of "make pot" is slower than before on an initial run,
    +    because we run "xgettext" many times (once per source file), but it
    +    can be boosted by parallelization. It is *much* faster for incremental
    +    runs, and will allow us to implement related targets in subsequent
    +    commits.
     
         When the "pot" target was originally added in cd5513a7168 (i18n:
         Makefile: "pot" target to extract messages marked for translation,
    @@ Commit message
         target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
         Makefile's dependency resolution inherently can't handle incremental
         building when the target file may be updated by git (or something else
    -    external to "make").
    -
    -    So we still need a FORCE on po/git.pot, but now we'll have that target
    -    copy ".build/pot/git.pot" to "po/git.pot", and the former doesn't need
    -    FORCE.
    -
    -    I think 1f31963e921 was confused in the rationale for adding "FORCE"
    -    though, it's needed for the reasons noted above, but it's got nothing
    -    to do with how we do C compilation or find headers, which it suggest
    -    is the case. It was also made as a preparatory change for
    -    d85b0dff729 (Makefile: use `find` to determine static header
    -    dependencies, 2014-08-25).
    -
    -    Unlike the compiler, when we generate the "pot "file we won't recurse
    -    from one header file to another, we only consider the specific targets
    -    we're given, so if we miss a bar.h included via foo.h $(LOCALIZED_C)
    -    the FORCE won't help us.
    +    external to "make"). But this case no longer applies, so FORCE is no
    +    longer needed.
     
         That out of the way, the main logic change here is getting rid of the
         "reset --hard":
     
    -    Before fc0fd5b23bc we'd consider source files as-is with gettext, but
    -    because we need to understand PRItime in the same way that gettext
    -    itself understands PRIuMAX we'd first check if we had a clean
    -    checkout, then munge all of the processed files in-place with "sed",
    -    generate "po/git.pot, and then finally "reset --hard" to undo our
    -    changes.
    -
    -    We didn't need to do this for the *.perl and *.sh files, so let's
    -    skip that and only do it for the *.[ch] files.
    -
    -    Let's then create these munged *.[ch] files in a tree in .build/pot/"
    -    corresponding to our source tree, and have "xgettext" consider
    -    those. The rule needs to be careful to "(cd .build/pot && ...)",
    -    because otherwise the comments in the po/git.pot file wouldn't refer
    -    to the correct source locations (they'd be prefixed with
    -    ".build/git/").
    -
    -    We'll then generate intermediate .build/pot/po/% files from %, which
    -    is handy to see at a glance what strings (if any) in a given file are
    +    We'll generate intermediate .build/pot/po/%.po files from %, which is
    +    handy to see at a glance what strings (if any) in a given file are
         marked for translation:
     
    -            $ make .build/pot/po/pretty.c
    +            $ make .build/pot/po/pretty.c.po
                 [...]
    -            $ cat .build/pot/po/pretty.c
    +            $ cat .build/pot/po/pretty.c.po
                 #: pretty.c:1051
                 msgid "unable to parse --pretty format"
                 msgstr ""
                 $
     
    +    For these C source files which contain the PRItime macros, we will
    +    create temporary munged *.c files in a tree in ".build/pot/po"
    +    corresponding to our source tree, and have "xgettext" consider those.
    +    The rule needs to be careful to "(cd .build/pot/po && ...)", because
    +    otherwise the comments in the po/git.pot file wouldn't refer to the
    +    correct source locations (they'd be prefixed with ".build/pot/po").
    +
         This changes the output of the generated po/git.pot file in one minor
         way: Because we're using msgcat(1) instead of xgettext(1) to
         concatenate the output we'll now disambiguate where "TRANSLATORS"
    @@ Commit message
         different. E.g. for the "Your edited hunk[...]" message we'll now
         apply this change (comment content elided):
     
    -            +#. #-#-#-#-#  add-patch.c  #-#-#-#-#
    +            +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
                  #. TRANSLATORS: do not translate [y/n]
                 [...]
    -            +#. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
    +            +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
                  #. TRANSLATORS: do not translate [y/n]
                 [...]
                  #: add-patch.c:1253 git-add--interactive.perl:1244
    @@ Commit message
                  "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
                  msgstr ""
     
    -    There are three such changes, and they all make the context more
    +    There are six such changes, and they all make the context more
         understandable, as msgcat(1) is better at handling these edge cases
         than xgettext(1)'s previously used "--join-existing" flag.
     
    -    The removal of the "--msgid-bugs-address" here and the addition of
    -    "--omit-header" and ".build/pot/pot.header" is because we'll now
    -    always carry forward the existing po/git.pot header.
    +    While we could rename the "pot" snippets without the ".po" extention
    +    to use more intuitive filenames in the comments, but that will
    +    confuse the IDE with lots of invalid C or perl source files in
    +    ".build/pot/po" directory.
     
    -    We'd previously generate the header with xgettext(1), but now we'll be
    -    carrying forward whatever header we find in po/git.pot. Right now this
    -    doesn't matter, we'll even update the timestamp in the header as
    -    before when running "make pot".
    +    The addition of "--omit-header" option for xgettext makes the "pot"
    +    snippets in ".build/pot/po/*.po" smaller. For the pot header of
    +    "po/git.pot", we use xgettext to generate a "pot" header file
    +    ".build/pot/git.header" from an empty file at runtime, and use this
    +    header to assemble "po/git.pot".
     
    -    But as we'll see in a subsequent commit our previous header behavior
    -    has been hiding an encoding-related bug from us, so let's carry it
    -    forward instead of re-generating it with xgettext(1).
    +    But as we'll see in a subsequent commit this header behavior has been
    +    hiding an encoding-related bug from us, so let's carry it forward
    +    instead of re-generating it with xgettext(1).
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## .gitignore ##
     @@
    @@ .gitignore
      *.gcno
     
      ## Makefile ##
    -@@ Makefile: pdf:
    - XGETTEXT_FLAGS = \
    +@@ Makefile: INSTALL = install
    + TCL_PATH = tclsh
    + TCLTK_PATH = wish
    + XGETTEXT = xgettext
    ++MSGCAT = msgcat
    + MSGFMT = msgfmt
    + CURL_CONFIG = curl-config
    + GCOV = gcov
    +@@ Makefile: XGETTEXT_FLAGS = \
      	--force-po \
      	--add-comments=TRANSLATORS: \
    --	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    --	--from-code=UTF-8
    -+	--from-code=UTF-8 \
    -+	--omit-header
    -+
    + 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    ++	--package-name=Git \
    + 	--sort-by-file \
    + 	--from-code=UTF-8
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    - 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
    - XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    +@@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    + 	--keyword=gettextln --keyword=eval_gettextln
    + XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
    + 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    ++MSGCAT_FLAGS = --sort-by-file
    + LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
    + 	      $(FOUND_H_SOURCES) $(GENERATED_H)
    + LOCALIZED_SH = $(SCRIPT_SH)
     @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
      LOCALIZED_PERL += t/t0200/test.perl
      endif
    @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
     -## under a very controlled condition, i.e. (1) it is to be run in a
     -## Git repository (not a tarball extract), (2) any local modifications
     -## will be lost.
    -+## We generate intermediate .build/pot/po/% files containing a extract
    -+## of the translations we find in each file in the source tree. The
    -+## files have the same basename as the source due xgettext(1) not
    -+## having a way to override the basename inserted into comments.
    ++## We generate intermediate .build/pot/po/%.po files containing a
    ++## extract of the translations we find in each file in the source
    ++## tree. We will assemble them using msgcat to create the final
    ++## "po/git.pot" file.
     +LOCALIZED_ALL_GEN_PO =
     +
    -+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%)
    ++LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
     +
    -+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%)
    ++LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
     +
    -+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%)
    ++LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
     +
      ## Gettext tools cannot work with our own custom PRItime type, so
      ## we replace PRItime with PRIuMAX.  We need to update this to
      ## PRIdMAX if we switch to a signed type later.
    -+LOCALIZED_C_GEN	= $(LOCALIZED_C:%=.build/pot/in/%)
    -+$(LOCALIZED_C_GEN): .build/pot/in/%: %
    ++$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_GEN)sed -e 's|PRItime|PRIuMAX|g' <$< >$@
    -+
    -+$(LOCALIZED_C_GEN_PO): .build/pot/po/%: .build/pot/in/%
    -+	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)(\
    -+		cd .build/pot/in && \
    -+		$(XGETTEXT) -o $(@:.build/pot/po/%=../po/%) \
    -+			$(XGETTEXT_FLAGS_C) \
    -+			$(<:.build/pot/in/%=%) \
    -+	)
    ++	$(QUIET_XGETTEXT) \
    ++	    if grep -q PRItime $<; then \
    ++		(\
    ++			sed -e 's|PRItime|PRIuMAX|g' <$< \
    ++				>.build/pot/po/$< && \
    ++			cd .build/pot/po && \
    ++			$(XGETTEXT) --omit-header \
    ++				-o $(@:.build/pot/po/%=%) \
    ++				$(XGETTEXT_FLAGS_C) $< && \
    ++			rm $<; \
    ++		); \
    ++	    else \
    ++		$(XGETTEXT) --omit-header \
    ++			-o $@ $(XGETTEXT_FLAGS_C) $<; \
    ++	    fi
      
     -po/git.pot: $(GENERATED_H) FORCE
     -	# All modifications will be reverted at the end, so we do not
     -	# want to have any local change.
     -	git diff --quiet HEAD && git diff --quiet --cached
    -+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%: %
    ++$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_SH) $<
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
    ++		-o$@ $(XGETTEXT_FLAGS_SH) $<
      
     -	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
     -	do \
     -		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
     -		cat "$$s+" >"$$s" && rm "$$s+"; \
     -	done
    -+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%: %
    -+	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_PERL) $<
    -+
    -+.build/pot/pot.header:
    ++$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_GEN)sed -n -e '/^$$/q' -e 'p' <po/git.pot >$@
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
    ++		-o$@ $(XGETTEXT_FLAGS_PERL) $<
      
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
     -		$(LOCALIZED_SH)
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
     -		$(LOCALIZED_PERL)
    -+.build/pot/git.pot: .build/pot/pot.header $(LOCALIZED_ALL_GEN_PO)
    -+	$(QUIET_GEN)msgcat $^ >$@
    ++.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
    ++	$(call mkdir_p_parent_template)
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
    ++		-o - /dev/null | \
    ++	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
    ++	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
      
     -	# Reverting the munged source, leaving only the updated $@
     -	git reset --hard
     -	mv $@+ $@
    -+po/git.pot: .build/pot/git.pot FORCE
    -+	$(QUIET_CP)cp $< $@
    ++po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    ++	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
      
      .PHONY: pot
      pot: po/git.pot
    @@ Makefile: cocciclean:
      	$(RM) *.res
      	$(RM) $(OBJECTS)
      	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
    -
    - ## shared.mak ##
    -@@ shared.mak: ifndef V
    - 	QUIET_AR       = @echo '   ' AR $@;
    - 	QUIET_LINK     = @echo '   ' LINK $@;
    - 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
    -+	QUIET_CP       = @echo '   ' CP $@;
    - 	QUIET_LNCP     = @echo '   ' LN/CP $@;
    - 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
    - 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 3:  91d55d2894 <  -:  ---------- po/git: regenerate with "make pot"
 4:  a7f8122d43 !  4:  a54e33dbff i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Commit message
            gettext, 2011-11-18)
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## Makefile ##
    -@@ Makefile: pdf:
    - XGETTEXT_FLAGS = \
    - 	--force-po \
    +@@ Makefile: XGETTEXT_FLAGS = \
      	--add-comments=TRANSLATORS: \
    --	--from-code=UTF-8 \
    - 	--omit-header
    - 
    + 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    + 	--package-name=Git \
    +-	--sort-by-file \
    +-	--from-code=UTF-8
    ++	--sort-by-file
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    -@@ Makefile: po/git.pot: .build/pot/git.pot FORCE
    + 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
    + XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    +@@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      .PHONY: pot
      pot: po/git.pot
      
     +.PHONY: check-pot
    -+check-pot: .build/pot/git.pot
    ++check-pot: pot
     +
      ifdef NO_GETTEXT
      POFILES :=
 5:  a42d04749f <  -:  ---------- po/git: regenerate with "make pot"
 6:  545d65554d !  5:  d9709a5b56 po/git.pot: don't check in result of "make pot"
    @@ Commit message
             $ git log -p --oneline -- po/git.pot|wc -l
             553743
     
    -    We can instead have the i18n tooling either read an OID from which to
    -    generate the po/git.pot, or the i18n coordinator could add and commit
    -    a po/git.pot to a branch in his fork.
    +    We can instead let l10n contributors to generate "po/git.pot" in runtime
    +    to update their own "po/XX.po", and the l10n coordinator can check
    +    pull requests using CI pipeline.
     
         This reverts to the schema introduced initially in cd5513a7168 (i18n:
         Makefile: "pot" target to extract messages marked for translation,
    @@ Commit message
         commit, to make this change easier to review, and to preempt the
         mailing list from blocking it due to it being too large.
     
    -    We'll probably want to adjust the header, but for now it's moved over
    -    as-is from po/git.pot.
    -
    -    Even though this makes .build/po/git.pot strictly redundant to
    -    po/git.pot let's keep the former, and have the rule for the latter
    -    copy it over, just not depending on FORCE now. We still need a
    -    po/*.pot so that "msginit(1)" in the gettext tooling does what we mean
    -    by default, but for other targets we can create things only in
    -    ".build" without littering the rest of the working copy.
    -
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## Makefile ##
    -@@ Makefile: $(LOCALIZED_PERL_GEN_PO): .build/pot/po/%: %
    - 	$(call mkdir_p_parent_template)
    - 	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_PERL) $<
    - 
    --.build/pot/pot.header:
    --	$(call mkdir_p_parent_template)
    --	$(QUIET_GEN)sed -n -e '/^$$/q' -e 'p' <po/git.pot >$@
    --
    --.build/pot/git.pot: .build/pot/pot.header $(LOCALIZED_ALL_GEN_PO)
    -+.build/pot/git.pot: po/pot.header $(LOCALIZED_ALL_GEN_PO)
    - 	$(QUIET_GEN)msgcat $^ >$@
    - 
    --po/git.pot: .build/pot/git.pot FORCE
    -+po/git.pot: .build/pot/git.pot
    - 	$(QUIET_CP)cp $< $@
    - 
    - .PHONY: pot
     @@ Makefile: dist-doc: git$X
      
      distclean: clean
    @@ po/.gitignore
     @@
      /build
     +/git.pot
    -
    - ## po/git.pot ##
    -@@
    --# SOME DESCRIPTIVE TITLE.
    --# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    --# This file is distributed under the same license as the PACKAGE package.
    --# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    --#
    --#, fuzzy
    --msgid   ""
    --msgstr  "Project-Id-Version: PACKAGE VERSION\n"
    --        "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
    --        "POT-Creation-Date: 2022-04-19 17:54+0200\n"
    --        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    --        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    --        "Language-Team: LANGUAGE <LL@li.org>\n"
    --        "Language: \n"
    --        "MIME-Version: 1.0\n"
    --        "Content-Type: text/plain; charset=UTF-8\n"
    --        "Content-Transfer-Encoding: 8bit\n"
    --        "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
    --#
    - # File: add-interactive.c, line: 382
    - #, c-format
    - msgid   "Huh (%s)?"
    -
    - ## po/pot.header (new) ##
    -@@
    -+# SOME DESCRIPTIVE TITLE.
    -+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    -+# This file is distributed under the same license as the PACKAGE package.
    -+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    -+#
    -+#, fuzzy
    -+msgid ""
    -+msgstr ""
    -+"Project-Id-Version: PACKAGE VERSION\n"
    -+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
    -+"POT-Creation-Date: 2022-04-19 17:54+0200\n"
    -+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    -+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    -+"Language-Team: LANGUAGE <LL@li.org>\n"
    -+"Language: \n"
    -+"MIME-Version: 1.0\n"
    -+"Content-Type: text/plain; charset=UTF-8\n"
    -+"Content-Transfer-Encoding: 8bit\n"
    -+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 7:  8bcf497fad !  6:  7810b16fc4 po/git.pot: remove this now generated file, see preceding commit
     (Ignored...)
 8:  987a5b80f1 <  -:  ---------- Makefile: always declare [PM]OFILES variables
 9:  3da73392a9 <  -:  ---------- po/*.po: filter through msgcat --no-location
10:  4add92aa92 <  -:  ---------- po/*.po: don't check in files with --add-location=full
 -:  ---------- >  7:  3981f16d30 Makefile: add "po-update" rule to update po/XX.po
 -:  ---------- >  8:  e6548a7a89 Makefile: add "po-init" rule to initialize po/XX.po
11:  72ed0c8b2e !  9:  4bd525fa86 i18n: migrate to line-number-less i18n workflow
    @@ Metadata
     Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     
      ## Commit message ##
    -    i18n: migrate to line-number-less i18n workflow
    +    l10n: Document the new l10n workflow
     
         Change the "flow" of how translators interact with the l10n repository
         at [1] to adjust it for a new workflow of not having a po/git.pot file
    @@ Commit message
         "master" is usually pretty small, so perhaps translators can just work
         on "master" instead.
     
    -    This also required pulling in some parts of the git-po-helper[1]
    -    logic, in particular the creation of the "core pot" added in its
    -    9efa9a5 (New option --core for init to create core po/pot file,
    -    2021-04-26). As the Makefile changes here show doing so is rather
    -    trivial now that the po/git.pot is generated in the ".build"directory.
    -
    -    We also need to add a new "po-init" target, which replaces both the
    -    "git-po-helper init" and the the instructions for manually munging the
    -    msginit'd file that I added in 5e9637c6297 (i18n: add infrastructure
    -    for translating Git with gettext, 2011-11-18). Now to e.g. create a
    -    new Faroese translation:
    -
    -        make po-init PO_FILE=po/fo.po
    -
    -    We can furthermore delete the po/pot.header file. We've been relying
    -    on the git.pot to provide a template for us (which msginit implicitly
    -    picks up), but now we don't need to carry it around anymore. We'll
    -    instead munge the msginit'd output appropriately.
    -
    -    1. https://github.com/git-l10n/git-po-helper/
    +    1. https://github.com/git-l10n/git-po/
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    -
    - ## Makefile ##
    -@@ Makefile: $(LOCALIZED_PERL_GEN_PO): .build/pot/po/%: %
    - 	$(call mkdir_p_parent_template)
    - 	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_PERL) $<
    - 
    --.build/pot/git.pot: po/pot.header $(LOCALIZED_ALL_GEN_PO)
    -+.build/pot/git.pot: $(LOCALIZED_ALL_GEN_PO)
    - 	$(QUIET_GEN)msgcat $^ >$@
    - 
    - po/git.pot: .build/pot/git.pot
    -@@ Makefile: pot: po/git.pot
    - .PHONY: check-pot
    - check-pot: .build/pot/git.pot
    - 
    -+### TODO FIXME: Translating everything in these files is a bad
    -+### heuristic for "core", as we'll translate obscure error() messages
    -+### along with commonly seen i18n messages. A better heuristic would
    -+### be to e.g. use spatch to first remove error/die/warning
    -+### etc. messages.
    -+LOCALIZED_C_CORE =
    -+LOCALIZED_C_CORE += builtin/checkout.c
    -+LOCALIZED_C_CORE += builtin/clone.c
    -+LOCALIZED_C_CORE += builtin/index-pack.c
    -+LOCALIZED_C_CORE += builtin/push.c
    -+LOCALIZED_C_CORE += builtin/reset.c
    -+LOCALIZED_C_CORE += remote.c
    -+LOCALIZED_C_CORE += wt-status.c
    -+### This "clean" target is only needed for the dependency-busting
    -+### core-pot target
    -+clean-pot:
    -+	$(RM) -r .build/pot
    -+.PHONY: core-pot
    -+core-pot: clean-pot
    -+	$(MAKE) pot LOCALIZED_C="$(LOCALIZED_C_CORE)" LOCALIZED_SH= LOCALIZED_PERL=
    -+
    -+## Managing *.po files
    -+PO_INIT_FLAGS = \
    -+	--input=.build/pot/git.pot \
    -+	--output=$@ \
    -+	--no-translator \
    -+	--locale=$(PO_LANG)
    -+
    -+.build/po-init/$(PO_FILE).gen: .build/pot/git.pot
    -+	$(call mkdir_p_parent_template)
    -+	$(QUIET_MSGINIT)msginit $(PO_INIT_FLAGS)
    -+
    -+### We need some Po-Revision-Date or e.g. Emacs's po-mode.el will
    -+### replace the header entirely.
    -+.build/po-init/$(PO_FILE).head: .build/po-init/$(PO_FILE).gen
    -+	$(QUIET_GEN)\
    -+	echo "# This file is distributed under the same license as the Git package." >$@ && \
    -+	sed -n -e '1,/^$$/p' <$< | \
    -+		sed \
    -+			-e '/^$$/d' \
    -+			-e 's/PACKAGE VERSION/Git/' \
    -+			-e 's/Automatically generated/make by the Makefile/' \
    -+			-e 's/none/Git Mailing List <git@vger.kernel.org>/' \
    -+			-e 's/charset=ASCII/charset=UTF-8/' \
    -+		>>$@ && \
    -+	printf "\"PO-Revision-Date: 2022-04-11 11:05+0200\\\n\"\n" >>$@
    -+	echo >>$@
    -+
    -+.build/po-init/$(PO_FILE).tail: .build/po-init/$(PO_FILE).gen
    -+	$(QUIET_GEN)sed -n -e '1,/^$$/d' -e 'p' <$< >$@
    -+
    -+PO_LANG = $(PO_FILE:po/%.po=%)
    -+
    -+# TODO?: Prune out the "automatically generated" etc?
    -+
    -+.PHONY: po-init
    -+po-init: .build/po-init/$(PO_FILE).head .build/po-init/$(PO_FILE).tail
    -+	$(QUIET_PO_INIT)if test -e $(PO_FILE); then \
    -+		echo error: $(PO_FILE) exists already >&2; \
    -+		exit 1; \
    -+	fi && \
    -+	cat $^ >$(PO_FILE)
    -+
    - ## po/*.po files & their rules
    - POFILES = $(wildcard po/*.po)
    - 
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## po/README.md ##
     @@ po/README.md: for a new language translation. Because there are more than 5000 messages
    @@ po/README.md: for a new language translation. Because there are more than 5000 m
     -The core template message file which contains a small set of messages
     -will be generated in "po-core/core.pot" automatically by running a helper
     -program named "git-po-helper" (described later).
    -+The "core" set of messages can be generated by running:
    ++The "core" set of messages can be generated at "po/git-core.pot" by
    ++running:
      
      ```shell
     -git-po-helper init --core XX.po
    @@ po/README.md: for a new language translation. Because there are more than 5000 m
     -
     -Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
     -translated messages and duplicate messages.
    --
    -+And then proceeding with the rest of these instructions (butdon't run
    -+the full `make pot`!).
    ++And then proceeding with the rest of these instructions on the new
    ++generated "po/git-core.pot" file.
    + 
      
      ## Translation Process Flow
      
      The overall data-flow looks like this:
      
    -     +-------------------+            +------------------+
    +-    +-------------------+            +------------------+
     -    | Git source code   | ---(1)---> | L10n coordinator |
    -+    | Git source code   | ---(3)---> | L10n coordinator |
    -     | repository        | <---(4)--- | repository       |
    -     +-------------------+            +------------------+
    +-    | repository        | <---(4)--- | repository       |
    +-    +-------------------+            +------------------+
     -                                          |      ^
     -                                         (2)    (3)
     -                                          V      |
     -                                     +------------------+
     -                                     | Language Team XX |
     -                                     +------------------+
    -+                      |                ^
    -+                     (1)              (3)
    -+                      V                |
    -+                     +------------------+
    -+                     | Language Team XX |
    -+                     +------------------+
    ++    +-------------------+             +------------------+
    ++    | Git source code   | ----(2)---> | L10n coordinator |
    ++    | repository        | <---(5)---- | repository       |
    ++    +-------------------+             +------------------+
    ++                    |                     |    ^
    ++                   (1)                   (3)  (4)
    ++                    V                     v    |
    ++               +----------------------------------+
    ++               |        Language Team XX          |
    ++               +----------------------------------+
      
      - Translatable strings are marked in the source file.
     -- L10n coordinator pulls from the source (1)
     -- L10n coordinator updates the message template "po/git.pot"
     -- Language team pulls from L10n coordinator (2)
    -+- Language team pulls new sources (1)
    - - Language team updates the message file "po/XX.po"
    +-- Language team updates the message file "po/XX.po"
     -- L10n coordinator pulls from Language team (3)
    -+- L10n coordinator re-pulls from upstream (3), merges & adjusts
    - - L10n coordinator asks the result to be pulled (4).
    +-- L10n coordinator asks the result to be pulled (4).
    ++- Language teams can start translation iterations at any time, even
    ++  before the l10n window opens:
    ++
    ++  + Pull from the source (1)
    ++  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    ++  + Translate the message file "po/XX.po"
      
    ++- The L10n coordinator pulls from source and announces the l10n window
    ++  open (2)
    ++- Language team pulls from the l10n coordinator, starts another
    ++  translation iteration against the l10n coordinator's tree (3)
      
     -## Maintaining the "po/git.pot" file
    --
    ++  + Run "git pull --rebase" from the l10n coordinator
    ++  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    ++  + Translate the message file "po/XX.po"
    ++  + Squash trivial l10n git commits using "git rebase -i"
    + 
     -(This is done by the l10n coordinator).
    -+## Creating the "po/git.pot" file
    ++- Language team sends pull request to the l10n coordinator (4)
    ++- L10n coordinator checks and merges
    ++- L10n coordinator asks the result to be pulled (5).
      
    - The "po/git.pot" file contains a message catalog extracted from Git's
    +-The "po/git.pot" file contains a message catalog extracted from Git's
     -sources. The l10n coordinator maintains it by adding new translations with
     -msginit(1), or update existing ones with msgmerge(1).  In order to update
     -the Git sources to extract the messages from, the l10n coordinator is
     -expected to pull from the main git repository at strategic point in
     -history (e.g. when a major release and release candidates are tagged),
     -and then run "make pot" at the top-level directory.
    -+sources, it is created by running:
    -+
    -+	make pot
    -+
    -+The l10ncoordintor announces a target release to translate, which is
    -+expected to be a strategic point in history (e.g. when a major release
    -+and release candidates are tagged).
    -+
    -+Language contributors are then expected to work on translations
    -+against this release, i.e. to `make pot` by doing e.g.:
      
     -Language contributors use this file to prepare translations for their
     -language, but they are not expected to modify it.
    -+    git worktree add /tmp/git-pot v2.35.0
    -+    make -C /tmp/git-pot pot
    - 
    -+And to then follow the instructions in "Updating a "XX.po" file" below
    -+using this generated `/tmp/git-pot/po/git.pot` file. After the
    -+`msgmerge` described there the temporary worktree can be removed:
    ++## Creating the "po/git.pot" file
     +
    -+    git worktree remove --force /tmp/git-pot
    ++The "po/git.pot" file, once generated by the the l10n coordinator had
    ++been removed from the tree. L10n contributors can generated it at
    ++runtime using command:
    ++
    ++```shell
    ++make pot
    ++```
    ++
    ++Then language contributors use this file to prepare translations for
    ++their language, but they are not expected to modify it.
      
    - ## Initializing a "XX.po" file
      
    + ## Initializing a "XX.po" file
     @@ po/README.md: If your language XX does not have translated message file "po/XX.po" yet,
      you add a translation for the first time by running:
      
    @@ -1,6 +1,6 @@
      
     -And change references to PACKAGE VERSION in the PO Header Entry to
     -just "Git":
    --
    ++Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
    + 
     -```shell
     -perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
     -```
    -+Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
    ++The newly generated message file "po/XX.po" is based on the core pot
    ++file "po/git-core.pot", so it contains only a minimal set of messages
    ++and it's a good start for a new language contribution.
      
      Once you are done testing the translation (see below), commit the result
      and ask the l10n coordinator to pull from you.
    @@ po/README.md: and ask the l10n coordinator to pull from you.
     -of the l10n coordinator has newer "po/git.pot" file, you would need to first
     -pull from the l10n coordinator (see the beginning of this document for its
     -URL), and then update the existing translation by running:
    -+If there's an existing "XX.po" file for your language, but the l10n
    -+coordinator announced a new target release forthe "po/git.pot" file,
    -+you would need to first `make pot` against that release. See "Creating the "po/git.pot" file" above.
    -+
    -+Then update the existing translation by running, in the "po/"
    -+directory, where "XX.po" is the file you want to update:
    ++If you want to find new translatable strings in source files of upstream
    ++repository and propagate them to your "po/XX.po", run command:
      
      ```shell
     -msgmerge --add-location --backup=off -U XX.po git.pot
    -+msgmerge --no-location --backup=off -U XX.po git.pot
    ++make po-update PO_FILE=po/XX.po
      ```
      
     -in the "po/" directory, where "XX.po" is the file you want to update.
    -+Or, in the case of the temporary worktree described above:
    ++It will:
      
     -Once you are done testing the translation (see below), commit the result
     -and ask the l10n coordinator to pull from you.
    -+```shell
    -+msgmerge --no-location --backup=off -U XX.po /tmp/git-pot/po/git.pot
    -+```
    ++- Call "make pot" at runtime to generate new "po/git.pot" file
    ++- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
    ++  to update your "po/XX.po"
    ++- The "--add-location" option for msgmerge will add location lines,
    ++  and these location lines will help translation tools to location
    ++  translation context easily.
     +
    -+Or, if you use translation software such as Emacs's `po-mode.el` which
    -+allows you to open source code references skip the `--no-location` and
    -+instead add do:
    ++Once you are done testing the translation (see below), it's better
    ++to commit a location-less "po/XX.po" file to save repository space
    ++and make a user-friendly patch for review.
     +
    -+```shell
    -+msgmerge --backup=off -U XX.po git.pot
    -+```
    ++To save a location-less "po/XX.po" automatically in repository, you
    ++can:
     +
    -+Once you are done testing the translation (see below) remove the line
    -+generated numbers (if any) from the translation. You can skip this if
    -+you used `--no-location` above.
    - 
    -+To do this safely first commit your work in `XX.po`. Then:
    ++- Define new attribute for "po/XX.po" by adding new line in
    ++  ".git/info/attributes":
     +
    -+```shell
    -+msgcat --no-location XX.po >XX.po.tmp && mv -v XX.po.tmp XX.po
    -+```
    ++        /po/XX.po filter=gettext-no-location
    ++
    ++- Define driver for "gettext-no-location" filter:
     +
    -+This should result in a file where all the auto-generated line numbers
    -+have been removed, and `make check-po` should now pass. Now either
    -+commit it, or amend it into the commit you made earlier.
    ++        $ git config --global filter.gettext-no-location.clean \
    ++              "msgcat --no-location -"
     +
     +You're now ready to ask the l10n coordinator to pull from you.
      
    + 
      ## Fuzzy translation
    +@@ po/README.md: common errors, e.g. missing printf format strings, or translated
    + messages that deviate from the originals in whether they begin/end
    + with a newline or not.
      
    -@@ po/README.md: tag in the comment.
    - Before you submit your changes go back to the top-level and do:
    ++L10n coordinator will check your contributions using a helper program
    ++(see "PO helper" section below):
    ++
    ++```shell
    ++git-po-helper check-po po/XX.po
    ++git-po-helper check-commits <rev-list-opts>
    ++```
    ++
      
    - ```shell
    --make
    -+make all check-po
    - ```
    + ## Marking strings for translation
    + 
    +@@ po/README.md: l10n workflow.
    + To build and install the helper program from source, see
    + [git-po-helper/README][].
    + 
    +-Usage for git-po-helper:
    +-
    +-- To start a new language translation:
    +-
    +-  ```shell
    +-  git-po-helper init XX.po
    +-  ```
    +-
    +-- To update your "XX.po" file:
    +-
    +-  ```shell
    +-  git-po-helper update XX.po
    +-  ```
    +-
    +-- To check commit log and syntax of "XX.po":
    +-
    +-  ```shell
    +-  git-po-helper check-po XX.po
    +-  git-po-helper check-commits
    +-  ```
    +-
    +-Run "git-po-helper" without arguments to show usage.
    +-
    + 
    + ## Conventions
      
    - On systems with GNU gettext (i.e. not Solaris) this will compile your
     @@ po/README.md: additional conventions:
      - Initialize proper filename of the "XX.po" file conforming to
        iso-639 and iso-3166.
    @@ po/README.md: additional conventions:
      
      - Add a new entry in the "po/TEAMS" file with proper format, and check
        the syntax of "po/TEAMS" by running the following command:
    -
    - ## po/pot.header (deleted) ##
    -@@
    --# SOME DESCRIPTIVE TITLE.
    --# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
    --# This file is distributed under the same license as the PACKAGE package.
    --# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    --#
    --#, fuzzy
    --msgid ""
    --msgstr ""
    --"Project-Id-Version: PACKAGE VERSION\n"
    --"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
    --"POT-Creation-Date: 2022-04-19 17:54+0200\n"
    --"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    --"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    --"Language-Team: LANGUAGE <LL@li.org>\n"
    --"Language: \n"
    --"MIME-Version: 1.0\n"
    --"Content-Type: text/plain; charset=UTF-8\n"
    --"Content-Transfer-Encoding: 8bit\n"
    --"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
    -
    - ## shared.mak ##
    -@@ shared.mak: ifndef V
    - 	QUIET_CP       = @echo '   ' CP $@;
    - 	QUIET_LNCP     = @echo '   ' LN/CP $@;
    - 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
    -+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
    - 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
    - 	QUIET_GCOV     = @echo '   ' GCOV $@;
    - 	QUIET_SP       = @echo '   ' SP $<;
    -@@ shared.mak: ifndef V
    - ## Used in "Makefile" for po/
    - 	QUIET_CHECK_MSGCAT	= @echo '   ' MSGCAT $(MSGCAT_CHECK_FLAGS) $< \>$@;
    - 	QUIET_CHECK_PO		= @echo '   ' CHECK PO $@;
    -+	QUIET_PO_INIT		= @echo '   ' PO INIT $@;
    - 
    - ## Used in "Documentation/Makefile"
    - 	QUIET_ASCIIDOC	= @echo '   ' ASCIIDOC $@;
12:  22434ef36a <  -:  ---------- Makefile: avoid "sed" on C files that don't need it
---
Jiang Xin (3):
  Makefile: sort "po/git.pot" by file location
  Makefile: generate "po/git.pot" from stable LOCALIZED_C
  Makefile: add "po-update" rule to update po/XX.po
Ævar Arnfjörð Bjarmason (6):
  Makefile: have "make pot" not "reset --hard"
  i18n CI: stop allowing non-ASCII source messages in po/git.pot
  po/git.pot: don't check in result of "make pot"
  po/git.pot: remove this now generated file, see preceding commit
  Makefile: add "po-init" rule to initialize po/XX.po
  l10n: Document the new l10n workflow
 .gitignore                  |     1 +
 Makefile                    |   148 +-
 builtin/submodule--helper.c |     2 +-
 ci/run-static-analysis.sh   |     2 +
 po/.gitignore               |     2 +
 po/README.md                |   191 +-
 po/git.pot                  | 25151 ----------------------------------
 shared.mak                  |     2 +
 8 files changed, 221 insertions(+), 25278 deletions(-)
 delete mode 100644 po/git.pot
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore
From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Before feeding xgettext with more C souce files which may be ignored by various compiler conditions, add new option "--sort-by-file" to xgettext program to create stable message template file "po/git.pot".

With this update, the newly generated "po/git.pot" will has the same entries while in a different order. We won't checkin the newly generated "po/git.pot", because we will remove it from tree in a later commit.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 1 +
 1 file changed, 1 insertion(+)
Show changes to Makefile +1 −0
diff --git a/Makefile b/Makefile
index f8bccfab5e..83e968e2a4 100644
--- a/Makefile
+++ b/Makefile
@@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

When running "make pot" on different platform, we may get a different message template file "po/git.pot". This is because the "LOCALIZED_C" variable may have different C source files on different platforms or different compiler conditions.

We can make a stable "LOCALIZED_C" variable by applying patch snippets as follows:

     ifdef NO_LIBGEN_H
         COMPAT_CFLAGS += -DNO_LIBGEN_H
         COMPAT_OBJS += compat/basename.o
    +else
    +    LOCALIZED_C += compat/basename.c
     endif

But it is much simpler to use variables "$(FOUND_C_SOURCES)" and "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".

With this update, the newly generated "po/git.pot" will have 30 new entries coming from the following C source files:

 * compat/fsmonitor/fsm-listen-win32.c
 * compat/mingw.c
 * compat/regex/regcomp.c
 * compat/simple-ipc/ipc-win32.c
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Show changes to Makefile +2 −1
diff --git a/Makefile b/Makefile
index 83e968e2a4..60ca42c268 100644
--- a/Makefile
+++ b/Makefile
@@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
+LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
+	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 5/9] po/git.pot: don't check in result of "make pot"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Remove the "po/git.pot" file from being tracked, which started with dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13).

The reason the po/git.pot started being checked in was because the po/*.po files were changed a schema where we'd generate them from a known-good snapshot of po/git.pot, instead of each translator running "make pot" themselves.

This makes sense, but we don't need to carry this file in-tree just to achieve that aim, and doing so has resulted in a significant amount of "diff churn" since this method of doing it was introduced:

    $ git log -p --oneline -- po/git.pot|wc -l
    553743

We can instead let l10n contributors to generate "po/git.pot" in runtime to update their own "po/XX.po", and the l10n coordinator can check pull requests using CI pipeline.

This reverts to the schema introduced initially in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22).

The actual "git rm" of po/git.pot is deferred until the subsequent commit, to make this change easier to review, and to preempt the mailing list from blocking it due to it being too large.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile      | 1 +
 po/.gitignore | 1 +
 2 files changed, 2 insertions(+)
Show changes to 2 files +2 −0

Makefile, po/.gitignore

diff --git a/Makefile b/Makefile
index 4b7cb2be65..2f28648900 100644
--- a/Makefile
+++ b/Makefile
@@ -3312,6 +3312,7 @@ dist-doc: git$X
 
 distclean: clean
 	$(RM) configure
+	$(RM) po/git.pot
 	$(RM) config.log config.status config.cache
 	$(RM) config.mak.autogen config.mak.append
 	$(RM) -r autom4te.cache
diff --git a/po/.gitignore b/po/.gitignore
index 796b96d1c4..37d1301b32 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1 +1,2 @@
 /build
+/git.pot
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 3/9] Makefile: have "make pot" not "reset --hard"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our custom PRItime format, 2017-07-20) we'd consider source files as-is with gettext, but because we need to understand PRItime in the same way that gettext itself understands PRIuMAX we'd first check if we had a clean checkout, then munge all of the processed files in-place with "sed", generate "po/git.pot", and then finally "reset --hard" to undo our changes.

By generating "pot" snippets in ".build/pot/po" for each source file and rewriting certain source files with PRItime macros to temporary files in ".build/pot/po", we can avoid running "make pot" by altering files in place and doing a "reset --hard" afterwards.

This speed of "make pot" is slower than before on an initial run, because we run "xgettext" many times (once per source file), but it can be boosted by parallelization. It is *much* faster for incremental runs, and will allow us to implement related targets in subsequent commits.

When the "pot" target was originally added in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
re-generation of the po/git.pot if nothing had to be done.

Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked target, 2014-08-22) when it was made to depend on "FORCE". I.e. the Makefile's dependency resolution inherently can't handle incremental building when the target file may be updated by git (or something else external to "make"). But this case no longer applies, so FORCE is no longer needed.

That out of the way, the main logic change here is getting rid of the "reset --hard":

We'll generate intermediate .build/pot/po/%.po files from %, which is handy to see at a glance what strings (if any) in a given file are marked for translation:

	$ make .build/pot/po/pretty.c.po
	[...]
	$ cat .build/pot/po/pretty.c.po
	#: pretty.c:1051
	msgid "unable to parse --pretty format"
	msgstr ""
	$

For these C source files which contain the PRItime macros, we will create temporary munged *.c files in a tree in ".build/pot/po" corresponding to our source tree, and have "xgettext" consider those. The rule needs to be careful to "(cd .build/pot/po && ...)", because otherwise the comments in the po/git.pot file wouldn't refer to the correct source locations (they'd be prefixed with ".build/pot/po").

This changes the output of the generated po/git.pot file in one minor way: Because we're using msgcat(1) instead of xgettext(1) to concatenate the output we'll now disambiguate where "TRANSLATORS" comments come from, in cases where a message is the same in N files, and either only one has a "TRANSLATORS" comment, or they're different. E.g. for the "Your edited hunk[...]" message we'll now apply this change (comment content elided):

	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	 #: add-patch.c:1253 git-add--interactive.perl:1244
	 msgid ""
	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
	 msgstr ""

There are six such changes, and they all make the context more understandable, as msgcat(1) is better at handling these edge cases than xgettext(1)'s previously used "--join-existing" flag.

While we could rename the "pot" snippets without the ".po" extention to use more intuitive filenames in the comments, but that will confuse the IDE with lots of invalid C or perl source files in ".build/pot/po" directory.

The addition of "--omit-header" option for xgettext makes the "pot" snippets in ".build/pot/po/*.po" smaller. For the pot header of "po/git.pot", we use xgettext to generate a "pot" header file ".build/pot/git.header" from an empty file at runtime, and use this header to assemble "po/git.pot".

But as we'll see in a subsequent commit this header behavior has been hiding an encoding-related bug from us, so let's carry it forward instead of re-generating it with xgettext(1).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 .gitignore |  1 +
 Makefile   | 73 ++++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 53 insertions(+), 21 deletions(-)
Show changes to 2 files +53 −21

.gitignore, Makefile

diff --git a/.gitignore b/.gitignore
index e81de1063a..a452215764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@
 *.[aos]
 *.o.json
 *.py[co]
+.build/
 .depend/
 *.gcda
 *.gcno
diff --git a/Makefile b/Makefile
index 60ca42c268..c32ac4ca30 100644
--- a/Makefile
+++ b/Makefile
@@ -569,6 +569,7 @@ INSTALL = install
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
+MSGCAT = msgcat
 MSGFMT = msgfmt
 CURL_CONFIG = curl-config
 GCOV = gcov
@@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--package-name=Git \
 	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
@@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
+MSGCAT_FLAGS = --sort-by-file
 LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
 	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2726,34 +2729,61 @@ LOCALIZED_SH += t/t0200/test.sh
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-## Note that this is meant to be run only by the localization coordinator
-## under a very controlled condition, i.e. (1) it is to be run in a
-## Git repository (not a tarball extract), (2) any local modifications
-## will be lost.
+## We generate intermediate .build/pot/po/%.po files containing a
+## extract of the translations we find in each file in the source
+## tree. We will assemble them using msgcat to create the final
+## "po/git.pot" file.
+LOCALIZED_ALL_GEN_PO =
+
+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
+
+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
+
+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
+
 ## Gettext tools cannot work with our own custom PRItime type, so
 ## we replace PRItime with PRIuMAX.  We need to update this to
 ## PRIdMAX if we switch to a signed type later.
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT) \
+	    if grep -q PRItime $<; then \
+		(\
+			sed -e 's|PRItime|PRIuMAX|g' <$< \
+				>.build/pot/po/$< && \
+			cd .build/pot/po && \
+			$(XGETTEXT) --omit-header \
+				-o $(@:.build/pot/po/%=%) \
+				$(XGETTEXT_FLAGS_C) $< && \
+			rm $<; \
+		); \
+	    else \
+		$(XGETTEXT) --omit-header \
+			-o $@ $(XGETTEXT_FLAGS_C) $<; \
+	    fi
 
-po/git.pot: $(GENERATED_H) FORCE
-	# All modifications will be reverted at the end, so we do not
-	# want to have any local change.
-	git diff --quiet HEAD && git diff --quiet --cached
+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_SH) $<
 
-	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
-	do \
-		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
-		cat "$$s+" >"$$s" && rm "$$s+"; \
-	done
+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_PERL) $<
 
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
-		$(LOCALIZED_SH)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
-		$(LOCALIZED_PERL)
+.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+		-o - /dev/null | \
+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
 
-	# Reverting the munged source, leaving only the updated $@
-	git reset --hard
-	mv $@+ $@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3292,6 +3322,7 @@ cocciclean:
 	$(RM) contrib/coccinelle/*.cocci.patch*
 
 clean: profile-clean coverage-clean cocciclean
+	$(RM) -r .build
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 7/9] Makefile: add "po-update" rule to update po/XX.po

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Since there is no longer a "po/git.pot" file in tree, a l10n team leader has to run several commands to update their "po/XX.po" file:

    $ make pot
    $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot

To make this process easier, add a new rule so that l10n team leaders can update their "po/XX.po" with one command. E.g.:

    $ make po-update PO_FILE=po/zh_CN.po
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile   | 16 ++++++++++++++++
 shared.mak |  1 +
 2 files changed, 17 insertions(+)
Show changes to 2 files +17 −0

Makefile, shared.mak

diff --git a/Makefile b/Makefile
index 2f28648900..7c808b910d 100644
--- a/Makefile
+++ b/Makefile
@@ -571,6 +571,7 @@ TCLTK_PATH = wish
 XGETTEXT = xgettext
 MSGCAT = msgcat
 MSGFMT = msgfmt
+MSGMERGE = msgmerge
 CURL_CONFIG = curl-config
 GCOV = gcov
 STRIP = strip
@@ -2716,6 +2717,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 MSGCAT_FLAGS = --sort-by-file
+MSGMERGE_FLAGS = --add-location --backup=off --update
 LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
 	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2787,6 +2789,20 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+po-update: po/git.pot
+ifndef PO_FILE
+	$(error not define variable "PO_FILE")
+else
+ifeq ($(filter po/%.po,$(PO_FILE)),)
+	$(error PO_FILE should match pattern: "po/%.po")
+endif
+endif
+	@if test ! -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) does not exist"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
+
 .PHONY: check-pot
 check-pot: pot
 
diff --git a/shared.mak b/shared.mak
index 50d4596f0d..8cd170a7e7 100644
--- a/shared.mak
+++ b/shared.mak
@@ -63,6 +63,7 @@ ifndef V
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
+	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
 	QUIET_SP       = @echo '   ' SP $<;
 	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 9/9] l10n: Document the new l10n workflow

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Change the "flow" of how translators interact with the l10n repository at [1] to adjust it for a new workflow of not having a po/git.pot file in-tree at all, and to not commit line numbers to the po/*.po files that we do track in tree.

The current workflow was added in a combination of dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) and 271ce198cd0 (Update l10n guide, 2012-02-29).

As noted in preceding commits I think that it came about due to technical debt I'd left behind in how the "po/git.pot" file was created, and a mis-impression that the file:line comments were needed as anything more than a transitory translation aid.

As the updated po/README.md shows the new workflow is substantially the same, the difference is that translators no longer need to initially pull from the l10n coordinator for a new po/git.pot, they can simply use git.git's canonical source repository.

The l10n coordinator is still expected to announce a release to translate, which presumably would always be Junio's latest release tag. I'm not certain if this part of the process is actually important. I.e. the delta translation-wise between that tag and "master" is usually pretty small, so perhaps translators can just work on "master" instead.

1. https://github.com/git-l10n/git-po/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/README.md | 191 ++++++++++++++++++++++++---------------------------
 1 file changed, 88 insertions(+), 103 deletions(-)
Show changes to po/README.md +88 −103
diff --git a/po/README.md b/po/README.md
index 19fabb4acf..00c090e7c0 100644
--- a/po/README.md
+++ b/po/README.md
@@ -46,65 +46,67 @@ for a new language translation. Because there are more than 5000 messages
 in the template message file "po/git.pot" that need to be translated,
 this is not a piece of cake for the contributor for a new language.
 
-The core template message file which contains a small set of messages
-will be generated in "po-core/core.pot" automatically by running a helper
-program named "git-po-helper" (described later).
+The "core" set of messages can be generated at "po/git-core.pot" by
+running:
 
 ```shell
-git-po-helper init --core XX.po
+make core-pot
 ```
 
-After translating the generated "po-core/XX.po", you can merge it to
-"po/XX.po" using the following commands:
-
-```shell
-msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
-mv /tmp/XX.po po/XX.po
-git-po-helper update XX.po
-```
-
-Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
-translated messages and duplicate messages.
+And then proceeding with the rest of these instructions on the new
+generated "po/git-core.pot" file.
 
 
 ## Translation Process Flow
 
 The overall data-flow looks like this:
 
-    +-------------------+            +------------------+
-    | Git source code   | ---(1)---> | L10n coordinator |
-    | repository        | <---(4)--- | repository       |
-    +-------------------+            +------------------+
-                                          |      ^
-                                         (2)    (3)
-                                          V      |
-                                     +------------------+
-                                     | Language Team XX |
-                                     +------------------+
+    +-------------------+             +------------------+
+    | Git source code   | ----(2)---> | L10n coordinator |
+    | repository        | <---(5)---- | repository       |
+    +-------------------+             +------------------+
+                    |                     |    ^
+                   (1)                   (3)  (4)
+                    V                     v    |
+               +----------------------------------+
+               |        Language Team XX          |
+               +----------------------------------+
 
 - Translatable strings are marked in the source file.
-- L10n coordinator pulls from the source (1)
-- L10n coordinator updates the message template "po/git.pot"
-- Language team pulls from L10n coordinator (2)
-- Language team updates the message file "po/XX.po"
-- L10n coordinator pulls from Language team (3)
-- L10n coordinator asks the result to be pulled (4).
+- Language teams can start translation iterations at any time, even
+  before the l10n window opens:
+
+  + Pull from the source (1)
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
 
+- The L10n coordinator pulls from source and announces the l10n window
+  open (2)
+- Language team pulls from the l10n coordinator, starts another
+  translation iteration against the l10n coordinator's tree (3)
 
-## Maintaining the "po/git.pot" file
+  + Run "git pull --rebase" from the l10n coordinator
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
+  + Squash trivial l10n git commits using "git rebase -i"
 
-(This is done by the l10n coordinator).
+- Language team sends pull request to the l10n coordinator (4)
+- L10n coordinator checks and merges
+- L10n coordinator asks the result to be pulled (5).
 
-The "po/git.pot" file contains a message catalog extracted from Git's
-sources. The l10n coordinator maintains it by adding new translations with
-msginit(1), or update existing ones with msgmerge(1).  In order to update
-the Git sources to extract the messages from, the l10n coordinator is
-expected to pull from the main git repository at strategic point in
-history (e.g. when a major release and release candidates are tagged),
-and then run "make pot" at the top-level directory.
 
-Language contributors use this file to prepare translations for their
-language, but they are not expected to modify it.
+## Creating the "po/git.pot" file
+
+The "po/git.pot" file, once generated by the the l10n coordinator had
+been removed from the tree. L10n contributors can generated it at
+runtime using command:
+
+```shell
+make pot
+```
+
+Then language contributors use this file to prepare translations for
+their language, but they are not expected to modify it.
 
 
 ## Initializing a "XX.po" file
@@ -115,32 +117,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
 you add a translation for the first time by running:
 
 ```shell
-msginit --locale=XX
-```
-
-in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
-"zh\_CN", etc.
-
-Then edit the automatically generated copyright info in your new "XX.po"
-to be correct, e.g. for Icelandic:
-
-```diff
-@@ -1,6 +1,6 @@
--# Icelandic translations for PACKAGE package.
--# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
--# This file is distributed under the same license as the PACKAGE package.
-+# Icelandic translations for Git.
-+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-+# This file is distributed under the same license as the Git package.
- # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
+make po-init PO_FILE=po/XX.po
 ```
 
-And change references to PACKAGE VERSION in the PO Header Entry to
-just "Git":
+Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
 
-```shell
-perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
-```
+The newly generated message file "po/XX.po" is based on the core pot
+file "po/git-core.pot", so it contains only a minimal set of messages
+and it's a good start for a new language contribution.
 
 Once you are done testing the translation (see below), commit the result
 and ask the l10n coordinator to pull from you.
@@ -153,19 +137,40 @@ and ask the l10n coordinator to pull from you.
 If you are replacing translation strings in an existing "XX.po" file to
 improve the translation, just edit the file.
 
-If there's an existing "XX.po" file for your language, but the repository
-of the l10n coordinator has newer "po/git.pot" file, you would need to first
-pull from the l10n coordinator (see the beginning of this document for its
-URL), and then update the existing translation by running:
+If you want to find new translatable strings in source files of upstream
+repository and propagate them to your "po/XX.po", run command:
 
 ```shell
-msgmerge --add-location --backup=off -U XX.po git.pot
+make po-update PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where "XX.po" is the file you want to update.
+It will:
 
-Once you are done testing the translation (see below), commit the result
-and ask the l10n coordinator to pull from you.
+- Call "make pot" at runtime to generate new "po/git.pot" file
+- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
+  to update your "po/XX.po"
+- The "--add-location" option for msgmerge will add location lines,
+  and these location lines will help translation tools to location
+  translation context easily.
+
+Once you are done testing the translation (see below), it's better
+to commit a location-less "po/XX.po" file to save repository space
+and make a user-friendly patch for review.
+
+To save a location-less "po/XX.po" automatically in repository, you
+can:
+
+- Define new attribute for "po/XX.po" by adding new line in
+  ".git/info/attributes":
+
+        /po/XX.po filter=gettext-no-location
+
+- Define driver for "gettext-no-location" filter:
+
+        $ git config --global filter.gettext-no-location.clean \
+              "msgcat --no-location -"
+
+You're now ready to ask the l10n coordinator to pull from you.
 
 
 ## Fuzzy translation
@@ -196,6 +201,14 @@ common errors, e.g. missing printf format strings, or translated
 messages that deviate from the originals in whether they begin/end
 with a newline or not.
 
+L10n coordinator will check your contributions using a helper program
+(see "PO helper" section below):
+
+```shell
+git-po-helper check-po po/XX.po
+git-po-helper check-commits <rev-list-opts>
+```
+
 
 ## Marking strings for translation
 
@@ -370,29 +383,6 @@ l10n workflow.
 To build and install the helper program from source, see
 [git-po-helper/README][].
 
-Usage for git-po-helper:
-
-- To start a new language translation:
-
-  ```shell
-  git-po-helper init XX.po
-  ```
-
-- To update your "XX.po" file:
-
-  ```shell
-  git-po-helper update XX.po
-  ```
-
-- To check commit log and syntax of "XX.po":
-
-  ```shell
-  git-po-helper check-po XX.po
-  git-po-helper check-commits
-  ```
-
-Run "git-po-helper" without arguments to show usage.
-
 
 ## Conventions
 
@@ -436,13 +426,8 @@ additional conventions:
 - Initialize proper filename of the "XX.po" file conforming to
   iso-639 and iso-3166.
 
-- Must complete a minimal translation based on the "po-core/core.pot"
-  template. Using the following command to initialize the minimal
-  "po-core/XX.po" file:
-
-  ```shell
-  git-po-helper init --core <your-language>
-  ```
+- Must complete a minimal translation based on the "Core
+  translation". See that section above.
 
 - Add a new entry in the "po/TEAMS" file with proper format, and check
   the syntax of "po/TEAMS" by running the following command:
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 8/9] Makefile: add "po-init" rule to initialize po/XX.po

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

The core translation is the minimum set of work that must be done for a new language translation.

There are over 5000 messages in the template message file "po/git.pot" that need to be translated. It is not a piece of cake for such a huge workload. So we used to define a small set of messages called "core translation" that a new l10n contributor must complete before sending pull request to the l10n coordinator.

By pulling in some parts of the git-po-helper[^1] logic, we add rule "core-pot" to create this core translation message "po/git-core.pot":

    make core-pot

To help new l10n contributors to initialized their "po/XX.pot" from "po/git-core.pot", we also add new rules "po-init":

    make po-init POT_FILE=po/XX.po
[^1]: https://github.com/git-l10n/git-po-helper/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile      | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 po/.gitignore |  1 +
 shared.mak    |  1 +
 3 files changed, 52 insertions(+)
Show changes to 3 files +52 −0

Makefile, po/.gitignore, shared.mak

diff --git a/Makefile b/Makefile
index 7c808b910d..b7b65ac706 100644
--- a/Makefile
+++ b/Makefile
@@ -2799,6 +2799,7 @@ endif
 endif
 	@if test ! -e $(PO_FILE); then \
 		echo >&2 "error: $(PO_FILE) does not exist"; \
+		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
 		exit 1; \
 	fi
 	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
@@ -2806,6 +2807,55 @@ endif
 .PHONY: check-pot
 check-pot: pot
 
+### TODO FIXME: Translating everything in these files is a bad
+### heuristic for "core", as we'll translate obscure error() messages
+### along with commonly seen i18n messages. A better heuristic would
+### be to e.g. use spatch to first remove error/die/warning
+### etc. messages.
+LOCALIZED_C_CORE =
+LOCALIZED_C_CORE += builtin/checkout.c
+LOCALIZED_C_CORE += builtin/clone.c
+LOCALIZED_C_CORE += builtin/index-pack.c
+LOCALIZED_C_CORE += builtin/push.c
+LOCALIZED_C_CORE += builtin/reset.c
+LOCALIZED_C_CORE += remote.c
+LOCALIZED_C_CORE += wt-status.c
+
+LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
+
+.PHONY: core-pot
+core-pot: po/git-core.pot
+
+.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+		-o - /dev/null | \
+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
+
+po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
+
+.PHONY: po-init
+po-init: po/git-core.pot
+ifndef PO_FILE
+	$(error not define variable "PO_FILE")
+else
+ifeq ($(filter po/%.po,$(PO_FILE)),)
+	$(error PO_FILE should match pattern: "po/%.po")
+endif
+endif
+	@if test -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) exists already"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGINIT)msginit \
+		--input=$< \
+		--output=$(PO_FILE) \
+		--no-translator \
+		--locale=$(PO_FILE:po/%.po=%)
+
+## po/*.po files & their rules
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/po/.gitignore b/po/.gitignore
index 37d1301b32..ff0e5176a6 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,2 +1,3 @@
 /build
 /git.pot
+/git-core.pot
diff --git a/shared.mak b/shared.mak
index 8cd170a7e7..4330192e9c 100644
--- a/shared.mak
+++ b/shared.mak
@@ -62,6 +62,7 @@ ifndef V
 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 4/9] i18n CI: stop allowing non-ASCII source messages in po/git.pot

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

In the preceding commit we moved away from using xgettext(1) to both generate the po/git.pot, and to merge the incrementally generated po/git.pot+ file as we sourced translations from C, shell and Perl.

Doing it this way, which dates back to my initial implementation[1][2][3] was conflating two things: With xgettext(1) the --from-code both controls what encoding is specified in the po/git.pot's header, and what encoding we allow in source messages.

We don't ever want to allow non-ASCII in *source messages*, and doing so has hid e.g. a buggy message introduced in a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C, 2021-08-10) from us, we'd warn about it before, but only when running "make pot", but the operation would still succeed. Now we'll error out on it when running "make pot".

Since the preceding Makefile changes made this easy: let's add a "make check-pot" target and run it as part of the "static-analysis" CI target, this will ensure that we catch any such issues in the future.

1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
   marked for translation, 2011-02-22)
2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
   2011-05-14)
3. 5e9637c6297 (i18n: add infrastructure for translating Git with
   gettext, 2011-11-18)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile                    | 6 ++++--
 builtin/submodule--helper.c | 2 +-
 ci/run-static-analysis.sh   | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)
Show changes to 3 files +7 −3

Makefile, builtin/submodule--helper.c, ci/run-static-analysis.sh

diff --git a/Makefile b/Makefile
index c32ac4ca30..4b7cb2be65 100644
--- a/Makefile
+++ b/Makefile
@@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 	--package-name=Git \
-	--sort-by-file \
-	--from-code=UTF-8
+	--sort-by-file
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
@@ -2788,6 +2787,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+.PHONY: check-pot
+check-pot: pot
+
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2c87ef9364..b97f02eed5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
 			   N_("reference repository")),
 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
-			   N_("sets the submodule’s name to the given string "
+			   N_("sets the submodule's name to the given string "
 			      "instead of defaulting to its path")),
 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
 		OPT_END()
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 65bcebda41..0d51e5ce0e 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -29,4 +29,6 @@ fi
 make hdr-check ||
 exit 1
 
+make check-pot
+
 save_good_tree
-- 
2.35.1.577.g74cc1aa55f
Jiang Xin· May 3, 2022, 13:23 UTC · re: Jiang Xin · lore

[PATCH 6/9] po/git.pot: remove this now generated file, see preceding commit

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot
Show changes to po/git.pot +0 −9449
diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"a - stash this hunk and all later hunks in the file\n"
-"d - do not stash this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-msgid ""
-"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
-"as appropriate to mark resolution and make a commit."
-msgstr ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-msgid ""
-"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
-msgstr ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#
Peter Krefting· May 3, 2022, 14:07 UTC · re: Jiang Xin · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Tue, 3 May 2022, Jiang Xin wrote:
> Ævar and I started discussing this topic (incremental po/git.pot update
> and new l10n workflow) on a GitHub issue[^1] a month ago. There are
> several improvements to the l10n workflow:

I do agree that checking in git.pot does create a lot of noise, but ther are other ways of fixing that than deleting the file completely. I am also translating for dpkg, and there they run "xgettext --add-location=file" to remove the line numbers from the POT and PO files (requires GNU gettext 0.19; they also use "po4a --porefs=noline" for manual page translations, but we do not have translation for manual pages for Git, yet). This reduces diff noise considerably.

I have been doing updates semi-off-line from my laptop for the last few months, without a proper build environment, and having the history for the POT file available for diffing has been useful.

> * L10n contributors can start translations at any time, even before the
>  l10n announcing l10n window open. We must have a new l10n workflow,
>  see patch 9/9.

You can always re-generate the POT file locally and not commit it, to update the PO files. That has not been a problem.

-- 
\\// Peter - http://www.softwolves.pp.se/
Jiang Xin· May 4, 2022, 12:41 UTC · re: Peter Krefting · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Tue, 3 May 2022, Peter Krefting  wrote:
Show 7 quoted lines
> I do agree that checking in git.pot does create a lot of noise, but ther are
> other ways of fixing that than deleting the file completely. I am also
> translating for dpkg, and there they run "xgettext --add-location=file" to
> remove the line numbers from the POT and PO files (requires GNU gettext
> 0.19; they also use "po4a --porefs=noline" for manual page translations, but
> we do not have translation for manual pages for Git, yet). This reduces diff
> noise considerably.

To evaluate the impact of different formats of po files on the size of the repository, I tailored the git repository with only "po/*" files with history, and all "*.po" files are converted using "msgcat" into different format in 3 different branches. See:

    https://github.com/jiangxin/git-po-filtered
* For po files with file-location:
        $ git clone --single-branch \
            --branch po-with-file-location \
            git@github.com:jiangxin/git-po-filtered.git \
            po-with-file-location
        $ du -sh po-with-file-location/.git/objects 
          28M    po-with-file-location/.git/objects
* For po files with file name only:
        $ git clone --single-branch \
            --branch po-with-file \
            git@github.com:jiangxin/git-po-filtered.git \
            po-with-file
        $ du -sh po-with-file/.git/objects 
         6.1M    po-with-file/.git/objects
* For po files without file-location:
        $ git clone --single-branch \
            --branch po-no-file-location \
            git@github.com:jiangxin/git-po-filtered.git \
            po-no-file-location
        $ du -sh po-no-file-location/.git/objects
         6.2M    po-no-file-location/.git/objects

From the above command output we can see that by removing line numbers from po files, the size of the repository can be greatly reduced.

> I have been doing updates semi-off-line from my laptop for the last few
> months, without a proper build environment, and having the history for the
> POT file available for diffing has been useful.
> 

"po/git.pot" will be generated periodically at the following location, where you can get "po/git.pot" if you don't have a build environment at hand.

 * https://github.com/git-l10n/git-po/tree/pot/master/po
Show 6 quoted lines
> > * L10n contributors can start translations at any time, even before the
> >  l10n announcing l10n window open. We must have a new l10n workflow,
> >  see patch 9/9.
> 
> You can always re-generate the POT file locally and not commit it, to update
> the PO files. That has not been a problem.

File-location meta info in po file can help l10n tools to locate context easily. E.g.: When editing po file using Emacs (with po-mode), press the key "s" (source) will open another window showing context of the specific l10n message.

But if there is no file-location in "po/git.pot", we have no way to generate po/XX.po with proper file-location. While if we store po/git.pot with file location in git repository, repository size will get biger and biger. As how to commit a po/XX.po without file locaiton automatically, we add some instructions in patch 9/9, and we can also rewrite l10n CI pipeline to validate po files from l10n contributors.

-- Jiang Xin

Junio C Hamano· May 4, 2022, 14:35 UTC · re: Jiang Xin · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

Jiang Xin <worldhello.net@gmail.com> writes:
Show 9 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> Ævar and I started discussing this topic (incremental po/git.pot update
> and new l10n workflow) on a GitHub issue[^1] a month ago. There are
> several improvements to the l10n workflow:
>
> * Variable "LOCALIZED_C" is not stable, that cause the "po/git.pot" file
>   generated by different user may have different number of entries.
>   This issues is fixed in patch 2/9.

Allowing translators to pick a random point in the history and run the tool to generate .pot file locally creates that problem for us. It also means that various .po files would correspond to slightly different versions of the source tree.

The "only the coordinator updates .pot, everybody works off of that file" was one way to ensure that you do not have to worry about these two problems.

So, if you are moving to the "no .pot file committed in-tree, translators generate .pot for themselves" model, you do need to make sure you have consistent set of files to localize. So [2/9] does try to fix an issue worth solving (assuming that the new model is what i18n/l10n team members want).

I am not sure what your plans are to make sure everybody works off of the same version, though. Even if you scrape the source tree for source files that may not be relevant to your build, if you do not start off of the same version, your set of sources may be a bit off compared to the other translators'.

> * Generate "po/git.pot" in an incremental way, so we do not need to munge
>   source files in-place, do not need a clean checkout, and do not need
>   "reset --hard". See patch 3/9.
That may be a worthwhile thing to do.  I have no strong opinions.
> * Remove file "po/git.pot" from tree. It can be generated at runtime.
>   See patch 5/9, 6/9.

Another reason, IIRC, why we adopted "the coordinator prepares pot" model, in addition to the stability of the source and .pot file across languages, was because we wanted to reduce the load on language team. It also may be handy to be able to view "git log -p" on the file, as long as we somehow reduce the patch noise (perhaps by stripping the line numbers that are constantly changing).

Again, assuming that i18n/l10n team members are OK with this, I have no complaints.

Show 9 quoted lines
> * L10n contributors can update theire "po/XX.pot" using:
>   "make po-update PO_FILE=po/XX.po". See patch 7/9.
>
> * L10n contributors for new language can initialize "po/XX.pot" using:
>   "make po-init PO_FILE=po/XX.po". See patch 8/9.
>
> * L10n contributors can start translations at any time, even before the
>   l10n announcing l10n window open. We must have a new l10n workflow,
>   see patch 9/9.

Is it truly OK for the language packs for Git 2.36 to be prepared from v2.36.0~27 for French while German are done using v2.36.0~12? Again, if there is no practical downside for doing so that worries the i18n/l10n team members, I have no real complaints, but this is the one that worries me the most, actually, in the whole thing.

Thanks for working on this topic, both of you.
Daniel Santos· May 4, 2022, 14:51 UTC · re: Junio C Hamano · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

I haven't applied the patches and, for me, the prior workflow has no issues.

Improving the po files in order to not have the 'diff noise' is something that I consider ok, but still, I also don't see problems with how it is now. So, it is the only thing that I consider an improvement, from what I have read.

I believe in eliminating work for the translation team, as much as possible, not in increasing our work load.

The translation file is already big enough, in terms of translation needing to be done.

Jiang Xin· May 5, 2022, 00:20 UTC · re: Daniel Santos · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Wed, May 4, 2022 at 11:03 PM Daniel Santos <dacs.git@brilhante.top> wrote:
Show 8 quoted lines
>
> I haven't applied the patches and, for me, the prior workflow has no
> issues.
>
> Improving the po files in order to not have the 'diff noise' is
> something that I consider ok, but still, I also don't see problems
> with how it is now. So, it is the only thing that I consider an
> improvement, from what I have read.

A new git clone of git.git is about 150MB in size, while the "po/" history occupies 28MB. By removing the location line numbers, the size can be reduced from 28MB to 6MB.

See: https://lore.kernel.org/git/20220504124121.12683-1-worldhello.net@gmail.com/

-- Jiang Xin

Daniel Santos· May 5, 2022, 22:00 UTC · re: Jiang Xin · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Thu, May 05, 2022 at 08:20:13AM +0800, Jiang Xin wrote:
Show 6 quoted lines
> 
> A new git clone of git.git is about 150MB in size, while the "po/"
> history occupies 28MB. By removing the location line numbers,
> the size can be reduced from 28MB to 6MB.
> 
> See: https://lore.kernel.org/git/20220504124121.12683-1-worldhello.net@gmail.com/

That is an improvement of size only for few people. On GNU/Linux install of git by most users is done through packages, and most git users of other OS, also will not receive this improvement.

Have you considered how the removal of these lines from the po files will affect the quality of the translation work?

For new translator, not having these lines might make them less prone to understand po files usage in C? And probably make them contribute less to i18n C code?

Has these implementation upgrade better benefits than counter effects?
It is worth discussing this.

Also, I don't believe Github issue is the proper way to discuss about this in the beginning. It cannot be expected to make everyone on board with this modification of workflowm being discussed on a web service website obscure issue, that needs login. We have a mailing list that is to be used for this purpose.

I feel less part of this community, with important issues happening on Github issues.

Junio C Hamano· May 5, 2022, 22:49 UTC · re: Daniel Santos · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

Daniel Santos <dacs.git@brilhante.top> writes:
Show 10 quoted lines
> It is worth discussing this.
>
> Also, I don't believe Github issue is the proper way to discuss about
> this in the beginning. It cannot be expected to make everyone on board
> with this modification of workflowm being discussed on a web service
> website obscure issue, that needs login. We have a mailing list that
> is to be used for this purpose.
>
> I feel less part of this community, with important issues happening on
> Github issues.

While I understand the sentiment, after reading that issues page, I actually have a totally different impression.

Step back and take a deep breath, and let me ask you the same question under a few hypothetical settings:

 * Imagine that Ævar have been working on this series alone, without
   help from Jiang.  He did some brainstorming with himself to
   polish the ideas, cleaned up the code, etc. in his own head,
   perhaps with help from some automated tools and CI.  And after
   working for a month, sent this as a patch series to be reviewed
   to the list?  Do you feel excluded for not being invited for an
   early review?  I would guess not.  I certainly don't feel
   excluded myself.
 * What if he, during the course of the above month working on this
   topic, asked for a help from a specific person of his choice?
   Perhaps Jiang was visiting the same part of the world and they
   talked about the series in person, private over a glass of beer
   or two?  Do you feel excluded that you didn't have a chance to
   join this discussion?  I would guess not.  I certainly don't feel
   excluded myself.
 * What if that exchange of ideas and help to polish the series was
   done virtually, and the medium of choice between the two happened
   to be GitHub issues?  Do you now suddenly feel excluded?  I do
   not feel excluded myself, but do you?

The way I read that issues page, I think the exchange between them falls squarely into that category. They are not pretending to make "project decisions". They are preparing a proposal to bring forward to the project participants. During the course of their conversation, they may express their opinions on how better to serve the audience as if they were a fact, but that is something you can dispute once the proposal comes out to the list.

In other words, we should treat this just another patch series to be reviewed, instead of "two important people in Git i18n/l10n are presenting fait-accompli to the community". I do not see a problem in that.

As long as they do not duck a valid question about anything in the series with "well that has been decided long ago while we prepared this series and it is too late to change now", that is.

And I do not think anything like that has happened yet so far.

So, yes, please discuss and see a consensus form among i18n/l10n stakeholders. Perhaps some of the design decisions they made are based on different values from you have (e.g. you highly value the line numbers, while they justify the removal with reduced size) and it is a fair discussion to have if the decisions the patch series makes is based on the right balance between pros-and-cons.

Thanks.
Jiang Xin· May 6, 2022, 00:50 UTC · re: Daniel Santos · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Fri, May 6, 2022 at 6:01 AM Daniel Santos <dacs.git@brilhante.top> wrote:
Show 12 quoted lines
>
> On Thu, May 05, 2022 at 08:20:13AM +0800, Jiang Xin wrote:
> >
> > A new git clone of git.git is about 150MB in size, while the "po/"
> > history occupies 28MB. By removing the location line numbers,
> > the size can be reduced from 28MB to 6MB.
> >
> > See: https://lore.kernel.org/git/20220504124121.12683-1-worldhello.net@gmail.com/
>
> That is an improvement of size only for few people. On GNU/Linux
> install of git by most users is done through packages, and most git
> users of other OS, also will not receive this improvement.

We, l10n contributors, only need to make a small setup to our local repository, and we can avoid uncontrolled growth of files under "po/", resulting in more than 50% of the Git repository capacity coming from l10n a day. See patch 9/9 or this link:

 * https://github.com/jiangxin/git/blob/avar/new-l10n-workflow/po/README.md?plain=1#L160-L171
Show 5 quoted lines
> Have you considered how the removal of these lines from the po files
> will affect the quality of the translation work?
> For new translator, not having these lines might make them less prone
> to understand po files usage in C?
> And probably make them contribute less to i18n C code?

The location numbers will always be there in your po/pt_PT.po. Please read:

 * https://github.com/jiangxin/git/blob/review/avar/po/README.md?plain=1#L133-L158
> Has these implementation upgrade better benefits than counter effects?
>
> It is worth discussing this.
The new l10n workflow is open for discussion, see patch 9/9 or this link:
 * https://github.com/jiangxin/git/blob/avar/new-l10n-workflow/po/README.md?plain=1#L60-L95

-- Jiang Xin

Jiang Xin· May 5, 2022, 00:07 UTC · re: Junio C Hamano · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

On Wed, May 4, 2022 at 10:35 PM Junio C Hamano <gitster@pobox.com> wrote:
> Allowing translators to pick a random point in the history and run
> the tool to generate .pot file locally creates that problem for us.
> It also means that various .po files would correspond to slightly
> different versions of the source tree.

As Peter said [^1], even keeping "po/git.pot" unremoved, we can always regenerate the POT file locally instead of committing it, to update the PO file. We can add new checkpoints in l10n CI pipeline to check the baseline for each PO file.

[^1]: https://lore.kernel.org/git/cb74f3b-c2e9-947f-8f89-f51e79b17825@softwolves.pp.se/
> The "only the coordinator updates .pot, everybody works off of that
> file" was one way to ensure that you do not have to worry about these
> two problems.

In the reply to Peter [^2], I demonstrated the effect of having a POT/PO file with or without location line numbers on repository size. We can mitigate the growth of the "po/" directory by removing "po/git.pot" and committing the PO files without the location line numbers.

[^2]: https://lore.kernel.org/git/20220504124121.12683-1-worldhello.net@gmail.com/
Show 5 quoted lines
> I am not sure what your plans are to make sure everybody works off
> of the same version, though.  Even if you scrape the source tree for
> source files that may not be relevant to your build, if you do not
> start off of the same version, your set of sources may be a bit off
> compared to the other translators'.

We can use "msgcmp" to compare PO files from l10n contributors with newly generated POT files and give suggestions in the l10n CI pipeline.

-- Jiang Xin

Junio C Hamano· May 4, 2022, 17:58 UTC · re: Jiang Xin · lore

Re: [PATCH 0/9] Incremental po/git.pot update and new l10n workflow

Jiang Xin <worldhello.net@gmail.com> writes:
Show 5 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> Ævar and I started discussing this topic (incremental po/git.pot update
> and new l10n workflow) on a GitHub issue[^1] a month ago. There are
> several improvements to the l10n workflow:

The vger archive seems to be missing [6/9]. For those who are wondering from sidelines, it commits a removal of the po/git.pot file from our tree and comes between [5/9] and [7/9].

I am guessing that the reason why it is placed there is to ensure bisectability, but I didn't actually check it needs there to be bisectable, or committing the removal at the end would suffice.

Anyway, this will be part of today's 'seen'.
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 1/9] Makefile: sort "po/git.pot" by file location

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Before feeding xgettext with more C souce files which may be ignored by various compiler conditions, add new option "--sort-by-file" to xgettext program to create stable message template file "po/git.pot".

With this update, the newly generated "po/git.pot" will has the same entries while in a different order. We won't checkin the newly generated "po/git.pot", because we will remove it from tree in a later commit.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile | 1 +
 1 file changed, 1 insertion(+)
Show changes to Makefile +1 −0
diff --git a/Makefile b/Makefile
index f8bccfab5e..83e968e2a4 100644
--- a/Makefile
+++ b/Makefile
@@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 08:53 UTC · re: Jiang Xin · lore

Re: [PATCH v2 1/9] Makefile: sort "po/git.pot" by file location

On Thu, May 19 2022, Jiang Xin wrote:
Show 28 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> Before feeding xgettext with more C souce files which may be ignored
> by various compiler conditions, add new option "--sort-by-file" to
> xgettext program to create stable message template file "po/git.pot".
>
> With this update, the newly generated "po/git.pot" will has the same
> entries while in a different order. We won't checkin the newly generated
> "po/git.pot", because we will remove it from tree in a later commit.
>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  Makefile | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/Makefile b/Makefile
> index f8bccfab5e..83e968e2a4 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
>  	--force-po \
>  	--add-comments=TRANSLATORS: \
>  	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> +	--sort-by-file \
>  	--from-code=UTF-8
>  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
>  	--keyword=_ --keyword=N_ --keyword="Q_:1,2"

I'm not opposed to this change, but between this and 2/9 I'm still unsure what the aim is exactly, and if the results are desired.

In 2/9 you correctly point out that we have messages we've missed due to LOCALIZED_C being platform-specific.

That should never happen (although your implementation in 2/9 may have some small issues, I'll reply there separately), i.e. we should always have "make pot" generate the same po/git.pot from the same commit whether you're on linux, mac os x etc.

But AFAICT we have a "stable" sort order now, it's in whatever order we feed the files to xgettext, which ultimately comes down to e.g. the list of $(LIB_OBJS) in the Makefile.

I've been looking over the libintl documentation to see what exactly these sort options do, and how they differ from the default, and it's not really described.

AFAICT the xgettext behavior we have now is that we'll process the files we have in order, and for those files extract the messages we have as we see them.

One fringe benefit of that is that e.g. "make pot XGETTEXT_INCLUDE_TESTS=Y" (which I think I've only ever used, and probably only ~10 years ago) will get added at the end, but now it'll be added wherever t/t0200 sorts.

Then because compose the builtin objs and lib objs by concatenation, but don't $(sort) them in the Makefile most of this change is due to us e.g. sorting builtin/* before parse-options.c or whatever.

But oddly we also have cases like this:
        strbuf_addf(&header, print_file_item_data.modified_fmt,
                    _("staged"), _("unstaged"), _("path"));

Before this we'd list those in that order in the git.pot, but now because of --sort-by-file we'll list any messages on the same line in sorted msgid order, not in the orderd they appear in. Another example is e.g. this in builtin/blame.c:

    OPT_STRING_LIST(0, "ignore-rev", &ignore_rev_list, N_("rev"), N_("ignore <rev> when blaming"))

Where before we'd list them in that order, but now it's with "ignore.." before "rev".

I think this change would be easier to follow & explain if you first
made this change:
	
	diff --git a/Makefile b/Makefile
	index 61aadf3ce88..3726fe8064a 100644
	--- a/Makefile
	+++ b/Makefile
	@@ -2715,10 +2715,9 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
	 	--keyword=gettextln --keyword=eval_gettextln
	 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
	 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
	-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
	-LOCALIZED_SH = $(SCRIPT_SH)
	-LOCALIZED_SH += git-sh-setup.sh
	-LOCALIZED_PERL = $(SCRIPT_PERL)
	+LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
	+LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
	+LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
	 
	 ifdef XGETTEXT_INCLUDE_TESTS
	 LOCALIZED_C += t/t0200/test.c

Which would sort things within C, SH and Perl files (but not among them). Then this change would AFAICT only:

 * Change that "within one line" sort order, as noted above
 * Sort across C/SH/Perl.

I'm mostly "meh" on the result, but it's also because I genuinely don't get what the goal was. Is it because in 2/9 you'll end up using $(FOUND_C_SOURCES), which we derive from either "git ls-files" or "find", the latter of which has an unstable sort order?

Even if that's the case a smaller change is to just use $(sort) as noted above. I like that a tiny bit more because then the "--join-existing" we do for SH/Perl is an append, whereas now we'll re-sort the whole thing.

I also don't think it matters much either way, so whatever you're happy with, the above all came from trying to follow along...

Jiang Xin· May 19, 2022, 12:41 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v2 1/9] Makefile: sort "po/git.pot" by file location

On Thu, May 19, 2022 at 5:17 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 35 quoted lines
>
>
> On Thu, May 19 2022, Jiang Xin wrote:
>
> > From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >
> > Before feeding xgettext with more C souce files which may be ignored
> > by various compiler conditions, add new option "--sort-by-file" to
> > xgettext program to create stable message template file "po/git.pot".
> >
> > With this update, the newly generated "po/git.pot" will has the same
> > entries while in a different order. We won't checkin the newly generated
> > "po/git.pot", because we will remove it from tree in a later commit.
> >
> > Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> > Signed-off-by: Junio C Hamano <gitster@pobox.com>
> > ---
> >  Makefile | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/Makefile b/Makefile
> > index f8bccfab5e..83e968e2a4 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
> >       --force-po \
> >       --add-comments=TRANSLATORS: \
> >       --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> > +     --sort-by-file \
> >       --from-code=UTF-8
> >  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
> >       --keyword=_ --keyword=N_ --keyword="Q_:1,2"
>
> I'm not opposed to this change, but between this and 2/9 I'm still
> unsure what the aim is exactly, and if the results are desired.

We will change the order of input files to feed xgettext to create "po/git.pot" in patch 2/9, and we may change the order of input files in future version. With the option "--sort-by-file" we can get a stable "po/git.pot" and better compression ratios for future versions of "po/*.po*".

Show 7 quoted lines
> In 2/9 you correctly point out that we have messages we've missed due to
> LOCALIZED_C being platform-specific.
>
> That should never happen (although your implementation in 2/9 may have
> some small issues, I'll reply there separately), i.e. we should always
> have "make pot" generate the same po/git.pot from the same commit
> whether you're on linux, mac os x etc.

l10n translators may work on different platforms or have different compiler conditions, and their contributions may have different base templates (po/git.pot). It is hard for the l10n coordinator to choose a base template to check contributions from different l10n contributors.

Show 35 quoted lines
> But AFAICT we have a "stable" sort order now, it's in whatever order we
> feed the files to xgettext, which ultimately comes down to e.g. the list
> of $(LIB_OBJS) in the Makefile.
>
> I've been looking over the libintl documentation to see what exactly
> these sort options do, and how they differ from the default, and it's
> not really described.
>
> AFAICT the xgettext behavior we have now is that we'll process the files
> we have in order, and for those files extract the messages we have as we
> see them.
>
> One fringe benefit of that is that e.g. "make pot
> XGETTEXT_INCLUDE_TESTS=Y" (which I think I've only ever used, and
> probably only ~10 years ago) will get added at the end, but now it'll be
> added wherever t/t0200 sorts.
>
> Then because compose the builtin objs and lib objs by concatenation, but
> don't $(sort) them in the Makefile most of this change is due to us
> e.g. sorting builtin/* before parse-options.c or whatever.
>
> But oddly we also have cases like this:
>
>         strbuf_addf(&header, print_file_item_data.modified_fmt,
>                     _("staged"), _("unstaged"), _("path"));
>
> Before this we'd list those in that order in the git.pot, but now
> because of --sort-by-file we'll list any messages on the same line in
> sorted msgid order, not in the orderd they appear in. Another example is
> e.g. this in builtin/blame.c:
>
>     OPT_STRING_LIST(0, "ignore-rev", &ignore_rev_list, N_("rev"), N_("ignore <rev> when blaming"))
>
> Where before we'd list them in that order, but now it's with "ignore.."
> before "rev".

These side effects of changing the order of entries in the same line of the same source file have little effect on the l10n translation.

Show 21 quoted lines
> I think this change would be easier to follow & explain if you first
> made this change:
>
>         diff --git a/Makefile b/Makefile
>         index 61aadf3ce88..3726fe8064a 100644
>         --- a/Makefile
>         +++ b/Makefile
>         @@ -2715,10 +2715,9 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>                 --keyword=gettextln --keyword=eval_gettextln
>          XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>                 --keyword=__ --keyword=N__ --keyword="__n:1,2"
>         -LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
>         -LOCALIZED_SH = $(SCRIPT_SH)
>         -LOCALIZED_SH += git-sh-setup.sh
>         -LOCALIZED_PERL = $(SCRIPT_PERL)
>         +LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
>         +LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
>         +LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
>
>          ifdef XGETTEXT_INCLUDE_TESTS
>          LOCALIZED_C += t/t0200/test.c

I do not need this intermediate commit and submit new generated "po/git.pot" file to observe changes of the "po/git.pot" file, because I have a diff driver install as described here:

    https://github.com/git-l10n/git-po-helper/tree/main/contrib/diff-dirver

So I can tell the newly generated "po/git.pot" will have the same entries while in a different order. If I want to see changes on raw files, I can use command:

    git diff --no-textconv
Show 10 quoted lines
> Which would sort things within C, SH and Perl files (but not among
> them). Then this change would AFAICT only:
>
>  * Change that "within one line" sort order, as noted above
>  * Sort across C/SH/Perl.
>
> I'm mostly "meh" on the result, but it's also because I genuinely don't
> get what the goal was. Is it because in 2/9 you'll end up using
> $(FOUND_C_SOURCES), which we derive from either "git ls-files" or
> "find", the latter of which has an unstable sort order?

The goal is to have a constant order of entries in "po/git.pot" and "po/*.po", so we can save the space of our repository by better compression ratio on files inside "po/".

-- Jiang Xin

Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 0/9] Incremental po/git.pot update and new l10n workflow

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
A workflow change for translators are being proposed.
Changes since v1:
* Patch 4/9: When running "make check-pot", do not update "po/git.pot".
* Patch 6/9: reword: the removal of "po/git.pot" is in preceding commit.
* Patch 7/9 and 8/9: Add new funciton "check_po_file_envvar" for reuse in both
  po-update and po-init targets.
Range-diff vs v1:
 1:  15c4090757 =  1:  15c4090757 Makefile: sort "po/git.pot" by file location
 2:  846a9e72c5 =  2:  846a9e72c5 Makefile: generate "po/git.pot" from stable LOCALIZED_C
 3:  b5cf2836ea =  3:  b5cf2836ea Makefile: have "make pot" not "reset --hard"
 4:  a508f6e18b !  4:  8b30e332df i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Commit message
         on it when running "make pot".
     
         Since the preceding Makefile changes made this easy: let's add a "make
    -    check-pot" target and run it as part of the "static-analysis" CI
    -    target, this will ensure that we catch any such issues in the future.
    +    check-pot" target with the same prerequisites as the "po/git.pot"
    +    target, but without changing the file "po/git.pot". Running it as part
    +    of the "static-analysis" CI target will ensure that we catch any such
    +    issues in the future. E.g.:
    +
    +        $ make check-pot
    +            XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    +        xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
    +                  Please specify the source encoding through --from-code.
    +        make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
     
         1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
            marked for translation, 2011-02-22)
    @@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      pot: po/git.pot
      
     +.PHONY: check-pot
    -+check-pot: pot
    ++check-pot: $(LOCALIZED_ALL_GEN_PO)
     +
      ifdef NO_GETTEXT
      POFILES :=
 5:  720a00b348 =  5:  65f87c5503 po/git.pot: this is now a generated file
 6:  f97113a370 !  6:  fe5f27a88b po/git.pot: don't check in result of "make pot"
    @@ Commit message
         Makefile: "pot" target to extract messages marked for translation,
         2011-02-22).
     
    -    The actual "git rm" of po/git.pot is deferred until the subsequent
    -    commit, to make this change easier to review, and to preempt the
    -    mailing list from blocking it due to it being too large.
    +    The actual "git rm" of po/git.pot was in preceding commit to make this
    +    change easier to review, and to preempt the mailing list from blocking
    +    it due to it being too large.
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
 7:  be23a1c8b0 !  7:  710aff9d66 Makefile: add "po-update" rule to update po/XX.po
    @@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      .PHONY: pot
      pot: po/git.pot
      
    ++define check_po_file_envvar
    ++	$(if $(PO_FILE), \
    ++		$(if $(filter po/%.po,$(PO_FILE)), , \
    ++			$(error PO_FILE should match pattern: "po/%.po")), \
    ++		$(error PO_FILE is not defined))
    ++endef
    ++
    ++.PHONY: po-update
     +po-update: po/git.pot
    -+ifndef PO_FILE
    -+	$(error not define variable "PO_FILE")
    -+else
    -+ifeq ($(filter po/%.po,$(PO_FILE)),)
    -+	$(error PO_FILE should match pattern: "po/%.po")
    -+endif
    -+endif
    ++	$(check_po_file_envvar)
     +	@if test ! -e $(PO_FILE); then \
     +		echo >&2 "error: $(PO_FILE) does not exist"; \
     +		exit 1; \
    @@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
     +	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
     +
      .PHONY: check-pot
    - check-pot: pot
    + check-pot: $(LOCALIZED_ALL_GEN_PO)
      
     
      ## shared.mak ##
 8:  176a80587a !  8:  fc9d3f5603 Makefile: add "po-init" rule to initialize po/XX.po
    @@ Commit message
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
    -@@ Makefile: endif
    - endif
    +@@ Makefile: po-update: po/git.pot
    + 	$(check_po_file_envvar)
      	@if test ! -e $(PO_FILE); then \
      		echo >&2 "error: $(PO_FILE) does not exist"; \
     +		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
      		exit 1; \
      	fi
      	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
    -@@ Makefile: endif
    +@@ Makefile: po-update: po/git.pot
      .PHONY: check-pot
    - check-pot: pot
    + check-pot: $(LOCALIZED_ALL_GEN_PO)
      
     +### TODO FIXME: Translating everything in these files is a bad
     +### heuristic for "core", as we'll translate obscure error() messages
    @@ Makefile: endif
     +
     +.PHONY: po-init
     +po-init: po/git-core.pot
    -+ifndef PO_FILE
    -+	$(error not define variable "PO_FILE")
    -+else
    -+ifeq ($(filter po/%.po,$(PO_FILE)),)
    -+	$(error PO_FILE should match pattern: "po/%.po")
    -+endif
    -+endif
    ++	$(check_po_file_envvar)
     +	@if test -e $(PO_FILE); then \
     +		echo >&2 "error: $(PO_FILE) exists already"; \
     +		exit 1; \
 9:  f2491b96ab =  9:  10fafa5bf9 l10n: Document the new l10n workflow
---
Jiang Xin (3):
  Makefile: sort "po/git.pot" by file location
  Makefile: generate "po/git.pot" from stable LOCALIZED_C
  Makefile: add "po-update" rule to update po/XX.po
Junio C Hamano (1):
  po/git.pot: this is now a generated file
Ævar Arnfjörð Bjarmason (5):
  Makefile: have "make pot" not "reset --hard"
  i18n CI: stop allowing non-ASCII source messages in po/git.pot
  po/git.pot: don't check in result of "make pot"
  Makefile: add "po-init" rule to initialize po/XX.po
  l10n: Document the new l10n workflow
 .gitignore                  |     1 +
 Makefile                    |   144 +-
 builtin/submodule--helper.c |     2 +-
 ci/run-static-analysis.sh   |     2 +
 po/.gitignore               |     2 +
 po/README.md                |   191 +-
 po/git.pot                  | 25151 ----------------------------------
 shared.mak                  |     2 +
 8 files changed, 217 insertions(+), 25278 deletions(-)
 delete mode 100644 po/git.pot
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 10:28 UTC · re: Jiang Xin · lore

Re: [PATCH v2 0/9] Incremental po/git.pot update and new l10n workflow

On Thu, May 19 2022, Jiang Xin wrote:
Show 10 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> A workflow change for translators are being proposed.
>
> Changes since v1:
>
> * Patch 4/9: When running "make check-pot", do not update "po/git.pot".
> * Patch 6/9: reword: the removal of "po/git.pot" is in preceding commit.
> * Patch 7/9 and 8/9: Add new funciton "check_po_file_envvar" for reuse in both
>   po-update and po-init targets.

Thanks a lot for picking this up. I left some detailed comments on individual commits.

My own latest WIP version of an approximation of this topic was https://github.com/avar/git/tree/avar/Makefile-incremental-po-git-pot-rule, which is what I used for some of the range-diffs.

(I think the first E-Mail I sent had a range-diff against the latest version I found in your fork, but I found that was probably the v1 version, but I think those comments applied to your v2 (which I read on-list))

Aside from differences already noted I spotted that your "make pot" ends up with a po/git.pot that has a header, but I omitted it in mine. Perhaps that explains some of the headers in 8/9? I.e. we don't need the header on po/git.pot, perhaps that explains the difference noted in my comment in 8/9?

Also: shouldn't "make clean" remove the generated po/git.pot and
po/git-core.pot? I see you added it to "distclean", maybe that's better
(or maybe that's from a version of mine...).
Just from some last minute testing I think you want this squashed in
(and move that "sed" to the "init" and/or "update" of the individual
po/XX.po files):
	
	diff --git a/Makefile b/Makefile
	index 65a7558261a..57db37db556 100644
	--- a/Makefile
	+++ b/Makefile
	@@ -2778,14 +2778,7 @@ $(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
	 	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
	 		-o$@ $(XGETTEXT_FLAGS_PERL) $<
	 
	-.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
	-	$(call mkdir_p_parent_template)
	-	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
	-		-o - /dev/null | \
	-	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
	-	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
	-
	-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
	+po/git.pot: $(LOCALIZED_ALL_GEN_PO)
	 	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
	 
	 .PHONY: pot

I.e. we can just msgcat po/git.pot without the header. For both "po-init" and "po-update" that seems to do the right thing for me...

Jiang Xin· May 19, 2022, 14:32 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v2 0/9] Incremental po/git.pot update and new l10n workflow

On Thu, May 19, 2022 at 6:39 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 49 quoted lines
> Thanks a lot for picking this up. I left some detailed comments on
> individual commits.
>
> My own latest WIP version of an approximation of this topic was
> https://github.com/avar/git/tree/avar/Makefile-incremental-po-git-pot-rule,
> which is what I used for some of the range-diffs.
>
> (I think the first E-Mail I sent had a range-diff against the latest
> version I found in your fork, but I found that was probably the v1
> version, but I think those comments applied to your v2 (which I read
> on-list))
>
> Aside from differences already noted I spotted that your "make pot" ends
> up with a po/git.pot that has a header, but I omitted it in
> mine. Perhaps that explains some of the headers in 8/9? I.e. we don't
> need the header on po/git.pot, perhaps that explains the difference
> noted in my comment in 8/9?
>
> Also: shouldn't "make clean" remove the generated po/git.pot and
> po/git-core.pot? I see you added it to "distclean", maybe that's better
> (or maybe that's from a version of mine...).
>
> Just from some last minute testing I think you want this squashed in
> (and move that "sed" to the "init" and/or "update" of the individual
> po/XX.po files):
>
>         diff --git a/Makefile b/Makefile
>         index 65a7558261a..57db37db556 100644
>         --- a/Makefile
>         +++ b/Makefile
>         @@ -2778,14 +2778,7 @@ $(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
>                 $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
>                         -o$@ $(XGETTEXT_FLAGS_PERL) $<
>
>         -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
>         -       $(call mkdir_p_parent_template)
>         -       $(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
>         -               -o - /dev/null | \
>         -       sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
>         -       echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
>         -
>         -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
>         +po/git.pot: $(LOCALIZED_ALL_GEN_PO)
>                 $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
>
>          .PHONY: pot
>
> I.e. we can just msgcat po/git.pot without the header. For both
> "po-init" and "po-update" that seems to do the right thing for me...
Benefits of having a header for "po/git.pot" file:
1. Have a nice field "Project-Id-Version: Git" in the head of a new
    generated po file.
2. We can identify the base version of "po/git.pot" by inspecting
    the "POT-Creation-Date" field in the header of a po file.
Ævar Arnfjörð Bjarmason· May 19, 2022, 14:41 UTC · re: Jiang Xin · lore

Re: [PATCH v2 0/9] Incremental po/git.pot update and new l10n workflow

On Thu, May 19 2022, Jiang Xin wrote:
Show 57 quoted lines
> On Thu, May 19, 2022 at 6:39 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> Thanks a lot for picking this up. I left some detailed comments on
>> individual commits.
>>
>> My own latest WIP version of an approximation of this topic was
>> https://github.com/avar/git/tree/avar/Makefile-incremental-po-git-pot-rule,
>> which is what I used for some of the range-diffs.
>>
>> (I think the first E-Mail I sent had a range-diff against the latest
>> version I found in your fork, but I found that was probably the v1
>> version, but I think those comments applied to your v2 (which I read
>> on-list))
>>
>> Aside from differences already noted I spotted that your "make pot" ends
>> up with a po/git.pot that has a header, but I omitted it in
>> mine. Perhaps that explains some of the headers in 8/9? I.e. we don't
>> need the header on po/git.pot, perhaps that explains the difference
>> noted in my comment in 8/9?
>>
>> Also: shouldn't "make clean" remove the generated po/git.pot and
>> po/git-core.pot? I see you added it to "distclean", maybe that's better
>> (or maybe that's from a version of mine...).
>>
>> Just from some last minute testing I think you want this squashed in
>> (and move that "sed" to the "init" and/or "update" of the individual
>> po/XX.po files):
>>
>>         diff --git a/Makefile b/Makefile
>>         index 65a7558261a..57db37db556 100644
>>         --- a/Makefile
>>         +++ b/Makefile
>>         @@ -2778,14 +2778,7 @@ $(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
>>                 $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
>>                         -o$@ $(XGETTEXT_FLAGS_PERL) $<
>>
>>         -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
>>         -       $(call mkdir_p_parent_template)
>>         -       $(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
>>         -               -o - /dev/null | \
>>         -       sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
>>         -       echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
>>         -
>>         -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
>>         +po/git.pot: $(LOCALIZED_ALL_GEN_PO)
>>                 $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
>>
>>          .PHONY: pot
>>
>> I.e. we can just msgcat po/git.pot without the header. For both
>> "po-init" and "po-update" that seems to do the right thing for me...
>
> Benefits of having a header for "po/git.pot" file:
> 1. Have a nice field "Project-Id-Version: Git" in the head of a new
>     generated po file.
> 2. We can identify the base version of "po/git.pot" by inspecting
>     the "POT-Creation-Date" field in the header of a po file.

For 1: Yes, we should have a header, I'm saying we don't need it for po/git.pot, just po/XX.po, and not having it in po/git.pot makes things a bit simpler, since when you "msgmerge" it you only worry about merging the content, not the header.

The header you can then create with msginit, which in both our versions we'd "sed" or otherwise correctly invoke msginit to add the correct fields.

For 2: I think that having such fields in a world where everyone uses version control (and the git project certainly does) is rather useless, they're there in the PO format because it pre-dates version control being ubiquitous.

The time-related fields I left in I left there because it seemed that some PO tooling (e.g. Emacs's po-mode) insists on it.

Anyway, this is all small potatoes. I only pointed this out because when I was hacking this up & debugging it I found it much easier to deal with being able to piece together things with just msgcat, which we can do with po/git.pot if it doesn't have a header.

But for adding the header we either need to msgcat a header file (which an early version of my patches did), or just skip it and have it only added for the XX.po files.

I think it's simpler just to omit it :)
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
A workflow change for translators are being proposed.
Changes since v2:
 1. Patch 1/9: reword.
 2. Patch 2/9: reword.
 3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot".
 4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot".
 5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot
               header for "po/git-core.pot".
 6. Patch 9/9: various updates on po/README.md.
Range-diff vs v2:
 1:  c45f34f233 !  1:  362cd0cbe1 Makefile: sort "po/git.pot" by file location
    @@ Metadata
      ## Commit message ##
         Makefile: sort "po/git.pot" by file location
     
    -    Before feeding xgettext with more C souce files which may be ignored
    -    by various compiler conditions, add new option "--sort-by-file" to
    -    xgettext program to create stable message template file "po/git.pot".
    +    We will feed xgettext with more C souce files and in different order in
    +    subsequent commit. To generate a stable "po/git.pot" regardless of the
    +    number and order of input source files, we add a new option
    +    "--sort-by-file" to xgettext program.
     
         With this update, the newly generated "po/git.pot" will has the same
    -    entries while in a different order. We won't checkin the newly generated
    -    "po/git.pot", because we will remove it from tree in a later commit.
    +    entries while in a different order.
    +
    +    With the help of a custom diff driver as shown below,
    +
    +        git config --global diff.gettext-fmt.textconv \
    +            "msgcat --no-location --sort-by-file"
    +
    +    and appending a new entry "*.po diff=gettext-fmt" to git attributes,
    +    we can see that there are no substantial changes in "po/git.pot".
    +
    +    We won't checkin the newly generated "po/git.pot", because we will
    +    remove it from tree in a later commit.
     
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
 2:  7b6e4d6b59 !  2:  096e700171 Makefile: generate "po/git.pot" from stable LOCALIZED_C
    @@ Commit message
              endif
     
         But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
    -    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".
    +    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C". We also add
    +    "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in
    +    "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.
     
         With this update, the newly generated "po/git.pot" will have 30 new
         entries coming from the following C source files:
    @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
      XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
      	--keyword=__ --keyword=N__ --keyword="__n:1,2"
     -LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
    -+LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
    -+	      $(FOUND_H_SOURCES) $(GENERATED_H)
    ++LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    ++	      $(GENERATED_H)
      LOCALIZED_SH = $(SCRIPT_SH)
      LOCALIZED_SH += git-sh-setup.sh
      LOCALIZED_PERL = $(SCRIPT_PERL)
 3:  868a631c2f !  3:  dff3751260 Makefile: have "make pot" not "reset --hard"
    @@ Commit message
         That out of the way, the main logic change here is getting rid of the
         "reset --hard":
     
    -    We'll generate intermediate .build/pot/po/%.po files from %, which is
    -    handy to see at a glance what strings (if any) in a given file are
    +    We'll generate intermediate ".build/pot/po/%.po" files from "%", which
    +    is handy to see at a glance what strings (if any) in a given file are
         marked for translation:
     
                 $ make .build/pot/po/pretty.c.po
    @@ Commit message
                 $
     
         For these C source files which contain the PRItime macros, we will
    -    create temporary munged *.c files in a tree in ".build/pot/po"
    +    create temporary munged "*.c" files in a tree in ".build/pot/po"
         corresponding to our source tree, and have "xgettext" consider those.
         The rule needs to be careful to "(cd .build/pot/po && ...)", because
         otherwise the comments in the po/git.pot file wouldn't refer to the
         correct source locations (they'd be prefixed with ".build/pot/po").
    +    These temporary munged "*.c” files will be removed immediately after
    +    the corresponding po files are generated, because some development tools
    +    cannot ignore the duplicate source files in the ".build" directory
    +    according to the ".gitignore" file, and that may cause trouble.
     
    -    This changes the output of the generated po/git.pot file in one minor
    +    The output of the generated po/git.pot file is changed in one minor
         way: Because we're using msgcat(1) instead of xgettext(1) to
         concatenate the output we'll now disambiguate where "TRANSLATORS"
         comments come from, in cases where a message is the same in N files,
    @@ Commit message
         understandable, as msgcat(1) is better at handling these edge cases
         than xgettext(1)'s previously used "--join-existing" flag.
     
    -    While we could rename the "pot" snippets without the ".po" extention
    -    to use more intuitive filenames in the comments, but that will
    -    confuse the IDE with lots of invalid C or perl source files in
    +    But filenames in the above disambiguation lines of extracted-comments
    +    have an extra ".po" extension compared to the filenames at the file
    +    locations. While we could rename the intermediate ".build/pot/po/%.po"
    +    files without the ".po" extension to use more intuitive filenames in
    +    the disambiguation lines of extracted-comments, but that will confuse
    +    developer tools with lots of invalid C or other source files in
         ".build/pot/po" directory.
     
         The addition of "--omit-header" option for xgettext makes the "pot"
    -    snippets in ".build/pot/po/*.po" smaller. For the pot header of
    -    "po/git.pot", we use xgettext to generate a "pot" header file
    -    ".build/pot/git.header" from an empty file at runtime, and use this
    +    snippets in ".build/pot/po/*.po" smaller. But as we'll see in a
    +    subsequent commit this header behavior has been hiding an
    +    encoding-related bug from us, so let's carry it forward instead of
    +    re-generating it with xgettext(1).
    +
    +    The "po/git.pot" file should have a header entry, because a proper
    +    header entry will increase the speed of creating a new po file using
    +    msginit and set a proper "POT-Creation-Date:" field in the header
    +    entry of a "po/XX.po" file. We use xgettext to generate a separate
    +    header file at ".build/pot/git.header" from "/dev/null", and use this
         header to assemble "po/git.pot".
     
    -    But as we'll see in a subsequent commit this header behavior has been
    -    hiding an encoding-related bug from us, so let's carry it forward
    -    instead of re-generating it with xgettext(1).
    -
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
    @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
      XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
      	--keyword=__ --keyword=N__ --keyword="__n:1,2"
     +MSGCAT_FLAGS = --sort-by-file
    - LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
    - 	      $(FOUND_H_SOURCES) $(GENERATED_H)
    + LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    + 	      $(GENERATED_H)
      LOCALIZED_SH = $(SCRIPT_SH)
     @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
      LOCALIZED_PERL += t/t0200/test.perl
    @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
     +	$(call mkdir_p_parent_template)
     +	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
     +		-o$@ $(XGETTEXT_FLAGS_PERL) $<
    ++
    ++define gen_pot_header
    ++$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
    ++	-o - /dev/null | \
    ++sed -e 's|charset=CHARSET|charset=UTF-8|' \
    ++    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
    ++    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
    ++    >$@ && \
    ++echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
    ++endef
      
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
    @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
     -		$(LOCALIZED_PERL)
     +.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
    -+		-o - /dev/null | \
    -+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
    -+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
    ++	$(QUIET_GEN)$(gen_pot_header)
      
     -	# Reverting the munged source, leaving only the updated $@
     -	git reset --hard
     -	mv $@+ $@
    -+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    -+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
    ++po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
    ++	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
      
      .PHONY: pot
      pot: po/git.pot
 4:  31aa6ed373 !  4:  1b7efb21ae i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Makefile: XGETTEXT_FLAGS = \
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
      	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
      XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    -@@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    +@@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
      .PHONY: pot
      pot: po/git.pot
      
 5:  a9e4840571 !  5:  8ce274b31f po/git.pot: this is now a generated file
    @@ Commit message
     
         We no longer keep track of the contents of this file.
     
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    +
      ## po/git.pot (deleted) ##
     @@
     -# SOME DESCRIPTIVE TITLE.
 6:  1f59007114 !  6:  4585be63f7 po/git.pot: don't check in result of "make pot"
    @@ Commit message
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
    +@@ Makefile: endef
    + 	$(call mkdir_p_parent_template)
    + 	$(QUIET_GEN)$(gen_pot_header)
    + 
    +-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
    +-	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
    ++po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    ++	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
    + 
    + .PHONY: pot
    + pot: po/git.pot
     @@ Makefile: dist-doc: git$X
      
      distclean: clean
 7:  cb31a4001e !  7:  b8f43b520c Makefile: add "po-update" rule to update po/XX.po
    @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
      	--keyword=__ --keyword=N__ --keyword="__n:1,2"
      MSGCAT_FLAGS = --sort-by-file
     +MSGMERGE_FLAGS = --add-location --backup=off --update
    - LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
    - 	      $(FOUND_H_SOURCES) $(GENERATED_H)
    + LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    + 	      $(GENERATED_H)
      LOCALIZED_SH = $(SCRIPT_SH)
     @@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      .PHONY: pot
 8:  f4c58f6184 !  8:  019633c7a4 Makefile: add "po-init" rule to initialize po/XX.po
    @@ Commit message
         To help new l10n contributors to initialized their "po/XX.pot" from
         "po/git-core.pot", we also add new rules "po-init":
     
    -        make po-init POT_FILE=po/XX.po
    +        make po-init PO_FILE=po/XX.po
     
         [^1]: https://github.com/git-l10n/git-po-helper/
     
    @@ Makefile: po-update: po/git.pot
     +
     +.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
    -+		-o - /dev/null | \
    -+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
    -+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
    ++	$(QUIET_GEN)$(gen_pot_header)
     +
     +po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
     +	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 9:  809128ce21 !  9:  334117bf48 l10n: Document the new l10n workflow
    @@ Commit message
         Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## po/README.md ##
    -@@ po/README.md: for a new language translation. Because there are more than 5000 messages
    - in the template message file "po/git.pot" that need to be translated,
    - this is not a piece of cake for the contributor for a new language.
    +@@ po/README.md: coordinates our localization effort in the l10 coordinator repository:
    + 
    +     https://github.com/git-l10n/git-po/
    + 
    +-The two character language translation codes are defined by ISO\_639-1, as
    +-stated in the gettext(1) full manual, appendix A.1, Usual Language Codes.
    ++We will use XX as an alias to refer to the language translation code in
    ++the following paragraphs, for example we use "po/XX.po" to refer to the
    ++translation file for a specific language. But this doesn't mean that
    ++the language code has only two letters. The language code can be in one
    ++of two forms: "ll" or "ll\_CC". Here "ll" is the ISO 639 two-letter
    ++language code and "CC" is the ISO 3166 two-letter code for country names
    ++and subdivisions. For example: "de" for German language code, "zh\_CN"
    ++for Simplified Chinese language code.
    + 
    + 
    + ## Contributing to an existing translation
    +@@ po/README.md: language, so that the l10n coordinator only needs to interact with one
    + person per language.
    + 
    + 
    +-## Core translation
    ++## Translation Process Flow
    + 
    +-The core translation is the smallest set of work that must be completed
    +-for a new language translation. Because there are more than 5000 messages
    +-in the template message file "po/git.pot" that need to be translated,
    +-this is not a piece of cake for the contributor for a new language.
    ++The overall data-flow looks like this:
      
     -The core template message file which contains a small set of messages
     -will be generated in "po-core/core.pot" automatically by running a helper
     -program named "git-po-helper" (described later).
    -+The "core" set of messages can be generated at "po/git-core.pot" by
    -+running:
    ++    +-------------------+             +------------------+
    ++    | Git source code   | ----(2)---> | L10n coordinator |
    ++    | repository        | <---(5)---- | repository       |
    ++    +-------------------+             +------------------+
    ++                    |                     |    ^
    ++                   (1)                   (3)  (4)
    ++                    V                     v    |
    ++               +----------------------------------+
    ++               |        Language Team XX          |
    ++               +----------------------------------+
      
    - ```shell
    +-```shell
     -git-po-helper init --core XX.po
    -+make core-pot
    - ```
    +-```
    ++- Translatable strings are marked in the source file.
    ++- Language teams can start translation iterations at any time, even
    ++  before the l10n window opens:
      
     -After translating the generated "po-core/XX.po", you can merge it to
     -"po/XX.po" using the following commands:
    --
    ++  + Pull from the master branch of the source (1)
    ++  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    ++  + Translate the message file "po/XX.po"
    + 
     -```shell
     -msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
     -mv /tmp/XX.po po/XX.po
     -git-po-helper update XX.po
     -```
    --
    ++- The L10n coordinator pulls from source and announces the l10n window
    ++  open (2)
    ++- Language team pulls from the l10n coordinator, starts another
    ++  translation iteration against the l10n coordinator's tree (3)
    + 
     -Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
     -translated messages and duplicate messages.
    -+And then proceeding with the rest of these instructions on the new
    -+generated "po/git-core.pot" file.
    ++  + Run "git pull --rebase" from the l10n coordinator
    ++  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    ++  + Translate the message file "po/XX.po"
    ++  + Squash trivial l10n git commits using "git rebase -i"
      
    ++- Language team sends pull request to the l10n coordinator (4)
    ++- L10n coordinator checks and merges
    ++- L10n coordinator asks the result to be pulled (5).
      
    - ## Translation Process Flow
    +-## Translation Process Flow
      
    - The overall data-flow looks like this:
    +-The overall data-flow looks like this:
    ++## Dynamically generated POT files
      
     -    +-------------------+            +------------------+
     -    | Git source code   | ---(1)---> | L10n coordinator |
    @@ po/README.md: for a new language translation. Because there are more than 5000 m
     -                                     +------------------+
     -                                     | Language Team XX |
     -                                     +------------------+
    -+    +-------------------+             +------------------+
    -+    | Git source code   | ----(2)---> | L10n coordinator |
    -+    | repository        | <---(5)---- | repository       |
    -+    +-------------------+             +------------------+
    -+                    |                     |    ^
    -+                   (1)                   (3)  (4)
    -+                    V                     v    |
    -+               +----------------------------------+
    -+               |        Language Team XX          |
    -+               +----------------------------------+
    ++POT files are templates for l10n contributors to create or update their
    ++translation files. We used to have the "po/git.pot" file which was
    ++generated by the l10n coordinator, but this file had been removed from
    ++the tree.
      
    - - Translatable strings are marked in the source file.
    +-- Translatable strings are marked in the source file.
     -- L10n coordinator pulls from the source (1)
     -- L10n coordinator updates the message template "po/git.pot"
     -- Language team pulls from L10n coordinator (2)
     -- Language team updates the message file "po/XX.po"
     -- L10n coordinator pulls from Language team (3)
     -- L10n coordinator asks the result to be pulled (4).
    -+- Language teams can start translation iterations at any time, even
    -+  before the l10n window opens:
    -+
    -+  + Pull from the source (1)
    -+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    -+  + Translate the message file "po/XX.po"
    ++The two POT files "po/git.pot" and "po/git-core.pot" can be created
    ++dynamically when necessary.
      
    -+- The L10n coordinator pulls from source and announces the l10n window
    -+  open (2)
    -+- Language team pulls from the l10n coordinator, starts another
    -+  translation iteration against the l10n coordinator's tree (3)
    ++L10n contributors use "po/git.pot" to prepare translations for their
    ++languages, but they are not expected to modify it. The "po/git.pot" file
    ++can be generated manually with the following command:
      
     -## Maintaining the "po/git.pot" file
    -+  + Run "git pull --rebase" from the l10n coordinator
    -+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
    -+  + Translate the message file "po/XX.po"
    -+  + Squash trivial l10n git commits using "git rebase -i"
    ++```shell
    ++make po/git.pot
    ++```
      
     -(This is done by the l10n coordinator).
    -+- Language team sends pull request to the l10n coordinator (4)
    -+- L10n coordinator checks and merges
    -+- L10n coordinator asks the result to be pulled (5).
    ++The "po/git-core.pot" file is the template for core translations. A core
    ++translation is the minimum set of work necessary to complete a
    ++translation of a new language. Since there are more than 5000 messages
    ++in the full set of template message file "po/git.pot" that need to be
    ++translated, this is not a piece of cake for new language contributors.
      
     -The "po/git.pot" file contains a message catalog extracted from Git's
     -sources. The l10n coordinator maintains it by adding new translations with
    @@ po/README.md: for a new language translation. Because there are more than 5000 m
     -expected to pull from the main git repository at strategic point in
     -history (e.g. when a major release and release candidates are tagged),
     -and then run "make pot" at the top-level directory.
    ++The "core" template file "po/git-core.pot" can be generated manually
    ++by running:
      
     -Language contributors use this file to prepare translations for their
     -language, but they are not expected to modify it.
    -+## Creating the "po/git.pot" file
    -+
    -+The "po/git.pot" file, once generated by the the l10n coordinator had
    -+been removed from the tree. L10n contributors can generated it at
    -+runtime using command:
    -+
     +```shell
    -+make pot
    ++make po/git-core.pot
     +```
    -+
    -+Then language contributors use this file to prepare translations for
    -+their language, but they are not expected to modify it.
      
      
      ## Initializing a "XX.po" file
    @@ po/README.md: If your language XX does not have translated message file "po/XX.p
      
      ```shell
     -msginit --locale=XX
    --```
    --
    ++make po-init PO_FILE=po/XX.po
    + ```
    + 
     -in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
     -"zh\_CN", etc.
     -
    @@ -1,6 +1,6 @@
     -+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
     -+# This file is distributed under the same license as the Git package.
     - # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
    -+make po-init PO_FILE=po/XX.po
    - ```
    - 
    +-```
    +-
     -And change references to PACKAGE VERSION in the PO Header Entry to
     -just "Git":
    -+Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
    ++where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
      
     -```shell
     -perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
    @@ po/README.md: and ask the l10n coordinator to pull from you.
      
     -Once you are done testing the translation (see below), commit the result
     -and ask the l10n coordinator to pull from you.
    -+- Call "make pot" at runtime to generate new "po/git.pot" file
    ++- Call "make po/git.pot" to generate new "po/git.pot" file
     +- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
     +  to update your "po/XX.po"
     +- The "--add-location" option for msgmerge will add location lines,
    -+  and these location lines will help translation tools to location
    ++  and these location lines will help translation tools to locate
     +  translation context easily.
     +
     +Once you are done testing the translation (see below), it's better
    @@ po/README.md: and ask the l10n coordinator to pull from you.
     +To save a location-less "po/XX.po" automatically in repository, you
     +can:
     +
    -+- Define new attribute for "po/XX.po" by adding new line in
    -+  ".git/info/attributes":
    ++First define a new attribute for "po/XX.po" by appending the following
    ++line in ".git/info/attributes":
     +
    -+        /po/XX.po filter=gettext-no-location
    ++```
    ++/po/XX.po filter=gettext-no-location
    ++```
     +
    -+- Define driver for "gettext-no-location" filter:
    ++Then define the driver for the "gettext-no-location" clean filter to
    ++strip out both filenames and locations from the contents as follows:
     +
    -+        $ git config --global filter.gettext-no-location.clean \
    -+              "msgcat --no-location -"
    ++```shell
    ++git config --global filter.gettext-no-location.clean \
    ++           "msgcat --no-location -"
    ++```
    ++
    ++For users who have gettext version 0.20 or higher, it is also possible
    ++to define a clean filter to preserve filenames but not locations:
    ++
    ++```shell
    ++git config --global filter.gettext-no-location.clean \
    ++           "msgcat --add-location=file -"
    ++```
     +
     +You're now ready to ask the l10n coordinator to pull from you.
      
---
Jiang Xin (4):
  Makefile: sort "po/git.pot" by file location
  Makefile: generate "po/git.pot" from stable LOCALIZED_C
  po/git.pot: this is now a generated file
  Makefile: add "po-update" rule to update po/XX.po
Ævar Arnfjörð Bjarmason (5):
  Makefile: have "make pot" not "reset --hard"
  i18n CI: stop allowing non-ASCII source messages in po/git.pot
  po/git.pot: don't check in result of "make pot"
  Makefile: add "po-init" rule to initialize po/XX.po
  l10n: Document the new l10n workflow
 .gitignore                  |     1 +
 Makefile                    |   148 +-
 builtin/submodule--helper.c |     2 +-
 ci/run-static-analysis.sh   |     2 +
 po/.gitignore               |     2 +
 po/README.md                |   230 +-
 po/git.pot                  | 25151 ----------------------------------
 shared.mak                  |     2 +
 8 files changed, 250 insertions(+), 25288 deletions(-)
 delete mode 100644 po/git.pot
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 23, 2022, 07:15 UTC · re: Jiang Xin · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23 2022, Jiang Xin wrote:
Show 13 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> A workflow change for translators are being proposed.
>
> Changes since v2:
>
>  1. Patch 1/9: reword.
>  2. Patch 2/9: reword.
>  3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot".
>  4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot".
>  5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot
>                header for "po/git-core.pot".
>  6. Patch 9/9: various updates on po/README.md.

From skimming this the *.c.po v.s. *.c extension is still left in comments. I'm not saying you need to go for my suggestions, but it would be very useful in CL's to note things that were suggested but not changed, such as that.

Right now I haven't paged that v2 discussion into my brain again, so I don't know if that was the only thing, it's the only thing I remember right now...

But let's read on:
Show 30 quoted lines
> Range-diff vs v2:
>
>  1:  c45f34f233 !  1:  362cd0cbe1 Makefile: sort "po/git.pot" by file location
>     @@ Metadata
>       ## Commit message ##
>          Makefile: sort "po/git.pot" by file location
>      
>     -    Before feeding xgettext with more C souce files which may be ignored
>     -    by various compiler conditions, add new option "--sort-by-file" to
>     -    xgettext program to create stable message template file "po/git.pot".
>     +    We will feed xgettext with more C souce files and in different order in
>     +    subsequent commit. To generate a stable "po/git.pot" regardless of the
>     +    number and order of input source files, we add a new option
>     +    "--sort-by-file" to xgettext program.
>      
>          With this update, the newly generated "po/git.pot" will has the same
>     -    entries while in a different order. We won't checkin the newly generated
>     -    "po/git.pot", because we will remove it from tree in a later commit.
>     +    entries while in a different order.
>     +
>     +    With the help of a custom diff driver as shown below,
>     +
>     +        git config --global diff.gettext-fmt.textconv \
>     +            "msgcat --no-location --sort-by-file"
>     +
>     +    and appending a new entry "*.po diff=gettext-fmt" to git attributes,
>     +    we can see that there are no substantial changes in "po/git.pot".
>     +
>     +    We won't checkin the newly generated "po/git.pot", because we will
>     +    remove it from tree in a later commit.

Does this actually work? This seems to suggest adding a driver for *.po, but using it against the *.pot file. Isn't that a typo (I haven't tested it)>

Show 5 quoted lines
>          But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
>     -    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".
>     +    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C". We also add
>     +    "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in
>     +    "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.
Thanks, good to note that.
[snipped the rest, will re-read individual commits]
Ævar Arnfjörð Bjarmason· May 23, 2022, 08:12 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23 2022, Ævar Arnfjörð Bjarmason wrote:
Show 24 quoted lines
> On Mon, May 23 2022, Jiang Xin wrote:
>
>> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>>
>> A workflow change for translators are being proposed.
>>
>> Changes since v2:
>>
>>  1. Patch 1/9: reword.
>>  2. Patch 2/9: reword.
>>  3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot".
>>  4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot".
>>  5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot
>>                header for "po/git-core.pot".
>>  6. Patch 9/9: various updates on po/README.md.
>
> From skimming this the *.c.po v.s. *.c extension is still left in
> comments. I'm not saying you need to go for my suggestions, but it would
> be very useful in CL's to note things that were suggested but not
> changed, such as that.
>
> Right now I haven't paged that v2 discussion into my brain again, so I
> don't know if that was the only thing, it's the only thing I remember
> right now...
This fix-up below implements what I suggested on v2, so now the comments
in the generated file are correct, and don't refer to our intermediate
files:
	
	$ grep '#-#' po/git.pot
	#. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
	#. #-#-#-#-#  add-patch.c  #-#-#-#-#
	#. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
	#. #-#-#-#-#  branch.c  #-#-#-#-#
	#. #-#-#-#-#  object-name.c  #-#-#-#-#
	#. #-#-#-#-#  grep.c  #-#-#-#-#

I gathered that the reason you preferred the whole "grep -q PRItime" was because you wanted to mitigate the effects of your IDE discovering these files.

With the below you can define AGGRESSIVE_INTERMEDIATE and when you "make pot" the generated *.c files will only exist for as long as they're needed to generate the next step.

But if you do a subsequent "make pot" will be slower, as we'll of course need to generate them again.

I think it's better to go in this direction, and rename that AGGRESSIVE_INTERMEDIATE to something like MAKE_AVOID_REAL_EXTENSIONS_IN_GITIGNORED_FILES or whatever.

I.e. our correctness shouldn't suffer because we're trying to work around some issue in a specific (and optional) developer tooling.

There's also the fix there for the "header" dependency, but as noted in
another reply it should probably be dropped altogether...
	
Show changes to Makefile +28 −21
diff --git a/Makefile b/Makefile
index d3eae150de9..0b96b55b63f 100644
--- a/Makefile
+++ b/Makefile
@@ -2736,6 +2736,7 @@ endif
 ## "po/git.pot" file.
 LOCALIZED_ALL_GEN_PO =
 
+LOCALIZED_C_GEN_C = $(LOCALIZED_C:%=.build/pot/po-munged/%)
 LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
 LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
 
@@ -2745,26 +2746,19 @@ LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
 LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
 LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
 
-## Gettext tools cannot work with our own custom PRItime type, so
-## we replace PRItime with PRIuMAX.  We need to update this to
-## PRIdMAX if we switch to a signed type later.
-$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+ifdef AGGRESSIVE_INTERMEDIATE
+.INTERMEDIATE: $(LOCALIZED_C_GEN_C)
+endif
+$(LOCALIZED_C_GEN_C): .build/pot/po-munged/%: %
 	$(call mkdir_p_parent_template)
-	$(QUIET_XGETTEXT) \
-	    if grep -q PRItime $<; then \
-		(\
-			sed -e 's|PRItime|PRIuMAX|g' <$< \
-				>.build/pot/po/$< && \
-			cd .build/pot/po && \
-			$(XGETTEXT) --omit-header \
-				-o $(@:.build/pot/po/%=%) \
-				$(XGETTEXT_FLAGS_C) $< && \
-			rm $<; \
-		); \
-	    else \
-		$(XGETTEXT) --omit-header \
-			-o $@ $(XGETTEXT_FLAGS_C) $<; \
-	    fi
+	$(QUIET_GEN)sed -e 's|PRItime|PRIuMAX|g' <$< >$@
+
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: .build/pot/po-munged/%
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)( \
+		cd $(<D) && \
+		$(XGETTEXT) $(XGETTEXT_FLAGS_C) --omit-header -o - $(<F) \
+	) >$@
 
 $(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
 	$(call mkdir_p_parent_template)
@@ -2786,11 +2780,24 @@ sed -e 's|charset=CHARSET|charset=UTF-8|' \
 echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
 endef
 
-.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+.build/pot/git.header:
 	$(call mkdir_p_parent_template)
 	$(QUIET_GEN)$(gen_pot_header)
 
-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+# We go through this dance of having a prepared
+# e.g. .build/pot/po/grep.c.po and copying it to
+# .build/pot/to-cat/grep.c only because some IDEs (e.g. VSCode) pick
+# up on the "real" extension for the purposes of auto-completion, even
+# if the .build directiory is in .gitignore.
+LOCALIZED_ALL_GEN_TO_CAT = $(LOCALIZED_ALL_GEN_PO:.build/pot/po/%.po=.build/pot/to-cat/%)
+ifdef AGGRESSIVE_INTERMEDIATE
+.INTERMEDIATE: $(LOCALIZED_ALL_GEN_TO_CAT)
+endif
+$(LOCALIZED_ALL_GEN_TO_CAT): .build/pot/to-cat/%: .build/pot/po/%.po
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)cat $< >$@
+
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_TO_CAT)
 	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 
 .PHONY: pot
Jiang Xin· May 23, 2022, 13:42 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23, 2022 at 4:19 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 71 quoted lines
>
>
> On Mon, May 23 2022, Ævar Arnfjörð Bjarmason wrote:
>
> > On Mon, May 23 2022, Jiang Xin wrote:
> >
> >> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >>
> >> A workflow change for translators are being proposed.
> >>
> >> Changes since v2:
> >>
> >>  1. Patch 1/9: reword.
> >>  2. Patch 2/9: reword.
> >>  3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot".
> >>  4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot".
> >>  5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot
> >>                header for "po/git-core.pot".
> >>  6. Patch 9/9: various updates on po/README.md.
> >
> > From skimming this the *.c.po v.s. *.c extension is still left in
> > comments. I'm not saying you need to go for my suggestions, but it would
> > be very useful in CL's to note things that were suggested but not
> > changed, such as that.
> >
> > Right now I haven't paged that v2 discussion into my brain again, so I
> > don't know if that was the only thing, it's the only thing I remember
> > right now...
>
> This fix-up below implements what I suggested on v2, so now the comments
> in the generated file are correct, and don't refer to our intermediate
> files:
>
>         $ grep '#-#' po/git.pot
>         #. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
>         #. #-#-#-#-#  add-patch.c  #-#-#-#-#
>         #. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
>         #. #-#-#-#-#  branch.c  #-#-#-#-#
>         #. #-#-#-#-#  object-name.c  #-#-#-#-#
>         #. #-#-#-#-#  grep.c  #-#-#-#-#
>
> I gathered that the reason you preferred the whole "grep -q PRItime" was
> because you wanted to mitigate the effects of your IDE discovering these
> files.
>
> With the below you can define AGGRESSIVE_INTERMEDIATE and when you "make
> pot" the generated *.c files will only exist for as long as they're
> needed to generate the next step.
>
> But if you do a subsequent "make pot" will be slower, as we'll of course
> need to generate them again.
>
> I think it's better to go in this direction, and rename that
> AGGRESSIVE_INTERMEDIATE to something like
> MAKE_AVOID_REAL_EXTENSIONS_IN_GITIGNORED_FILES or whatever.
>
> I.e. our correctness shouldn't suffer because we're trying to work
> around some issue in a specific (and optional) developer tooling.
>
> There's also the fix there for the "header" dependency, but as noted in
> another reply it should probably be dropped altogether...
>
> diff --git a/Makefile b/Makefile
> index d3eae150de9..0b96b55b63f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2736,6 +2736,7 @@ endif
>  ## "po/git.pot" file.
>  LOCALIZED_ALL_GEN_PO =
>
> +LOCALIZED_C_GEN_C = $(LOCALIZED_C:%=.build/pot/po-munged/%)

Intermediate C source files copied from the original location, and PRItime will be replaced by PRIuMAX, if any.

Show 13 quoted lines
>  LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
>  LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
>
> @@ -2745,26 +2746,19 @@ LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
>  LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
>  LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
>
> -## Gettext tools cannot work with our own custom PRItime type, so
> -## we replace PRItime with PRIuMAX.  We need to update this to
> -## PRIdMAX if we switch to a signed type later.
> -$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> +ifdef AGGRESSIVE_INTERMEDIATE
> +.INTERMEDIATE: $(LOCALIZED_C_GEN_C)
Intermediate files "$(LOCALIZED_C_GEN_C)" will be removed automatically.
Show 19 quoted lines
> +endif
> +$(LOCALIZED_C_GEN_C): .build/pot/po-munged/%: %
>         $(call mkdir_p_parent_template)
> -       $(QUIET_XGETTEXT) \
> -           if grep -q PRItime $<; then \
> -               (\
> -                       sed -e 's|PRItime|PRIuMAX|g' <$< \
> -                               >.build/pot/po/$< && \
> -                       cd .build/pot/po && \
> -                       $(XGETTEXT) --omit-header \
> -                               -o $(@:.build/pot/po/%=%) \
> -                               $(XGETTEXT_FLAGS_C) $< && \
> -                       rm $<; \
> -               ); \
> -           else \
> -               $(XGETTEXT) --omit-header \
> -                       -o $@ $(XGETTEXT_FLAGS_C) $<; \
> -           fi
> +       $(QUIET_GEN)sed -e 's|PRItime|PRIuMAX|g' <$< >$@

Copy each source files in $(LOCALIZED_C) to corresponding intermediate file ($(LOCALIZED_C_GEN_C)) in ".build/pot/po-munged/", replacing PRItime with PRIuMAX if any.

Show 7 quoted lines
> +
> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: .build/pot/po-munged/%
> +       $(call mkdir_p_parent_template)
> +       $(QUIET_XGETTEXT)( \
> +               cd $(<D) && \
> +               $(XGETTEXT) $(XGETTEXT_FLAGS_C) --omit-header -o - $(<F) \
> +       ) >$@

For each intermediate C source files in ".build/pot/po-munged/", call xgettext to create corresponding po file in ".build/pot/po/" directory.

Show 8 quoted lines
>  $(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
>         $(call mkdir_p_parent_template)
> @@ -2786,11 +2780,24 @@ sed -e 's|charset=CHARSET|charset=UTF-8|' \
>  echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
>  endef
>
> -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> +.build/pot/git.header:

No. We should rebuild the pot header if any po file need to be update, because we want to refresh the timestamp in the "POT-Creation-Date:" filed of the pot header.

Show 16 quoted lines
>         $(call mkdir_p_parent_template)
>         $(QUIET_GEN)$(gen_pot_header)
>
> -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
> +# We go through this dance of having a prepared
> +# e.g. .build/pot/po/grep.c.po and copying it to
> +# .build/pot/to-cat/grep.c only because some IDEs (e.g. VSCode) pick
> +# up on the "real" extension for the purposes of auto-completion, even
> +# if the .build directiory is in .gitignore.
> +LOCALIZED_ALL_GEN_TO_CAT = $(LOCALIZED_ALL_GEN_PO:.build/pot/po/%.po=.build/pot/to-cat/%)
> +ifdef AGGRESSIVE_INTERMEDIATE
> +.INTERMEDIATE: $(LOCALIZED_ALL_GEN_TO_CAT)
> +endif
> +$(LOCALIZED_ALL_GEN_TO_CAT): .build/pot/to-cat/%: .build/pot/po/%.po
> +       $(call mkdir_p_parent_template)
> +       $(QUIET_GEN)cat $< >$@

Copy each po file in ".build/pot/po/" to another location ".build/pot/to-cat/", but without the ".po" extension.

Let's take "date.c" as an example:
1. Copy "date.c" to an intermediate C source file
".build/pot/po-munged/date.c" and replace PRItime with PRIuMAX in it.
2. Call xgettext to create  ".build/pot/po/date.c.po" from the
intermediate C source file ".build/pot/po-munged/date.c".
3. Optionally remove intermediate C source files like
".build/pot/po-munged/date.c". To have two identical C source files in
the same worktree is not good, some software may break. So I choose to
remove them.
4. Copy the po file (".build/pot/po/date.c.po") created in step 2 to
an intermediate fake C source file ".build/pot/to-cat/date.c" which is
a file without the ".po" extension. Please note this intermediate fake
C source file ".build/pot/to-cat/date.c" is not a valid C file, but a
PO file.
5. Call msgcat to create "po/git.pot" from all the intermediate fake C
source files including  ".build/pot/to-cat/date.c".
6. Optionally remove all the intermediate fake C source files in
".build/pot/to-cat/". I choose to remove them, because leave lots of
invalid C source files in worktree is not good.
For example, ".build/pot/po/date.c.po" was created from
> +
> +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_TO_CAT)
>         $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
7. "po/git.pot" depends on the intermediate fake C source files. If
any single C source file has been changed, will run step 6 to copy all
po files in ".build/pot/po" to corresponding fake C source files in
".build/pot/to-cat/", if we choose to remove these intermediate fake C
source files.

This implementation is too heavy to solve a trivial issue. I think we can push forward this patch series and leave these comments in "po/git.pot":

Show 7 quoted lines
>         $ grep '#-#' po/git.pot
>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
>         #. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
>         #. #-#-#-#-#  branch.c.po  #-#-#-#-#
>         #. #-#-#-#-#  object-name.c.po  #-#-#-#-#
>         #. #-#-#-#-#  grep.c.po  #-#-#-#-#
Ævar Arnfjörð Bjarmason· May 23, 2022, 14:38 UTC · re: Jiang Xin · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23 2022, Jiang Xin wrote:
Show 13 quoted lines
> On Mon, May 23, 2022 at 4:19 PM Ævar Arnfjörð Bjarmason
>>  $(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
>>         $(call mkdir_p_parent_template)
>> @@ -2786,11 +2780,24 @@ sed -e 's|charset=CHARSET|charset=UTF-8|' \
>>  echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
>>  endef
>>
>> -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
>> +.build/pot/git.header:
>
> No. We should rebuild the pot header if any po file need to be update,
> because we want to refresh the timestamp in the "POT-Creation-Date:"
> filed of the pot header.

Okey, I did leave a question about this in an earlier E-Mail though, i.e. does anything actually rely on this, or the header at all, or is this just cargo-culting?

I haven't found anything in our toolchain that cares about the header at all (for the *.pot, not *.po!) let alone the update timestamp.

Except insofar as e.g. Emacs will add a timestamp or update it if it finds a header already.

Show 60 quoted lines
>>         $(call mkdir_p_parent_template)
>>         $(QUIET_GEN)$(gen_pot_header)
>>
>> -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
>> +# We go through this dance of having a prepared
>> +# e.g. .build/pot/po/grep.c.po and copying it to
>> +# .build/pot/to-cat/grep.c only because some IDEs (e.g. VSCode) pick
>> +# up on the "real" extension for the purposes of auto-completion, even
>> +# if the .build directiory is in .gitignore.
>> +LOCALIZED_ALL_GEN_TO_CAT = $(LOCALIZED_ALL_GEN_PO:.build/pot/po/%.po=.build/pot/to-cat/%)
>> +ifdef AGGRESSIVE_INTERMEDIATE
>> +.INTERMEDIATE: $(LOCALIZED_ALL_GEN_TO_CAT)
>> +endif
>> +$(LOCALIZED_ALL_GEN_TO_CAT): .build/pot/to-cat/%: .build/pot/po/%.po
>> +       $(call mkdir_p_parent_template)
>> +       $(QUIET_GEN)cat $< >$@
>
> Copy each po file in ".build/pot/po/" to another location
> ".build/pot/to-cat/", but without the ".po" extension.
>
> Let's take "date.c" as an example:
>
> 1. Copy "date.c" to an intermediate C source file
> ".build/pot/po-munged/date.c" and replace PRItime with PRIuMAX in it.
>
> 2. Call xgettext to create  ".build/pot/po/date.c.po" from the
> intermediate C source file ".build/pot/po-munged/date.c".
>
> 3. Optionally remove intermediate C source files like
> ".build/pot/po-munged/date.c". To have two identical C source files in
> the same worktree is not good, some software may break. So I choose to
> remove them.
>
> 4. Copy the po file (".build/pot/po/date.c.po") created in step 2 to
> an intermediate fake C source file ".build/pot/to-cat/date.c" which is
> a file without the ".po" extension. Please note this intermediate fake
> C source file ".build/pot/to-cat/date.c" is not a valid C file, but a
> PO file.
>
> 5. Call msgcat to create "po/git.pot" from all the intermediate fake C
> source files including  ".build/pot/to-cat/date.c".
>
> 6. Optionally remove all the intermediate fake C source files in
> ".build/pot/to-cat/". I choose to remove them, because leave lots of
> invalid C source files in worktree is not good.
>
> For example, ".build/pot/po/date.c.po" was created from
>> +
>> +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_TO_CAT)
>>         $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
>
> 7. "po/git.pot" depends on the intermediate fake C source files. If
> any single C source file has been changed, will run step 6 to copy all
> po files in ".build/pot/po" to corresponding fake C source files in
> ".build/pot/to-cat/", if we choose to remove these intermediate fake C
> source files.
>
> This implementation is too heavy to solve a trivial issue. I think we
> can push forward this patch series and leave these comments in
> "po/git.pot":

If you find it too "heavy" & are trying to optimize it for some reason then that whole extra special-dance can be made conditional on MAKE_AVOID_REAL_EXTENSIONS_IN_GITIGNORED_FILES.

But really, it's 15MB of .build/pot in my local HEAD with this fix-up,
it's 1.4MB without it, but this whole thing just seems like premature
optimization. Especially given:
    
    $ git hyperfine -r 3 -L rev origin/master,HEAD~,HEAD,avar/Makefile-incremental-po-git-pot-rule~,avar/Makefile-incremental-po-git-pot-rule -p 'git clean -dxf; git reset --hard' 'make pot' --warmup 1
    Benchmark 1: make pot' in 'origin/master
      Time (mean ± σ):      1.970 s ±  0.014 s    [User: 1.683 s, System: 0.353 s]
      Range (min … max):    1.955 s …  1.982 s    3 runs
    
    Benchmark 2: make pot' in 'HEAD~
      Time (mean ± σ):     931.3 ms ±   4.7 ms    [User: 3358.5 ms, System: 1088.7 ms]
      Range (min … max):   927.0 ms … 936.3 ms    3 runs
    
    Benchmark 3: make pot' in 'HEAD
      Time (mean ± σ):      1.506 s ±  0.389 s    [User: 4.655 s, System: 1.363 s]
      Range (min … max):    1.257 s …  1.955 s    3 runs
    
    Benchmark 4: make pot' in 'avar/Makefile-incremental-po-git-pot-rule~
      Time (mean ± σ):      1.015 s ±  0.002 s    [User: 3.615 s, System: 1.224 s]
      Range (min … max):    1.013 s …  1.017 s    3 runs
    
    Benchmark 5: make pot' in 'avar/Makefile-incremental-po-git-pot-rule
      Time (mean ± σ):      1.014 s ±  0.008 s    [User: 3.540 s, System: 1.068 s]
      Range (min … max):    1.007 s …  1.023 s    3 runs
    
    Summary
      'make pot' in 'HEAD~' ran
        1.09 ± 0.01 times faster than 'make pot' in 'avar/Makefile-incremental-po-git-pot-rule'
        1.09 ± 0.01 times faster than 'make pot' in 'avar/Makefile-incremental-po-git-pot-rule~'
        1.62 ± 0.42 times faster than 'make pot' in 'HEAD'
        2.12 ± 0.02 times faster than 'make pot' in 'origin/master'

I.e. all of this is much faster than what we have on "master" now. My 22434ef36ae (Makefile: avoid "sed" on C files that don't need it, 2022-04-08) (avar/Makefile-incremental-po-git-pot-rule) is then just 10% slower than the "grep or xgettext", its "~" is the corresponding unoptimized.

The HEAD here is with my fix-up, and HEAD~ is your series here.

Anyway, if you really feel strongly about it let's go with your way of doing it.

It just sounded like you weren't actually trying top optimize anything, but to work around your editor. So if we had a method to do that....

...except it seems you also care about making it much faster than "master" (or care about <20MB of disk space), which to be blunt seems a bit crazy to me :) Last I checked "make test" ended up creating ~1GB of data (not all at once, but in parallel testing a lot more than 10MB is often in play at once).

As this was a pretty obscure target that I only expect CI, you, translators & me to run in practice a small difference in the initial run didn't seem to matter, especially as it's all an improvement over "master".

Anyway, you do whatever you think is best with that :)
Show 7 quoted lines
>>         $ grep '#-#' po/git.pot
>>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
>>         #. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
>>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
>>         #. #-#-#-#-#  branch.c.po  #-#-#-#-#
>>         #. #-#-#-#-#  object-name.c.po  #-#-#-#-#
>>         #. #-#-#-#-#  grep.c.po  #-#-#-#-#
Jiang Xin· May 23, 2022, 16:13 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23, 2022 at 10:56 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 24 quoted lines
>
>
> On Mon, May 23 2022, Jiang Xin wrote:
>
> > On Mon, May 23, 2022 at 4:19 PM Ævar Arnfjörð Bjarmason
> >>  $(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
> >>         $(call mkdir_p_parent_template)
> >> @@ -2786,11 +2780,24 @@ sed -e 's|charset=CHARSET|charset=UTF-8|' \
> >>  echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
> >>  endef
> >>
> >> -.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> >> +.build/pot/git.header:
> >
> > No. We should rebuild the pot header if any po file need to be update,
> > because we want to refresh the timestamp in the "POT-Creation-Date:"
> > filed of the pot header.
>
> Okey, I did leave a question about this in an earlier E-Mail though,
> i.e. does anything actually rely on this, or the header at all, or is
> this just cargo-culting?
>
> I haven't found anything in our toolchain that cares about the header at
> all (for the *.pot, not *.po!) let alone the update timestamp.

When creating a new po/XX.po manually using msginit from POT file with or without a header, the new generated po/XX.po has different header.

  $ msginit -i po/git.pot -o po/XX-with-header.po \
      --locale=ja --no-translator
  $ msginit -i po/git-headless.pot -o po/XX-without-header.po \
      --locale=ja --no-translator
  $ diff po/XX-with-header.po po/XX-without-header.po
  1,5d0
  < # Japanese translations for Git package.
  < # Copyright (C) 2022 THE Git'S COPYRIGHT HOLDER
  < # This file is distributed under the same license as the Git package.
  < # Automatically generated, 2022.
  < #
  8,11c3
  < "Project-Id-Version: Git\n"
  < "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
  < "POT-Creation-Date: 2022-05-23 23:27+0800\n"
  < "PO-Revision-Date: 2022-05-23 23:27+0800\n"
  ---
  > "Project-Id-Version: git 2.36.0.7.g31429651cf.dirty\n"
  16c8
  < "Content-Type: text/plain; charset=UTF-8\n"
  ---
  > "Content-Type: text/plain; charset=ASCII\n"
Should we ignore this change?
Show 111 quoted lines
>
> >>         $(call mkdir_p_parent_template)
> >>         $(QUIET_GEN)$(gen_pot_header)
> >>
> >> -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
> >> +# We go through this dance of having a prepared
> >> +# e.g. .build/pot/po/grep.c.po and copying it to
> >> +# .build/pot/to-cat/grep.c only because some IDEs (e.g. VSCode) pick
> >> +# up on the "real" extension for the purposes of auto-completion, even
> >> +# if the .build directiory is in .gitignore.
> >> +LOCALIZED_ALL_GEN_TO_CAT = $(LOCALIZED_ALL_GEN_PO:.build/pot/po/%.po=.build/pot/to-cat/%)
> >> +ifdef AGGRESSIVE_INTERMEDIATE
> >> +.INTERMEDIATE: $(LOCALIZED_ALL_GEN_TO_CAT)
> >> +endif
> >> +$(LOCALIZED_ALL_GEN_TO_CAT): .build/pot/to-cat/%: .build/pot/po/%.po
> >> +       $(call mkdir_p_parent_template)
> >> +       $(QUIET_GEN)cat $< >$@
> >
> > Copy each po file in ".build/pot/po/" to another location
> > ".build/pot/to-cat/", but without the ".po" extension.
> >
> > Let's take "date.c" as an example:
> >
> > 1. Copy "date.c" to an intermediate C source file
> > ".build/pot/po-munged/date.c" and replace PRItime with PRIuMAX in it.
> >
> > 2. Call xgettext to create  ".build/pot/po/date.c.po" from the
> > intermediate C source file ".build/pot/po-munged/date.c".
> >
> > 3. Optionally remove intermediate C source files like
> > ".build/pot/po-munged/date.c". To have two identical C source files in
> > the same worktree is not good, some software may break. So I choose to
> > remove them.
> >
> > 4. Copy the po file (".build/pot/po/date.c.po") created in step 2 to
> > an intermediate fake C source file ".build/pot/to-cat/date.c" which is
> > a file without the ".po" extension. Please note this intermediate fake
> > C source file ".build/pot/to-cat/date.c" is not a valid C file, but a
> > PO file.
> >
> > 5. Call msgcat to create "po/git.pot" from all the intermediate fake C
> > source files including  ".build/pot/to-cat/date.c".
> >
> > 6. Optionally remove all the intermediate fake C source files in
> > ".build/pot/to-cat/". I choose to remove them, because leave lots of
> > invalid C source files in worktree is not good.
> >
> > For example, ".build/pot/po/date.c.po" was created from
> >> +
> >> +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_TO_CAT)
> >>         $(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
> >
> > 7. "po/git.pot" depends on the intermediate fake C source files. If
> > any single C source file has been changed, will run step 6 to copy all
> > po files in ".build/pot/po" to corresponding fake C source files in
> > ".build/pot/to-cat/", if we choose to remove these intermediate fake C
> > source files.
> >
> > This implementation is too heavy to solve a trivial issue. I think we
> > can push forward this patch series and leave these comments in
> > "po/git.pot":
>
> If you find it too "heavy" & are trying to optimize it for some reason
> then that whole extra special-dance can be made conditional on
> MAKE_AVOID_REAL_EXTENSIONS_IN_GITIGNORED_FILES.
>
> But really, it's 15MB of .build/pot in my local HEAD with this fix-up,
> it's 1.4MB without it, but this whole thing just seems like premature
> optimization. Especially given:
>
>     $ git hyperfine -r 3 -L rev origin/master,HEAD~,HEAD,avar/Makefile-incremental-po-git-pot-rule~,avar/Makefile-incremental-po-git-pot-rule -p 'git clean -dxf; git reset --hard' 'make pot' --warmup 1
>     Benchmark 1: make pot' in 'origin/master
>       Time (mean ± σ):      1.970 s ±  0.014 s    [User: 1.683 s, System: 0.353 s]
>       Range (min … max):    1.955 s …  1.982 s    3 runs
>
>     Benchmark 2: make pot' in 'HEAD~
>       Time (mean ± σ):     931.3 ms ±   4.7 ms    [User: 3358.5 ms, System: 1088.7 ms]
>       Range (min … max):   927.0 ms … 936.3 ms    3 runs
>
>     Benchmark 3: make pot' in 'HEAD
>       Time (mean ± σ):      1.506 s ±  0.389 s    [User: 4.655 s, System: 1.363 s]
>       Range (min … max):    1.257 s …  1.955 s    3 runs
>
>     Benchmark 4: make pot' in 'avar/Makefile-incremental-po-git-pot-rule~
>       Time (mean ± σ):      1.015 s ±  0.002 s    [User: 3.615 s, System: 1.224 s]
>       Range (min … max):    1.013 s …  1.017 s    3 runs
>
>     Benchmark 5: make pot' in 'avar/Makefile-incremental-po-git-pot-rule
>       Time (mean ± σ):      1.014 s ±  0.008 s    [User: 3.540 s, System: 1.068 s]
>       Range (min … max):    1.007 s …  1.023 s    3 runs
>
>     Summary
>       'make pot' in 'HEAD~' ran
>         1.09 ± 0.01 times faster than 'make pot' in 'avar/Makefile-incremental-po-git-pot-rule'
>         1.09 ± 0.01 times faster than 'make pot' in 'avar/Makefile-incremental-po-git-pot-rule~'
>         1.62 ± 0.42 times faster than 'make pot' in 'HEAD'
>         2.12 ± 0.02 times faster than 'make pot' in 'origin/master'
>
> I.e. all of this is much faster than what we have on "master" now. My
> 22434ef36ae (Makefile: avoid "sed" on C files that don't need it,
> 2022-04-08) (avar/Makefile-incremental-po-git-pot-rule) is then just 10%
> slower than the "grep or xgettext", its "~" is the corresponding
> unoptimized.
>
> The HEAD here is with my fix-up, and HEAD~ is your series here.
>
> Anyway, if you really feel strongly about it let's go with your way of
> doing it.
>
> It just sounded like you weren't actually trying top optimize anything,
> but to work around your editor. So if we had a method to do that....

But for users who prefer to delete all the intermediate files in ".build/pot/to-cat" and ".build/pot/po-munged/", then they will get performance penalty.

Show 21 quoted lines
> ...except it seems you also care about making it much faster than
> "master" (or care about <20MB of disk space), which to be blunt seems a
> bit crazy to me :) Last I checked "make test" ended up creating ~1GB of
> data (not all at once, but in parallel testing a lot more than 10MB is
> often in play at once).
>
> As this was a pretty obscure target that I only expect CI, you,
> translators & me to run in practice a small difference in the initial
> run didn't seem to matter, especially as it's all an improvement over
> "master".
>
> Anyway, you do whatever you think is best with that :)
>
> >>         $ grep '#-#' po/git.pot
> >>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> >>         #. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
> >>         #. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> >>         #. #-#-#-#-#  branch.c.po  #-#-#-#-#
> >>         #. #-#-#-#-#  object-name.c.po  #-#-#-#-#
> >>         #. #-#-#-#-#  grep.c.po  #-#-#-#-#
>
Jiang Xin· May 23, 2022, 08:26 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 0/9] Incremental po/git.pot update and new l10n workflow

On Mon, May 23, 2022 at 3:25 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 22 quoted lines
>
>
> On Mon, May 23 2022, Jiang Xin wrote:
>
> > From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >
> > A workflow change for translators are being proposed.
> >
> > Changes since v2:
> >
> >  1. Patch 1/9: reword.
> >  2. Patch 2/9: reword.
> >  3. Patch 3/9: reword, and add "FORCE" to prerequisites of "po/git.pot".
> >  4. Patch 6/9: remove "FORCE" from prerequisites of "po/git.pot".
> >  5. Patch 8/9: reword, and reuse "$(gen_pot_header)" to prepare pot
> >                header for "po/git-core.pot".
> >  6. Patch 9/9: various updates on po/README.md.
>
> From skimming this the *.c.po v.s. *.c extension is still left in
> comments. I'm not saying you need to go for my suggestions, but it would
> be very useful in CL's to note things that were suggested but not
> changed, such as that.

I've tried to improve some commit logs to make my point that we should name the po files in ".build/po/" with ".po" extension instead of ".c" extension. We can choose plan A, move forward with this patch series, and start using the new workflow in 2.37. If you want, we can try Plan B during next release cycle.

Show 41 quoted lines
> Right now I haven't paged that v2 discussion into my brain again, so I
> don't know if that was the only thing, it's the only thing I remember
> right now...
>
> But let's read on:
>
> > Range-diff vs v2:
> >
> >  1:  c45f34f233 !  1:  362cd0cbe1 Makefile: sort "po/git.pot" by file location
> >     @@ Metadata
> >       ## Commit message ##
> >          Makefile: sort "po/git.pot" by file location
> >
> >     -    Before feeding xgettext with more C souce files which may be ignored
> >     -    by various compiler conditions, add new option "--sort-by-file" to
> >     -    xgettext program to create stable message template file "po/git.pot".
> >     +    We will feed xgettext with more C souce files and in different order in
> >     +    subsequent commit. To generate a stable "po/git.pot" regardless of the
> >     +    number and order of input source files, we add a new option
> >     +    "--sort-by-file" to xgettext program.
> >
> >          With this update, the newly generated "po/git.pot" will has the same
> >     -    entries while in a different order. We won't checkin the newly generated
> >     -    "po/git.pot", because we will remove it from tree in a later commit.
> >     +    entries while in a different order.
> >     +
> >     +    With the help of a custom diff driver as shown below,
> >     +
> >     +        git config --global diff.gettext-fmt.textconv \
> >     +            "msgcat --no-location --sort-by-file"
> >     +
> >     +    and appending a new entry "*.po diff=gettext-fmt" to git attributes,
> >     +    we can see that there are no substantial changes in "po/git.pot".
> >     +
> >     +    We won't checkin the newly generated "po/git.pot", because we will
> >     +    remove it from tree in a later commit.
>
>
> Does this actually work? This seems to suggest adding a driver for *.po,
> but using it against the *.pot file. Isn't that a typo (I haven't tested
> it)>
Thanks, it's really a typo. s/*.po/*.pot/
Show 10 quoted lines
>
> >          But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
> >     -    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".
> >     +    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C". We also add
> >     +    "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in
> >     +    "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.
>
> Thanks, good to note that.
>
> [snipped the rest, will re-read individual commits]
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 0/9] Incremental po/git.pot update and new l10n workflow

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Changes since v3:
1. Remove Junio's s-o-b introduced in v3.
2. Reword patch 1/9, 2/9 and 3/9.
3. Patch 6/9: should remove "po/git.pot" in "clean" instead of "distclean".
4. Patch 8/9: forget to remove "po/git-core.pot".
Range-diff vs v3:
 1:  362cd0cbe1 !  1:  325868b993 Makefile: sort "po/git.pot" by file location
    @@ Metadata
      ## Commit message ##
         Makefile: sort "po/git.pot" by file location
     
    -    We will feed xgettext with more C souce files and in different order in
    -    subsequent commit. To generate a stable "po/git.pot" regardless of the
    -    number and order of input source files, we add a new option
    +    We will feed xgettext with more C source files and in different order
    +    in subsequent commit. To generate a stable "po/git.pot" regardless of
    +    the number and order of input source files, we pass the option
         "--sort-by-file" to xgettext program.
     
    -    With this update, the newly generated "po/git.pot" will has the same
    +    With this update, the newly generated "po/git.pot" will have the same
         entries while in a different order.
     
         With the help of a custom diff driver as shown below,
    @@ Commit message
             git config --global diff.gettext-fmt.textconv \
                 "msgcat --no-location --sort-by-file"
     
    -    and appending a new entry "*.po diff=gettext-fmt" to git attributes,
    +    and appending a new entry "*.pot diff=gettext-fmt" to git attributes,
         we can see that there are no substantial changes in "po/git.pot".
     
         We won't checkin the newly generated "po/git.pot", because we will
         remove it from tree in a later commit.
     
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: XGETTEXT_FLAGS = \
 2:  096e700171 !  2:  acf2f62e66 Makefile: generate "po/git.pot" from stable LOCALIZED_C
    @@ Metadata
      ## Commit message ##
         Makefile: generate "po/git.pot" from stable LOCALIZED_C
     
    -    When running "make pot" on different platform, we may get a different
    -    message template file "po/git.pot". This is because the "LOCALIZED_C"
    -    variable may have different C source files on different platforms or
    -    different compiler conditions.
    -
    -    We can make a stable "LOCALIZED_C" variable by applying patch snippets
    -    as follows:
    -
    -         ifdef NO_LIBGEN_H
    -             COMPAT_CFLAGS += -DNO_LIBGEN_H
    -             COMPAT_OBJS += compat/basename.o
    -        +else
    -        +    LOCALIZED_C += compat/basename.c
    -         endif
    -
    -    But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
    -    "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C". We also add
    -    "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in
    -    "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.
    +    Different users may generate a different message template file
    +    "po/git.pot". This is because the POT file is generated from
    +    "$(LOCALIZED_C)", which is supposed to list all the sources that we
    +    extract the strings to be translated from. But "$(LOCALIZED_C)"
    +    includes "$(C_OBJ)", which only lists the source files used in the
    +    current build for a specific platform and specific compiler
    +    conditions.
    +
    +    Instead of using "$(C_OBJ)", we use "$(FOUND_C_SOURCES)", which lists
    +    all source files we keep track of (or ship in a tarball extract), to
    +    form a stable "LOCALIZED_C". We also add "$(SCALAR_SOURCES)", which
    +    is part of "$(C_OBJ)" but not included in "$(FOUND_C_SOURCES)".
     
         With this update, the newly generated "po/git.pot" will have 30 new
         entries coming from the following C source files:
    @@ Commit message
          * compat/simple-ipc/ipc-win32.c
     
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 3:  dff3751260 !  3:  775c37bc69 Makefile: have "make pot" not "reset --hard"
    @@ Commit message
         Makefile: have "make pot" not "reset --hard"
     
         Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
    -    custom PRItime format, 2017-07-20) we'd consider source files as-is
    +    custom PRItime format, 2017-07-20), we'd consider source files as-is
         with gettext, but because we need to understand PRItime in the same way
    -    that gettext itself understands PRIuMAX we'd first check if we had a
    +    that gettext itself understands PRIuMAX, we'd first check if we had a
         clean checkout, then munge all of the processed files in-place with
         "sed", generate "po/git.pot", and then finally "reset --hard" to undo
         our changes.
    @@ Commit message
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## .gitignore ##
     @@
 4:  1b7efb21ae !  4:  55ee049b0a i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Commit message
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: XGETTEXT_FLAGS = \
 5:  8ce274b31f =  5:  69338521aa po/git.pot: this is now a generated file
 6:  4585be63f7 !  6:  6f80bd0461 po/git.pot: don't check in result of "make pot"
    @@ Commit message
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: endef
    @@ Makefile: endef
      
      .PHONY: pot
      pot: po/git.pot
    -@@ Makefile: dist-doc: git$X
    +@@ Makefile: cocciclean:
      
    - distclean: clean
    - 	$(RM) configure
    + clean: profile-clean coverage-clean cocciclean
    + 	$(RM) -r .build
     +	$(RM) po/git.pot
    - 	$(RM) config.log config.status config.cache
    - 	$(RM) config.mak.autogen config.mak.append
    - 	$(RM) -r autom4te.cache
    + 	$(RM) *.res
    + 	$(RM) $(OBJECTS)
    + 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
     
      ## po/.gitignore ##
     @@
 7:  b8f43b520c !  7:  5cd2c0741d Makefile: add "po-update" rule to update po/XX.po
    @@ Commit message
             $ make po-update PO_FILE=po/zh_CN.po
     
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: TCLTK_PATH = wish
 8:  019633c7a4 !  8:  246720695a Makefile: add "po-init" rule to initialize po/XX.po
    @@ Commit message
         [^1]: https://github.com/git-l10n/git-po-helper/
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    -    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
     @@ Makefile: po-update: po/git.pot
    @@ Makefile: po-update: po/git.pot
      ifdef NO_GETTEXT
      POFILES :=
      MOFILES :=
    +@@ Makefile: cocciclean:
    + 
    + clean: profile-clean coverage-clean cocciclean
    + 	$(RM) -r .build
    +-	$(RM) po/git.pot
    ++	$(RM) po/git.pot po/git-core.pot
    + 	$(RM) *.res
    + 	$(RM) $(OBJECTS)
    + 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
     
      ## po/.gitignore ##
     @@
 9:  334117bf48 !  9:  131f52ac3a l10n: Document the new l10n workflow
    @@ Commit message
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    -    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## po/README.md ##
     @@ po/README.md: coordinates our localization effort in the l10 coordinator repository:
---
Jiang Xin (4):
  Makefile: sort "po/git.pot" by file location
  Makefile: generate "po/git.pot" from stable LOCALIZED_C
  po/git.pot: this is now a generated file
  Makefile: add "po-update" rule to update po/XX.po
Ævar Arnfjörð Bjarmason (5):
  Makefile: have "make pot" not "reset --hard"
  i18n CI: stop allowing non-ASCII source messages in po/git.pot
  po/git.pot: don't check in result of "make pot"
  Makefile: add "po-init" rule to initialize po/XX.po
  l10n: Document the new l10n workflow
 .gitignore                  |     1 +
 Makefile                    |   148 +-
 builtin/submodule--helper.c |     2 +-
 ci/run-static-analysis.sh   |     2 +
 po/.gitignore               |     2 +
 po/README.md                |   230 +-
 po/git.pot                  | 25151 ----------------------------------
 shared.mak                  |     2 +
 8 files changed, 250 insertions(+), 25288 deletions(-)
 delete mode 100644 po/git.pot
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 23, 2022, 18:19 UTC · re: Jiang Xin · lore

Re: [PATCH v4 0/9] Incremental po/git.pot update and new l10n workflow

Jiang Xin <worldhello.net@gmail.com> writes:
Show 7 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> Changes since v3:
>
> 1. Remove Junio's s-o-b introduced in v3.
> 2. Reword patch 1/9, 2/9 and 3/9.
> 3. Patch 6/9: should remove "po/git.pot" in "clean" instead of "distclean".

As 5/9 did not reach the list, just like all the previous rounds missed, I'd squash an equivalent (i.e. removal of po/git.pot) into 6/9 while queuing.

> 4. Patch 8/9: forget to remove "po/git-core.pot".
Will repace.  Thanks.
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 01/10] Makefile: sort source files before feeding to xgettext

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

We will feed xgettext with more C source files and in different order in subsequent commit. To generate a stable "po/git.pot" regardless of the number and order of input source files, we sort the c, perl, and shell source files in groups before feeding them to xgettext.

Ævar suggested that we should not pass the option "--sort-by-file" to xgettext to sort the translatable strings, as it will mix the three groups of source files (c, perl and shell) in the file "po/git.pot", and change the order of translatable strings in the same line of a file.

With this update, the newly generated "po/git.pot" will have the same entries while in a different order.

With the help of a custom diff driver as shown below,
    git config --global diff.gettext-fmt.textconv \
        "msgcat --no-location --sort-by-file"

and appending a new entry "*.pot diff=gettext-fmt" to git attributes, we can see that there are no substantial changes in "po/git.pot".

We won't checkin the newly generated "po/git.pot", because we will remove it from tree in a later commit.

Suggested-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)
Show changes to Makefile +3 −4
diff --git a/Makefile b/Makefile
index f8bccfab5e..7ca95cdb82 100644
--- a/Makefile
+++ b/Makefile
@@ -2713,10 +2713,9 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
-LOCALIZED_SH = $(SCRIPT_SH)
-LOCALIZED_SH += git-sh-setup.sh
-LOCALIZED_PERL = $(SCRIPT_PERL)
+LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
+LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
+LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
 
 ifdef XGETTEXT_INCLUDE_TESTS
 LOCALIZED_C += t/t0200/test.c
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 00/10] Incremental po/git.pot update and new l10n workflow

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Changes since v4:
1. Patch 1/10: use sort function instead of passing option "--sort-by-file".
2. Patch 3/10: when finding source files, ignore ".build" directory.
3. New patch 5/10: remove duplicate and unwanted files in FOUND_SOURCE_FILES
4. Patch 7/10: no "--sort-by-file" option $(MSGCAT_FLAGS) for msgcat.
5. Patch 9/10: no "--sort-by-file" option $(MSGCAT_FLAGS) for msgcat,
               and remove unused "core-pot" target.
Range-diff vs v4:
 1:  325868b993 ! 1:  6a5409fd4f Makefile: sort "po/git.pot" by file location
    @@ Metadata
     Author: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## Commit message ##
    -    Makefile: sort "po/git.pot" by file location
    +    Makefile: sort source files before feeding to xgettext
     
         We will feed xgettext with more C source files and in different order
         in subsequent commit. To generate a stable "po/git.pot" regardless of
    -    the number and order of input source files, we pass the option
    -    "--sort-by-file" to xgettext program.
    +    the number and order of input source files, we sort the c, perl, and
    +    shell source files in groups before feeding them to xgettext.
    +
    +    Ævar suggested that we should not pass the option "--sort-by-file" to
    +    xgettext to sort the translatable strings, as it will mix the three
    +    groups of source files (c, perl and shell) in the file "po/git.pot",
    +    and change the order of translatable strings in the same line of a file.
     
         With this update, the newly generated "po/git.pot" will have the same
         entries while in a different order.
    @@ Commit message
         We won't checkin the newly generated "po/git.pot", because we will
         remove it from tree in a later commit.
     
    +    Suggested-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
         Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
     
      ## Makefile ##
    -@@ Makefile: XGETTEXT_FLAGS = \
    - 	--force-po \
    - 	--add-comments=TRANSLATORS: \
    - 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    -+	--sort-by-file \
    - 	--from-code=UTF-8
    - XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    - 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
    +@@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    + 	--keyword=gettextln --keyword=eval_gettextln
    + XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
    + 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    +-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
    +-LOCALIZED_SH = $(SCRIPT_SH)
    +-LOCALIZED_SH += git-sh-setup.sh
    +-LOCALIZED_PERL = $(SCRIPT_PERL)
    ++LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
    ++LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
    ++LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
    + 
    + ifdef XGETTEXT_INCLUDE_TESTS
    + LOCALIZED_C += t/t0200/test.c
 2:  acf2f62e66 ! 2:  976f75ce00 Makefile: generate "po/git.pot" from stable LOCALIZED_C
    @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
      	--keyword=gettextln --keyword=eval_gettextln
      XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
      	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    --LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
    -+LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    -+	      $(GENERATED_H)
    - LOCALIZED_SH = $(SCRIPT_SH)
    - LOCALIZED_SH += git-sh-setup.sh
    - LOCALIZED_PERL = $(SCRIPT_PERL)
    +-LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
    ++LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    ++	        $(GENERATED_H))
    + LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
    + LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
    + 
 3:  775c37bc69 !  3:  c881176a8f Makefile: have "make pot" not "reset --hard"
    @@ Makefile: INSTALL = install
      MSGFMT = msgfmt
      CURL_CONFIG = curl-config
      GCOV = gcov
    +@@ Makefile: SOURCES_CMD = ( \
    + 		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
    + 		-o \( -name contrib -type d -prune \) \
    + 		-o \( -name build -type d -prune \) \
    ++		-o \( -name .build -type d -prune \) \
    + 		-o \( -name 'trash*' -type d -prune \) \
    + 		-o \( -name '*.[hcS]' -type f -print \) \
    + 		-o \( -name '*.sh' -type f -print \) \
     @@ Makefile: XGETTEXT_FLAGS = \
      	--force-po \
      	--add-comments=TRANSLATORS: \
      	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
     +	--package-name=Git \
    - 	--sort-by-file \
      	--from-code=UTF-8
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    -@@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    - 	--keyword=gettextln --keyword=eval_gettextln
    - XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
    - 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    -+MSGCAT_FLAGS = --sort-by-file
    - LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    - 	      $(GENERATED_H)
    - LOCALIZED_SH = $(SCRIPT_SH)
    + 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
     @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
      LOCALIZED_PERL += t/t0200/test.perl
      endif
    @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
     -	git reset --hard
     -	mv $@+ $@
     +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
    -+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
    ++	$(QUIET_GEN)$(MSGCAT) $(filter-out FORCE,$^) >$@
      
      .PHONY: pot
      pot: po/git.pot
 4:  55ee049b0a !  4:  672c91c341 i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Commit message
     
      ## Makefile ##
     @@ Makefile: XGETTEXT_FLAGS = \
    + 	--force-po \
      	--add-comments=TRANSLATORS: \
      	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    - 	--package-name=Git \
    --	--sort-by-file \
    +-	--package-name=Git \
     -	--from-code=UTF-8
    -+	--sort-by-file
    ++	--package-name=Git
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
      	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
      XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 -:  ---------- >  5:  475680c594 Makefile: remove duplicate and unwanted files in FOUND_SOURCE_FILES
 5:  69338521aa =  6:  9023b94c65 po/git.pot: this is now a generated file
 6:  6f80bd0461 !  7:  a46dca5e0d po/git.pot: don't check in result of "make pot"
    @@ Makefile: endef
      	$(QUIET_GEN)$(gen_pot_header)
      
     -po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
    --	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
    +-	$(QUIET_GEN)$(MSGCAT) $(filter-out FORCE,$^) >$@
     +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    -+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
    ++	$(QUIET_GEN)$(MSGCAT) $^ >$@
      
      .PHONY: pot
      pot: po/git.pot
 7:  5cd2c0741d !  8:  2077310e57 Makefile: add "po-update" rule to update po/XX.po
    @@ Makefile: TCLTK_PATH = wish
      GCOV = gcov
      STRIP = strip
     @@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    + 	--keyword=gettextln --keyword=eval_gettextln
      XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
      	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    - MSGCAT_FLAGS = --sort-by-file
     +MSGMERGE_FLAGS = --add-location --backup=off --update
    - LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    - 	      $(GENERATED_H)
    - LOCALIZED_SH = $(SCRIPT_SH)
    + LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    + 	        $(GENERATED_H))
    + LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
     @@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      .PHONY: pot
      pot: po/git.pot
 8:  246720695a !  9:  bd810adb20 Makefile: add "po-init" rule to initialize po/XX.po
    @@ Commit message
         translation" that a new l10n contributor must complete before sending
         pull request to the l10n coordinator.
     
    -    By pulling in some parts of the git-po-helper[^1] logic, we add rule
    -    "core-pot" to create this core translation message "po/git-core.pot":
    +    By pulling in some parts of the git-po-helper[^1] logic, we add a new
    +    rule to create this core translation message "po/git-core.pot":
     
    -        make core-pot
    +        make po/git-core.pot
     
         To help new l10n contributors to initialized their "po/XX.pot" from
         "po/git-core.pot", we also add new rules "po-init":
    @@ Makefile: po-update: po/git.pot
     +
     +LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
     +
    -+.PHONY: core-pot
    -+core-pot: po/git-core.pot
    -+
     +.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
     +	$(call mkdir_p_parent_template)
     +	$(QUIET_GEN)$(gen_pot_header)
     +
     +po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
    -+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
    ++	$(QUIET_GEN)$(MSGCAT) $^ >$@
     +
     +.PHONY: po-init
     +po-init: po/git-core.pot
 9:  131f52ac3a = 10:  38ab065c55 l10n: Document the new l10n workflow
---
Jiang Xin (5):
  Makefile: sort source files before feeding to xgettext
  Makefile: generate "po/git.pot" from stable LOCALIZED_C
  Makefile: remove duplicate and unwanted files in FOUND_SOURCE_FILES
  po/git.pot: this is now a generated file
  Makefile: add "po-update" rule to update po/XX.po
Ævar Arnfjörð Bjarmason (5):
  Makefile: have "make pot" not "reset --hard"
  i18n CI: stop allowing non-ASCII source messages in po/git.pot
  po/git.pot: don't check in result of "make pot"
  Makefile: add "po-init" rule to initialize po/XX.po
  l10n: Document the new l10n workflow
 .gitignore                  |     1 +
 Makefile                    |   153 +-
 builtin/submodule--helper.c |     2 +-
 ci/run-static-analysis.sh   |     2 +
 po/.gitignore               |     2 +
 po/README.md                |   230 +-
 po/git.pot                  | 25151 ----------------------------------
 shared.mak                  |     2 +
 8 files changed, 250 insertions(+), 25293 deletions(-)
 delete mode 100644 po/git.pot
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 02/10] Makefile: generate "po/git.pot" from stable LOCALIZED_C

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Different users may generate a different message template file "po/git.pot". This is because the POT file is generated from "$(LOCALIZED_C)", which is supposed to list all the sources that we extract the strings to be translated from. But "$(LOCALIZED_C)" includes "$(C_OBJ)", which only lists the source files used in the current build for a specific platform and specific compiler conditions.

Instead of using "$(C_OBJ)", we use "$(FOUND_C_SOURCES)", which lists all source files we keep track of (or ship in a tarball extract), to form a stable "LOCALIZED_C". We also add "$(SCALAR_SOURCES)", which is part of "$(C_OBJ)" but not included in "$(FOUND_C_SOURCES)".

With this update, the newly generated "po/git.pot" will have 30 new entries coming from the following C source files:

 * compat/fsmonitor/fsm-listen-win32.c
 * compat/mingw.c
 * compat/regex/regcomp.c
 * compat/simple-ipc/ipc-win32.c
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Show changes to Makefile +2 −1
diff --git a/Makefile b/Makefile
index 7ca95cdb82..f2f9c9bc81 100644
--- a/Makefile
+++ b/Makefile
@@ -2713,7 +2713,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(sort $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H))
+LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
+	        $(GENERATED_H))
 LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
 LOCALIZED_PERL = $(sort $(SCRIPT_PERL))
 
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 10/10] l10n: Document the new l10n workflow

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Change the "flow" of how translators interact with the l10n repository at [1] to adjust it for a new workflow of not having a po/git.pot file in-tree at all, and to not commit line numbers to the po/*.po files that we do track in tree.

The current workflow was added in a combination of dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) and 271ce198cd0 (Update l10n guide, 2012-02-29).

As noted in preceding commits I think that it came about due to technical debt I'd left behind in how the "po/git.pot" file was created, and a mis-impression that the file:line comments were needed as anything more than a transitory translation aid.

As the updated po/README.md shows the new workflow is substantially the same, the difference is that translators no longer need to initially pull from the l10n coordinator for a new po/git.pot, they can simply use git.git's canonical source repository.

The l10n coordinator is still expected to announce a release to translate, which presumably would always be Junio's latest release tag. I'm not certain if this part of the process is actually important. I.e. the delta translation-wise between that tag and "master" is usually pretty small, so perhaps translators can just work on "master" instead.

1. https://github.com/git-l10n/git-po/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/README.md | 230 ++++++++++++++++++++++++++-------------------------
 1 file changed, 117 insertions(+), 113 deletions(-)
Show changes to po/README.md +117 −113
diff --git a/po/README.md b/po/README.md
index 19fabb4acf..74856ca5bf 100644
--- a/po/README.md
+++ b/po/README.md
@@ -9,8 +9,14 @@ coordinates our localization effort in the l10 coordinator repository:
 
     https://github.com/git-l10n/git-po/
 
-The two character language translation codes are defined by ISO\_639-1, as
-stated in the gettext(1) full manual, appendix A.1, Usual Language Codes.
+We will use XX as an alias to refer to the language translation code in
+the following paragraphs, for example we use "po/XX.po" to refer to the
+translation file for a specific language. But this doesn't mean that
+the language code has only two letters. The language code can be in one
+of two forms: "ll" or "ll\_CC". Here "ll" is the ISO 639 two-letter
+language code and "CC" is the ISO 3166 two-letter code for country names
+and subdivisions. For example: "de" for German language code, "zh\_CN"
+for Simplified Chinese language code.
 
 
 ## Contributing to an existing translation
@@ -39,72 +45,74 @@ language, so that the l10n coordinator only needs to interact with one
 person per language.
 
 
-## Core translation
+## Translation Process Flow
 
-The core translation is the smallest set of work that must be completed
-for a new language translation. Because there are more than 5000 messages
-in the template message file "po/git.pot" that need to be translated,
-this is not a piece of cake for the contributor for a new language.
+The overall data-flow looks like this:
 
-The core template message file which contains a small set of messages
-will be generated in "po-core/core.pot" automatically by running a helper
-program named "git-po-helper" (described later).
+    +-------------------+             +------------------+
+    | Git source code   | ----(2)---> | L10n coordinator |
+    | repository        | <---(5)---- | repository       |
+    +-------------------+             +------------------+
+                    |                     |    ^
+                   (1)                   (3)  (4)
+                    V                     v    |
+               +----------------------------------+
+               |        Language Team XX          |
+               +----------------------------------+
 
-```shell
-git-po-helper init --core XX.po
-```
+- Translatable strings are marked in the source file.
+- Language teams can start translation iterations at any time, even
+  before the l10n window opens:
 
-After translating the generated "po-core/XX.po", you can merge it to
-"po/XX.po" using the following commands:
+  + Pull from the master branch of the source (1)
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
 
-```shell
-msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
-mv /tmp/XX.po po/XX.po
-git-po-helper update XX.po
-```
+- The L10n coordinator pulls from source and announces the l10n window
+  open (2)
+- Language team pulls from the l10n coordinator, starts another
+  translation iteration against the l10n coordinator's tree (3)
 
-Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
-translated messages and duplicate messages.
+  + Run "git pull --rebase" from the l10n coordinator
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
+  + Squash trivial l10n git commits using "git rebase -i"
 
+- Language team sends pull request to the l10n coordinator (4)
+- L10n coordinator checks and merges
+- L10n coordinator asks the result to be pulled (5).
 
-## Translation Process Flow
 
-The overall data-flow looks like this:
+## Dynamically generated POT files
 
-    +-------------------+            +------------------+
-    | Git source code   | ---(1)---> | L10n coordinator |
-    | repository        | <---(4)--- | repository       |
-    +-------------------+            +------------------+
-                                          |      ^
-                                         (2)    (3)
-                                          V      |
-                                     +------------------+
-                                     | Language Team XX |
-                                     +------------------+
+POT files are templates for l10n contributors to create or update their
+translation files. We used to have the "po/git.pot" file which was
+generated by the l10n coordinator, but this file had been removed from
+the tree.
 
-- Translatable strings are marked in the source file.
-- L10n coordinator pulls from the source (1)
-- L10n coordinator updates the message template "po/git.pot"
-- Language team pulls from L10n coordinator (2)
-- Language team updates the message file "po/XX.po"
-- L10n coordinator pulls from Language team (3)
-- L10n coordinator asks the result to be pulled (4).
+The two POT files "po/git.pot" and "po/git-core.pot" can be created
+dynamically when necessary.
 
+L10n contributors use "po/git.pot" to prepare translations for their
+languages, but they are not expected to modify it. The "po/git.pot" file
+can be generated manually with the following command:
 
-## Maintaining the "po/git.pot" file
+```shell
+make po/git.pot
+```
 
-(This is done by the l10n coordinator).
+The "po/git-core.pot" file is the template for core translations. A core
+translation is the minimum set of work necessary to complete a
+translation of a new language. Since there are more than 5000 messages
+in the full set of template message file "po/git.pot" that need to be
+translated, this is not a piece of cake for new language contributors.
 
-The "po/git.pot" file contains a message catalog extracted from Git's
-sources. The l10n coordinator maintains it by adding new translations with
-msginit(1), or update existing ones with msgmerge(1).  In order to update
-the Git sources to extract the messages from, the l10n coordinator is
-expected to pull from the main git repository at strategic point in
-history (e.g. when a major release and release candidates are tagged),
-and then run "make pot" at the top-level directory.
+The "core" template file "po/git-core.pot" can be generated manually
+by running:
 
-Language contributors use this file to prepare translations for their
-language, but they are not expected to modify it.
+```shell
+make po/git-core.pot
+```
 
 
 ## Initializing a "XX.po" file
@@ -115,32 +123,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
 you add a translation for the first time by running:
 
 ```shell
-msginit --locale=XX
+make po-init PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
-"zh\_CN", etc.
-
-Then edit the automatically generated copyright info in your new "XX.po"
-to be correct, e.g. for Icelandic:
-
-```diff
-@@ -1,6 +1,6 @@
--# Icelandic translations for PACKAGE package.
--# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
--# This file is distributed under the same license as the PACKAGE package.
-+# Icelandic translations for Git.
-+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-+# This file is distributed under the same license as the Git package.
- # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
-```
-
-And change references to PACKAGE VERSION in the PO Header Entry to
-just "Git":
+where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
 
-```shell
-perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
-```
+The newly generated message file "po/XX.po" is based on the core pot
+file "po/git-core.pot", so it contains only a minimal set of messages
+and it's a good start for a new language contribution.
 
 Once you are done testing the translation (see below), commit the result
 and ask the l10n coordinator to pull from you.
@@ -153,19 +143,53 @@ and ask the l10n coordinator to pull from you.
 If you are replacing translation strings in an existing "XX.po" file to
 improve the translation, just edit the file.
 
-If there's an existing "XX.po" file for your language, but the repository
-of the l10n coordinator has newer "po/git.pot" file, you would need to first
-pull from the l10n coordinator (see the beginning of this document for its
-URL), and then update the existing translation by running:
+If you want to find new translatable strings in source files of upstream
+repository and propagate them to your "po/XX.po", run command:
 
 ```shell
-msgmerge --add-location --backup=off -U XX.po git.pot
+make po-update PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where "XX.po" is the file you want to update.
+It will:
 
-Once you are done testing the translation (see below), commit the result
-and ask the l10n coordinator to pull from you.
+- Call "make po/git.pot" to generate new "po/git.pot" file
+- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
+  to update your "po/XX.po"
+- The "--add-location" option for msgmerge will add location lines,
+  and these location lines will help translation tools to locate
+  translation context easily.
+
+Once you are done testing the translation (see below), it's better
+to commit a location-less "po/XX.po" file to save repository space
+and make a user-friendly patch for review.
+
+To save a location-less "po/XX.po" automatically in repository, you
+can:
+
+First define a new attribute for "po/XX.po" by appending the following
+line in ".git/info/attributes":
+
+```
+/po/XX.po filter=gettext-no-location
+```
+
+Then define the driver for the "gettext-no-location" clean filter to
+strip out both filenames and locations from the contents as follows:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --no-location -"
+```
+
+For users who have gettext version 0.20 or higher, it is also possible
+to define a clean filter to preserve filenames but not locations:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --add-location=file -"
+```
+
+You're now ready to ask the l10n coordinator to pull from you.
 
 
 ## Fuzzy translation
@@ -196,6 +220,14 @@ common errors, e.g. missing printf format strings, or translated
 messages that deviate from the originals in whether they begin/end
 with a newline or not.
 
+L10n coordinator will check your contributions using a helper program
+(see "PO helper" section below):
+
+```shell
+git-po-helper check-po po/XX.po
+git-po-helper check-commits <rev-list-opts>
+```
+
 
 ## Marking strings for translation
 
@@ -370,29 +402,6 @@ l10n workflow.
 To build and install the helper program from source, see
 [git-po-helper/README][].
 
-Usage for git-po-helper:
-
-- To start a new language translation:
-
-  ```shell
-  git-po-helper init XX.po
-  ```
-
-- To update your "XX.po" file:
-
-  ```shell
-  git-po-helper update XX.po
-  ```
-
-- To check commit log and syntax of "XX.po":
-
-  ```shell
-  git-po-helper check-po XX.po
-  git-po-helper check-commits
-  ```
-
-Run "git-po-helper" without arguments to show usage.
-
 
 ## Conventions
 
@@ -436,13 +445,8 @@ additional conventions:
 - Initialize proper filename of the "XX.po" file conforming to
   iso-639 and iso-3166.
 
-- Must complete a minimal translation based on the "po-core/core.pot"
-  template. Using the following command to initialize the minimal
-  "po-core/XX.po" file:
-
-  ```shell
-  git-po-helper init --core <your-language>
-  ```
+- Must complete a minimal translation based on the "Core
+  translation". See that section above.
 
 - Add a new entry in the "po/TEAMS" file with proper format, and check
   the syntax of "po/TEAMS" by running the following command:
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 06/10] po/git.pot: this is now a generated file

We no longer keep track of the contents of this file.
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Please remove the "po/git.pot" file manually.
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot
Junio C Hamano· May 26, 2022, 17:32 UTC · re: Jiang Xin · lore

Re: [PATCH v5 06/10] po/git.pot: this is now a generated file

Jiang Xin <worldhello.net@gmail.com> writes:
Show 9 quoted lines
> We no longer keep track of the contents of this file.
>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> ---
>  Please remove the "po/git.pot" file manually.
>
>  po/git.pot | 25151 ---------------------------------------------------
>  1 file changed, 25151 deletions(-)
>  delete mode 100644 po/git.pot

FWIW, these large patches from previous rounds seem to have finally appeared in the list archive, e.g.

https://lore.kernel.org/git/20220523152128.26380-1-worldhello.net@gmail.com/T/#m505ac9e82e1bbd280c4993027e6bcf0740473fda
Will commit a removal for now.
Thanks.
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 04/10] i18n CI: stop allowing non-ASCII source messages in po/git.pot

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

In the preceding commit we moved away from using xgettext(1) to both generate the po/git.pot, and to merge the incrementally generated po/git.pot+ file as we sourced translations from C, shell and Perl.

Doing it this way, which dates back to my initial implementation[1][2][3] was conflating two things: With xgettext(1) the --from-code both controls what encoding is specified in the po/git.pot's header, and what encoding we allow in source messages.

We don't ever want to allow non-ASCII in *source messages*, and doing so has hid e.g. a buggy message introduced in a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C, 2021-08-10) from us, we'd warn about it before, but only when running "make pot", but the operation would still succeed. Now we'll error out on it when running "make pot".

Since the preceding Makefile changes made this easy: let's add a "make check-pot" target with the same prerequisites as the "po/git.pot" target, but without changing the file "po/git.pot". Running it as part of the "static-analysis" CI target will ensure that we catch any such issues in the future. E.g.:

    $ make check-pot
        XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
              Please specify the source encoding through --from-code.
    make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
   marked for translation, 2011-02-22)
2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
   2011-05-14)
3. 5e9637c6297 (i18n: add infrastructure for translating Git with
   gettext, 2011-11-18)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile                    | 6 ++++--
 builtin/submodule--helper.c | 2 +-
 ci/run-static-analysis.sh   | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)
Show changes to 3 files +7 −3

Makefile, builtin/submodule--helper.c, ci/run-static-analysis.sh

diff --git a/Makefile b/Makefile
index 49176822ad..72a3ddaed4 100644
--- a/Makefile
+++ b/Makefile
@@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
-	--package-name=Git \
-	--from-code=UTF-8
+	--package-name=Git
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
@@ -2793,6 +2792,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
 .PHONY: pot
 pot: po/git.pot
 
+.PHONY: check-pot
+check-pot: $(LOCALIZED_ALL_GEN_PO)
+
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2c87ef9364..b97f02eed5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
 			   N_("reference repository")),
 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
-			   N_("sets the submodule’s name to the given string "
+			   N_("sets the submodule's name to the given string "
 			      "instead of defaulting to its path")),
 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
 		OPT_END()
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 65bcebda41..0d51e5ce0e 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -29,4 +29,6 @@ fi
 make hdr-check ||
 exit 1
 
+make check-pot
+
 save_good_tree
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 05/10] Makefile: remove duplicate and unwanted files in FOUND_SOURCE_FILES

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

We get source files saved in "$(FOUND_SOURCE_FILES)" by running the command "git ls-files" or the command "find". We tried to have the both commands return the same list of files, but apparently the "find" command will return more files, such as the generated headers. We can filter out these generated headers to get closer results.

In addition to this, "$(FOUND_SOURCE_FILES)" may contain duplicate files. E.g. "git-ls-files" may have duplicate entries for the same file in different staging areas if there are unresolved conflicts in the working tree. For this case, we can reduce duplicate entries by passing the option "--deduplicate" to git-ls-files.

Junio reported that when running "make" in a working tree with unresolved conflicts, "make" may report warnings like below:

    Makefile:xxxx: target '.build/pot/po/FOO.c.po' given more than once
                   in the same rule

The duplicate targets are introduced by the following pattern rule we added in the preceding commit for incremental build of "po/git.pot".

    $(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %

Although we have resolved this issue by sorting to create a unique $(LOCALIZED_C), other targets may benefit from this. Such as: tags, cscope.out, etc.

Reported-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
Show changes to Makefile +2 −2
diff --git a/Makefile b/Makefile
index 72a3ddaed4..0cc397d214 100644
--- a/Makefile
+++ b/Makefile
@@ -845,7 +845,7 @@ generated-hdrs: $(GENERATED_H)
 ## Exhaustive lists of our source files, either dynamically generated,
 ## or hardcoded.
 SOURCES_CMD = ( \
-	git ls-files \
+	git ls-files --deduplicate \
 		'*.[hcS]' \
 		'*.sh' \
 		':!*[tp][0-9][0-9][0-9][0-9]*' \
@@ -862,7 +862,7 @@ SOURCES_CMD = ( \
 		-o \( -name '*.sh' -type f -print \) \
 		| sed -e 's|^\./||' \
 	)
-FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
+FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))
 
 FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
 FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 08/10] Makefile: add "po-update" rule to update po/XX.po

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Since there is no longer a "po/git.pot" file in tree, a l10n team leader has to run several commands to update their "po/XX.po" file:

    $ make pot
    $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot

To make this process easier, add a new rule so that l10n team leaders can update their "po/XX.po" with one command. E.g.:

    $ make po-update PO_FILE=po/zh_CN.po
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile   | 18 ++++++++++++++++++
 shared.mak |  1 +
 2 files changed, 19 insertions(+)
Show changes to 2 files +19 −0

Makefile, shared.mak

diff --git a/Makefile b/Makefile
index cc3eb856b2..efd242b255 100644
--- a/Makefile
+++ b/Makefile
@@ -571,6 +571,7 @@ TCLTK_PATH = wish
 XGETTEXT = xgettext
 MSGCAT = msgcat
 MSGFMT = msgfmt
+MSGMERGE = msgmerge
 CURL_CONFIG = curl-config
 GCOV = gcov
 STRIP = strip
@@ -2715,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
+MSGMERGE_FLAGS = --add-location --backup=off --update
 LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
 	        $(GENERATED_H))
 LOCALIZED_SH = $(sort $(SCRIPT_SH) git-sh-setup.sh)
@@ -2792,6 +2794,22 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+define check_po_file_envvar
+	$(if $(PO_FILE), \
+		$(if $(filter po/%.po,$(PO_FILE)), , \
+			$(error PO_FILE should match pattern: "po/%.po")), \
+		$(error PO_FILE is not defined))
+endef
+
+.PHONY: po-update
+po-update: po/git.pot
+	$(check_po_file_envvar)
+	@if test ! -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) does not exist"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
+
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
diff --git a/shared.mak b/shared.mak
index 50d4596f0d..8cd170a7e7 100644
--- a/shared.mak
+++ b/shared.mak
@@ -63,6 +63,7 @@ ifndef V
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
+	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
 	QUIET_SP       = @echo '   ' SP $<;
 	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 07/10] po/git.pot: don't check in result of "make pot"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Remove the "po/git.pot" file from being tracked, which started with dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13).

The reason the po/git.pot started being checked in was because the po/*.po files were changed a schema where we'd generate them from a known-good snapshot of po/git.pot, instead of each translator running "make pot" themselves.

This makes sense, but we don't need to carry this file in-tree just to achieve that aim, and doing so has resulted in a significant amount of "diff churn" since this method of doing it was introduced:

    $ git log -p --oneline -- po/git.pot|wc -l
    553743

We can instead let l10n contributors to generate "po/git.pot" in runtime to update their own "po/XX.po", and the l10n coordinator can check pull requests using CI pipeline.

This reverts to the schema introduced initially in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22).

The actual "git rm" of po/git.pot was in preceding commit to make this change easier to review, and to preempt the mailing list from blocking it due to it being too large.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile      | 5 +++--
 po/.gitignore | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)
Show changes to 2 files +4 −2

Makefile, po/.gitignore

diff --git a/Makefile b/Makefile
index 0cc397d214..cc3eb856b2 100644
--- a/Makefile
+++ b/Makefile
@@ -2786,8 +2786,8 @@ endef
 	$(call mkdir_p_parent_template)
 	$(QUIET_GEN)$(gen_pot_header)
 
-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
-	$(QUIET_GEN)$(MSGCAT) $(filter-out FORCE,$^) >$@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $^ >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3330,6 +3330,7 @@ cocciclean:
 
 clean: profile-clean coverage-clean cocciclean
 	$(RM) -r .build
+	$(RM) po/git.pot
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
diff --git a/po/.gitignore b/po/.gitignore
index 796b96d1c4..37d1301b32 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1 +1,2 @@
 /build
+/git.pot
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 09/10] Makefile: add "po-init" rule to initialize po/XX.po

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

The core translation is the minimum set of work that must be done for a new language translation.

There are over 5000 messages in the template message file "po/git.pot" that need to be translated. It is not a piece of cake for such a huge workload. So we used to define a small set of messages called "core translation" that a new l10n contributor must complete before sending pull request to the l10n coordinator.

By pulling in some parts of the git-po-helper[^1] logic, we add a new rule to create this core translation message "po/git-core.pot":

    make po/git-core.pot

To help new l10n contributors to initialized their "po/XX.pot" from "po/git-core.pot", we also add new rules "po-init":

    make po-init PO_FILE=po/XX.po
[^1]: https://github.com/git-l10n/git-po-helper/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile      | 40 +++++++++++++++++++++++++++++++++++++++-
 po/.gitignore |  1 +
 shared.mak    |  1 +
 3 files changed, 41 insertions(+), 1 deletion(-)
Show changes to 3 files +41 −1

Makefile, po/.gitignore, shared.mak

diff --git a/Makefile b/Makefile
index efd242b255..0a5b4b4ede 100644
--- a/Makefile
+++ b/Makefile
@@ -2806,6 +2806,7 @@ po-update: po/git.pot
 	$(check_po_file_envvar)
 	@if test ! -e $(PO_FILE); then \
 		echo >&2 "error: $(PO_FILE) does not exist"; \
+		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
 		exit 1; \
 	fi
 	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
@@ -2813,6 +2814,43 @@ po-update: po/git.pot
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
+### TODO FIXME: Translating everything in these files is a bad
+### heuristic for "core", as we'll translate obscure error() messages
+### along with commonly seen i18n messages. A better heuristic would
+### be to e.g. use spatch to first remove error/die/warning
+### etc. messages.
+LOCALIZED_C_CORE =
+LOCALIZED_C_CORE += builtin/checkout.c
+LOCALIZED_C_CORE += builtin/clone.c
+LOCALIZED_C_CORE += builtin/index-pack.c
+LOCALIZED_C_CORE += builtin/push.c
+LOCALIZED_C_CORE += builtin/reset.c
+LOCALIZED_C_CORE += remote.c
+LOCALIZED_C_CORE += wt-status.c
+
+LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
+
+.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
+
+po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $^ >$@
+
+.PHONY: po-init
+po-init: po/git-core.pot
+	$(check_po_file_envvar)
+	@if test -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) exists already"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGINIT)msginit \
+		--input=$< \
+		--output=$(PO_FILE) \
+		--no-translator \
+		--locale=$(PO_FILE:po/%.po=%)
+
+## po/*.po files & their rules
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
@@ -3348,7 +3386,7 @@ cocciclean:
 
 clean: profile-clean coverage-clean cocciclean
 	$(RM) -r .build
-	$(RM) po/git.pot
+	$(RM) po/git.pot po/git-core.pot
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
diff --git a/po/.gitignore b/po/.gitignore
index 37d1301b32..ff0e5176a6 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,2 +1,3 @@
 /build
 /git.pot
+/git-core.pot
diff --git a/shared.mak b/shared.mak
index 8cd170a7e7..4330192e9c 100644
--- a/shared.mak
+++ b/shared.mak
@@ -62,6 +62,7 @@ ifndef V
 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 26, 2022, 14:50 UTC · re: Jiang Xin · lore

[PATCH v5 03/10] Makefile: have "make pot" not "reset --hard"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our custom PRItime format, 2017-07-20), we'd consider source files as-is with gettext, but because we need to understand PRItime in the same way that gettext itself understands PRIuMAX, we'd first check if we had a clean checkout, then munge all of the processed files in-place with "sed", generate "po/git.pot", and then finally "reset --hard" to undo our changes.

By generating "pot" snippets in ".build/pot/po" for each source file and rewriting certain source files with PRItime macros to temporary files in ".build/pot/po", we can avoid running "make pot" by altering files in place and doing a "reset --hard" afterwards.

This speed of "make pot" is slower than before on an initial run, because we run "xgettext" many times (once per source file), but it can be boosted by parallelization. It is *much* faster for incremental runs, and will allow us to implement related targets in subsequent commits.

When the "pot" target was originally added in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
re-generation of the po/git.pot if nothing had to be done.

Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked target, 2014-08-22) when it was made to depend on "FORCE". I.e. the Makefile's dependency resolution inherently can't handle incremental building when the target file may be updated by git (or something else external to "make"). But this case no longer applies, so FORCE is no longer needed.

That out of the way, the main logic change here is getting rid of the "reset --hard":

We'll generate intermediate ".build/pot/po/%.po" files from "%", which is handy to see at a glance what strings (if any) in a given file are marked for translation:

	$ make .build/pot/po/pretty.c.po
	[...]
	$ cat .build/pot/po/pretty.c.po
	#: pretty.c:1051
	msgid "unable to parse --pretty format"
	msgstr ""
	$

For these C source files which contain the PRItime macros, we will create temporary munged "*.c" files in a tree in ".build/pot/po" corresponding to our source tree, and have "xgettext" consider those. The rule needs to be careful to "(cd .build/pot/po && ...)", because otherwise the comments in the po/git.pot file wouldn't refer to the correct source locations (they'd be prefixed with ".build/pot/po"). These temporary munged "*.c” files will be removed immediately after the corresponding po files are generated, because some development tools cannot ignore the duplicate source files in the ".build" directory according to the ".gitignore" file, and that may cause trouble.

The output of the generated po/git.pot file is changed in one minor way: Because we're using msgcat(1) instead of xgettext(1) to concatenate the output we'll now disambiguate where "TRANSLATORS" comments come from, in cases where a message is the same in N files, and either only one has a "TRANSLATORS" comment, or they're different. E.g. for the "Your edited hunk[...]" message we'll now apply this change (comment content elided):

	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	 #: add-patch.c:1253 git-add--interactive.perl:1244
	 msgid ""
	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
	 msgstr ""

There are six such changes, and they all make the context more understandable, as msgcat(1) is better at handling these edge cases than xgettext(1)'s previously used "--join-existing" flag.

But filenames in the above disambiguation lines of extracted-comments have an extra ".po" extension compared to the filenames at the file locations. While we could rename the intermediate ".build/pot/po/%.po" files without the ".po" extension to use more intuitive filenames in the disambiguation lines of extracted-comments, but that will confuse developer tools with lots of invalid C or other source files in ".build/pot/po" directory.

The addition of "--omit-header" option for xgettext makes the "pot" snippets in ".build/pot/po/*.po" smaller. But as we'll see in a subsequent commit this header behavior has been hiding an encoding-related bug from us, so let's carry it forward instead of re-generating it with xgettext(1).

The "po/git.pot" file should have a header entry, because a proper header entry will increase the speed of creating a new po file using msginit and set a proper "POT-Creation-Date:" field in the header entry of a "po/XX.po" file. We use xgettext to generate a separate header file at ".build/pot/git.header" from "/dev/null", and use this header to assemble "po/git.pot".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 .gitignore |  1 +
 Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 60 insertions(+), 21 deletions(-)
Show changes to 2 files +60 −21

.gitignore, Makefile

diff --git a/.gitignore b/.gitignore
index e81de1063a..a452215764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@
 *.[aos]
 *.o.json
 *.py[co]
+.build/
 .depend/
 *.gcda
 *.gcno
diff --git a/Makefile b/Makefile
index f2f9c9bc81..49176822ad 100644
--- a/Makefile
+++ b/Makefile
@@ -569,6 +569,7 @@ INSTALL = install
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
+MSGCAT = msgcat
 MSGFMT = msgfmt
 CURL_CONFIG = curl-config
 GCOV = gcov
@@ -855,6 +856,7 @@ SOURCES_CMD = ( \
 		-o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
 		-o \( -name contrib -type d -prune \) \
 		-o \( -name build -type d -prune \) \
+		-o \( -name .build -type d -prune \) \
 		-o \( -name 'trash*' -type d -prune \) \
 		-o \( -name '*.[hcS]' -type f -print \) \
 		-o \( -name '*.sh' -type f -print \) \
@@ -2706,6 +2708,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--package-name=Git \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
@@ -2724,34 +2727,68 @@ LOCALIZED_SH += t/t0200/test.sh
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-## Note that this is meant to be run only by the localization coordinator
-## under a very controlled condition, i.e. (1) it is to be run in a
-## Git repository (not a tarball extract), (2) any local modifications
-## will be lost.
+## We generate intermediate .build/pot/po/%.po files containing a
+## extract of the translations we find in each file in the source
+## tree. We will assemble them using msgcat to create the final
+## "po/git.pot" file.
+LOCALIZED_ALL_GEN_PO =
+
+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
+
+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
+
+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
+
 ## Gettext tools cannot work with our own custom PRItime type, so
 ## we replace PRItime with PRIuMAX.  We need to update this to
 ## PRIdMAX if we switch to a signed type later.
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT) \
+	    if grep -q PRItime $<; then \
+		(\
+			sed -e 's|PRItime|PRIuMAX|g' <$< \
+				>.build/pot/po/$< && \
+			cd .build/pot/po && \
+			$(XGETTEXT) --omit-header \
+				-o $(@:.build/pot/po/%=%) \
+				$(XGETTEXT_FLAGS_C) $< && \
+			rm $<; \
+		); \
+	    else \
+		$(XGETTEXT) --omit-header \
+			-o $@ $(XGETTEXT_FLAGS_C) $<; \
+	    fi
 
-po/git.pot: $(GENERATED_H) FORCE
-	# All modifications will be reverted at the end, so we do not
-	# want to have any local change.
-	git diff --quiet HEAD && git diff --quiet --cached
+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_SH) $<
 
-	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
-	do \
-		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
-		cat "$$s+" >"$$s" && rm "$$s+"; \
-	done
+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_PERL) $<
+
+define gen_pot_header
+$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+	-o - /dev/null | \
+sed -e 's|charset=CHARSET|charset=UTF-8|' \
+    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
+    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
+    >$@ && \
+echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
+endef
 
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
-		$(LOCALIZED_SH)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
-		$(LOCALIZED_PERL)
+.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
 
-	# Reverting the munged source, leaving only the updated $@
-	git reset --hard
-	mv $@+ $@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
+	$(QUIET_GEN)$(MSGCAT) $(filter-out FORCE,$^) >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3290,6 +3327,7 @@ cocciclean:
 	$(RM) contrib/coccinelle/*.cocci.patch*
 
 clean: profile-clean coverage-clean cocciclean
+	$(RM) -r .build
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Different users may generate a different message template file "po/git.pot". This is because the POT file is generated from "$(LOCALIZED_C)", which is supposed to list all the sources that we extract the strings to be translated from. But "$(LOCALIZED_C)" includes "$(C_OBJ)", which only lists the source files used in the current build for a specific platform and specific compiler conditions.

Instead of using "$(C_OBJ)", we use "$(FOUND_C_SOURCES)", which lists all source files we keep track of (or ship in a tarball extract), to form a stable "LOCALIZED_C". We also add "$(SCALAR_SOURCES)", which is part of "$(C_OBJ)" but not included in "$(FOUND_C_SOURCES)".

With this update, the newly generated "po/git.pot" will have 30 new entries coming from the following C source files:

 * compat/fsmonitor/fsm-listen-win32.c
 * compat/mingw.c
 * compat/regex/regcomp.c
 * compat/simple-ipc/ipc-win32.c
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Show changes to Makefile +2 −1
diff --git a/Makefile b/Makefile
index 83e968e2a4..46914dcd80 100644
--- a/Makefile
+++ b/Makefile
@@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
+LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
+	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 7/9] Makefile: add "po-update" rule to update po/XX.po

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Since there is no longer a "po/git.pot" file in tree, a l10n team leader has to run several commands to update their "po/XX.po" file:

    $ make pot
    $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot

To make this process easier, add a new rule so that l10n team leaders can update their "po/XX.po" with one command. E.g.:

    $ make po-update PO_FILE=po/zh_CN.po
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile   | 18 ++++++++++++++++++
 shared.mak |  1 +
 2 files changed, 19 insertions(+)
Show changes to 2 files +19 −0

Makefile, shared.mak

diff --git a/Makefile b/Makefile
index 161ebf4ff3..34a64c5fa7 100644
--- a/Makefile
+++ b/Makefile
@@ -571,6 +571,7 @@ TCLTK_PATH = wish
 XGETTEXT = xgettext
 MSGCAT = msgcat
 MSGFMT = msgfmt
+MSGMERGE = msgmerge
 CURL_CONFIG = curl-config
 GCOV = gcov
 STRIP = strip
@@ -2716,6 +2717,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 MSGCAT_FLAGS = --sort-by-file
+MSGMERGE_FLAGS = --add-location --backup=off --update
 LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
 	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2794,6 +2796,22 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+define check_po_file_envvar
+	$(if $(PO_FILE), \
+		$(if $(filter po/%.po,$(PO_FILE)), , \
+			$(error PO_FILE should match pattern: "po/%.po")), \
+		$(error PO_FILE is not defined))
+endef
+
+.PHONY: po-update
+po-update: po/git.pot
+	$(check_po_file_envvar)
+	@if test ! -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) does not exist"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
+
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
diff --git a/shared.mak b/shared.mak
index 50d4596f0d..8cd170a7e7 100644
--- a/shared.mak
+++ b/shared.mak
@@ -63,6 +63,7 @@ ifndef V
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
+	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
 	QUIET_SP       = @echo '   ' SP $<;
 	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 1/9] Makefile: sort "po/git.pot" by file location

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

We will feed xgettext with more C source files and in different order in subsequent commit. To generate a stable "po/git.pot" regardless of the number and order of input source files, we pass the option "--sort-by-file" to xgettext program.

With this update, the newly generated "po/git.pot" will have the same entries while in a different order.

With the help of a custom diff driver as shown below,
    git config --global diff.gettext-fmt.textconv \
        "msgcat --no-location --sort-by-file"

and appending a new entry "*.pot diff=gettext-fmt" to git attributes, we can see that there are no substantial changes in "po/git.pot".

We won't checkin the newly generated "po/git.pot", because we will remove it from tree in a later commit.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 1 +
 1 file changed, 1 insertion(+)
Show changes to Makefile +1 −0
diff --git a/Makefile b/Makefile
index f8bccfab5e..83e968e2a4 100644
--- a/Makefile
+++ b/Makefile
@@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 4/9] i18n CI: stop allowing non-ASCII source messages in po/git.pot

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

In the preceding commit we moved away from using xgettext(1) to both generate the po/git.pot, and to merge the incrementally generated po/git.pot+ file as we sourced translations from C, shell and Perl.

Doing it this way, which dates back to my initial implementation[1][2][3] was conflating two things: With xgettext(1) the --from-code both controls what encoding is specified in the po/git.pot's header, and what encoding we allow in source messages.

We don't ever want to allow non-ASCII in *source messages*, and doing so has hid e.g. a buggy message introduced in a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C, 2021-08-10) from us, we'd warn about it before, but only when running "make pot", but the operation would still succeed. Now we'll error out on it when running "make pot".

Since the preceding Makefile changes made this easy: let's add a "make check-pot" target with the same prerequisites as the "po/git.pot" target, but without changing the file "po/git.pot". Running it as part of the "static-analysis" CI target will ensure that we catch any such issues in the future. E.g.:

    $ make check-pot
        XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
              Please specify the source encoding through --from-code.
    make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
   marked for translation, 2011-02-22)
2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
   2011-05-14)
3. 5e9637c6297 (i18n: add infrastructure for translating Git with
   gettext, 2011-11-18)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile                    | 6 ++++--
 builtin/submodule--helper.c | 2 +-
 ci/run-static-analysis.sh   | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)
Show changes to 3 files +7 −3

Makefile, builtin/submodule--helper.c, ci/run-static-analysis.sh

diff --git a/Makefile b/Makefile
index 1962999c18..70d5f41c3f 100644
--- a/Makefile
+++ b/Makefile
@@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 	--package-name=Git \
-	--sort-by-file \
-	--from-code=UTF-8
+	--sort-by-file
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
@@ -2795,6 +2794,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
 .PHONY: pot
 pot: po/git.pot
 
+.PHONY: check-pot
+check-pot: $(LOCALIZED_ALL_GEN_PO)
+
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2c87ef9364..b97f02eed5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
 			   N_("reference repository")),
 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
-			   N_("sets the submodule’s name to the given string "
+			   N_("sets the submodule's name to the given string "
 			      "instead of defaulting to its path")),
 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
 		OPT_END()
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 65bcebda41..0d51e5ce0e 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -29,4 +29,6 @@ fi
 make hdr-check ||
 exit 1
 
+make check-pot
+
 save_good_tree
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 3/9] Makefile: have "make pot" not "reset --hard"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our custom PRItime format, 2017-07-20), we'd consider source files as-is with gettext, but because we need to understand PRItime in the same way that gettext itself understands PRIuMAX, we'd first check if we had a clean checkout, then munge all of the processed files in-place with "sed", generate "po/git.pot", and then finally "reset --hard" to undo our changes.

By generating "pot" snippets in ".build/pot/po" for each source file and rewriting certain source files with PRItime macros to temporary files in ".build/pot/po", we can avoid running "make pot" by altering files in place and doing a "reset --hard" afterwards.

This speed of "make pot" is slower than before on an initial run, because we run "xgettext" many times (once per source file), but it can be boosted by parallelization. It is *much* faster for incremental runs, and will allow us to implement related targets in subsequent commits.

When the "pot" target was originally added in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
re-generation of the po/git.pot if nothing had to be done.

Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked target, 2014-08-22) when it was made to depend on "FORCE". I.e. the Makefile's dependency resolution inherently can't handle incremental building when the target file may be updated by git (or something else external to "make"). But this case no longer applies, so FORCE is no longer needed.

That out of the way, the main logic change here is getting rid of the "reset --hard":

We'll generate intermediate ".build/pot/po/%.po" files from "%", which is handy to see at a glance what strings (if any) in a given file are marked for translation:

	$ make .build/pot/po/pretty.c.po
	[...]
	$ cat .build/pot/po/pretty.c.po
	#: pretty.c:1051
	msgid "unable to parse --pretty format"
	msgstr ""
	$

For these C source files which contain the PRItime macros, we will create temporary munged "*.c" files in a tree in ".build/pot/po" corresponding to our source tree, and have "xgettext" consider those. The rule needs to be careful to "(cd .build/pot/po && ...)", because otherwise the comments in the po/git.pot file wouldn't refer to the correct source locations (they'd be prefixed with ".build/pot/po"). These temporary munged "*.c” files will be removed immediately after the corresponding po files are generated, because some development tools cannot ignore the duplicate source files in the ".build" directory according to the ".gitignore" file, and that may cause trouble.

The output of the generated po/git.pot file is changed in one minor way: Because we're using msgcat(1) instead of xgettext(1) to concatenate the output we'll now disambiguate where "TRANSLATORS" comments come from, in cases where a message is the same in N files, and either only one has a "TRANSLATORS" comment, or they're different. E.g. for the "Your edited hunk[...]" message we'll now apply this change (comment content elided):

	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	 #: add-patch.c:1253 git-add--interactive.perl:1244
	 msgid ""
	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
	 msgstr ""

There are six such changes, and they all make the context more understandable, as msgcat(1) is better at handling these edge cases than xgettext(1)'s previously used "--join-existing" flag.

But filenames in the above disambiguation lines of extracted-comments have an extra ".po" extension compared to the filenames at the file locations. While we could rename the intermediate ".build/pot/po/%.po" files without the ".po" extension to use more intuitive filenames in the disambiguation lines of extracted-comments, but that will confuse developer tools with lots of invalid C or other source files in ".build/pot/po" directory.

The addition of "--omit-header" option for xgettext makes the "pot" snippets in ".build/pot/po/*.po" smaller. But as we'll see in a subsequent commit this header behavior has been hiding an encoding-related bug from us, so let's carry it forward instead of re-generating it with xgettext(1).

The "po/git.pot" file should have a header entry, because a proper header entry will increase the speed of creating a new po file using msginit and set a proper "POT-Creation-Date:" field in the header entry of a "po/XX.po" file. We use xgettext to generate a separate header file at ".build/pot/git.header" from "/dev/null", and use this header to assemble "po/git.pot".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 .gitignore |  1 +
 Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 60 insertions(+), 21 deletions(-)
Show changes to 2 files +60 −21

.gitignore, Makefile

diff --git a/.gitignore b/.gitignore
index e81de1063a..a452215764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@
 *.[aos]
 *.o.json
 *.py[co]
+.build/
 .depend/
 *.gcda
 *.gcno
diff --git a/Makefile b/Makefile
index 46914dcd80..1962999c18 100644
--- a/Makefile
+++ b/Makefile
@@ -569,6 +569,7 @@ INSTALL = install
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
+MSGCAT = msgcat
 MSGFMT = msgfmt
 CURL_CONFIG = curl-config
 GCOV = gcov
@@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--package-name=Git \
 	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
@@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
+MSGCAT_FLAGS = --sort-by-file
 LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
 	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2726,34 +2729,68 @@ LOCALIZED_SH += t/t0200/test.sh
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-## Note that this is meant to be run only by the localization coordinator
-## under a very controlled condition, i.e. (1) it is to be run in a
-## Git repository (not a tarball extract), (2) any local modifications
-## will be lost.
+## We generate intermediate .build/pot/po/%.po files containing a
+## extract of the translations we find in each file in the source
+## tree. We will assemble them using msgcat to create the final
+## "po/git.pot" file.
+LOCALIZED_ALL_GEN_PO =
+
+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
+
+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
+
+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
+
 ## Gettext tools cannot work with our own custom PRItime type, so
 ## we replace PRItime with PRIuMAX.  We need to update this to
 ## PRIdMAX if we switch to a signed type later.
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT) \
+	    if grep -q PRItime $<; then \
+		(\
+			sed -e 's|PRItime|PRIuMAX|g' <$< \
+				>.build/pot/po/$< && \
+			cd .build/pot/po && \
+			$(XGETTEXT) --omit-header \
+				-o $(@:.build/pot/po/%=%) \
+				$(XGETTEXT_FLAGS_C) $< && \
+			rm $<; \
+		); \
+	    else \
+		$(XGETTEXT) --omit-header \
+			-o $@ $(XGETTEXT_FLAGS_C) $<; \
+	    fi
 
-po/git.pot: $(GENERATED_H) FORCE
-	# All modifications will be reverted at the end, so we do not
-	# want to have any local change.
-	git diff --quiet HEAD && git diff --quiet --cached
+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_SH) $<
 
-	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
-	do \
-		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
-		cat "$$s+" >"$$s" && rm "$$s+"; \
-	done
+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_PERL) $<
+
+define gen_pot_header
+$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+	-o - /dev/null | \
+sed -e 's|charset=CHARSET|charset=UTF-8|' \
+    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
+    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
+    >$@ && \
+echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
+endef
 
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
-		$(LOCALIZED_SH)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
-		$(LOCALIZED_PERL)
+.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
 
-	# Reverting the munged source, leaving only the updated $@
-	git reset --hard
-	mv $@+ $@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3292,6 +3329,7 @@ cocciclean:
 	$(RM) contrib/coccinelle/*.cocci.patch*
 
 clean: profile-clean coverage-clean cocciclean
+	$(RM) -r .build
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 25, 2022, 22:19 UTC · re: Jiang Xin · lore

Re: [PATCH v4 3/9] Makefile: have "make pot" not "reset --hard"

Jiang Xin <worldhello.net@gmail.com> writes:
Show 20 quoted lines
>  ## Gettext tools cannot work with our own custom PRItime type, so
>  ## we replace PRItime with PRIuMAX.  We need to update this to
>  ## PRIdMAX if we switch to a signed type later.
> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT) \
> +	    if grep -q PRItime $<; then \
> +		(\
> +			sed -e 's|PRItime|PRIuMAX|g' <$< \
> +				>.build/pot/po/$< && \
> +			cd .build/pot/po && \
> +			$(XGETTEXT) --omit-header \
> +				-o $(@:.build/pot/po/%=%) \
> +				$(XGETTEXT_FLAGS_C) $< && \
> +			rm $<; \
> +		); \
> +	    else \
> +		$(XGETTEXT) --omit-header \
> +			-o $@ $(XGETTEXT_FLAGS_C) $<; \
> +	    fi
My build (a random hack on top of 'seen') is getting this message
$ make
Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
    SUBDIR git-gui

I haven't changed archive.c in particular relative to 'seen', and .build/pot/po directory seems to be empty (understandably---I have not run the po/ stuff myself lately).

Junio C Hamano· May 25, 2022, 22:24 UTC · re: Junio C Hamano · lore

Re: [PATCH v4 3/9] Makefile: have "make pot" not "reset --hard"

Junio C Hamano <gitster@pobox.com> writes:
Show 33 quoted lines
> Jiang Xin <worldhello.net@gmail.com> writes:
>
>>  ## Gettext tools cannot work with our own custom PRItime type, so
>>  ## we replace PRItime with PRIuMAX.  We need to update this to
>>  ## PRIdMAX if we switch to a signed type later.
>> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
>> +	$(call mkdir_p_parent_template)
>> +	$(QUIET_XGETTEXT) \
>> +	    if grep -q PRItime $<; then \
>> +		(\
>> +			sed -e 's|PRItime|PRIuMAX|g' <$< \
>> +				>.build/pot/po/$< && \
>> +			cd .build/pot/po && \
>> +			$(XGETTEXT) --omit-header \
>> +				-o $(@:.build/pot/po/%=%) \
>> +				$(XGETTEXT_FLAGS_C) $< && \
>> +			rm $<; \
>> +		); \
>> +	    else \
>> +		$(XGETTEXT) --omit-header \
>> +			-o $@ $(XGETTEXT_FLAGS_C) $<; \
>> +	    fi
>
> My build (a random hack on top of 'seen') is getting this message
>
> $ make
> Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
> Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
>     SUBDIR git-gui
>
> I haven't changed archive.c in particular relative to 'seen', and
> .build/pot/po directory seems to be empty (understandably---I have
> not run the po/ stuff myself lately).

Well, I lied. I am doing the random hack while in a conflicted state coming from an interrupted merge that had conflicts in the archive.c.

Perhaps we need some logic to dedup "ls-files" output?
Jiang Xin· May 26, 2022, 01:10 UTC · re: Junio C Hamano · lore

Re: [PATCH v4 3/9] Makefile: have "make pot" not "reset --hard"

On Thu, May 26, 2022 at 6:24 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 42 quoted lines
>
> Junio C Hamano <gitster@pobox.com> writes:
>
> > Jiang Xin <worldhello.net@gmail.com> writes:
> >
> >>  ## Gettext tools cannot work with our own custom PRItime type, so
> >>  ## we replace PRItime with PRIuMAX.  We need to update this to
> >>  ## PRIdMAX if we switch to a signed type later.
> >> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> >> +    $(call mkdir_p_parent_template)
> >> +    $(QUIET_XGETTEXT) \
> >> +        if grep -q PRItime $<; then \
> >> +            (\
> >> +                    sed -e 's|PRItime|PRIuMAX|g' <$< \
> >> +                            >.build/pot/po/$< && \
> >> +                    cd .build/pot/po && \
> >> +                    $(XGETTEXT) --omit-header \
> >> +                            -o $(@:.build/pot/po/%=%) \
> >> +                            $(XGETTEXT_FLAGS_C) $< && \
> >> +                    rm $<; \
> >> +            ); \
> >> +        else \
> >> +            $(XGETTEXT) --omit-header \
> >> +                    -o $@ $(XGETTEXT_FLAGS_C) $<; \
> >> +        fi
> >
> > My build (a random hack on top of 'seen') is getting this message
> >
> > $ make
> > Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
> > Makefile:2755: target '.build/pot/po/archive.c.po' given more than once in the same rule
> >     SUBDIR git-gui
> >
> > I haven't changed archive.c in particular relative to 'seen', and
> > .build/pot/po directory seems to be empty (understandably---I have
> > not run the po/ stuff myself lately).
>
> Well, I lied.  I am doing the random hack while in a conflicted
> state coming from an interrupted merge that had conflicts in the
> archive.c.
>
> Perhaps we need some logic to dedup "ls-files" output?

Yes, we can pass the option "--deduplicate" to git-ls-files to suppress duplicate entries for unresolved conflicts. Will send an additional patch for this.

Jiang Xin· May 26, 2022, 02:15 UTC · re: Junio C Hamano · lore

[PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

If there are unresolved conflicts left in the working tree, "make" may report warnings as follows:

    Makefile:xxxx: target '.build/pot/po/FOO.c.po' given more than once
                   in the same rule

The duplicate targets are introduced by the following pattern rule we added in the preceding commit for incremental build of "po/git.pot",

    $(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %

and the duplicate entries in $(LOCALIZED_C_GEN_PO) come from the "git ls-files" command in SOURCES_CMD.

We can pass the option "--deduplicate" to git-ls-files to suppress duplicate entries for unresolved conflicts.

Reported-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to Makefile +1 −1
diff --git a/Makefile b/Makefile
index a3f8446de9..a8880ed482 100644
--- a/Makefile
+++ b/Makefile
@@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
 ## Exhaustive lists of our source files, either dynamically generated,
 ## or hardcoded.
 SOURCES_CMD = ( \
-	git ls-files \
+	git ls-files --deduplicate \
 		'*.[hcS]' \
 		'*.sh' \
 		':!*[tp][0-9][0-9][0-9][0-9]*' \
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 26, 2022, 04:02 UTC · re: Jiang Xin · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

Jiang Xin <worldhello.net@gmail.com> writes:
Show 18 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> If there are unresolved conflicts left in the working tree, "make" may
> report warnings as follows:
>
>     Makefile:xxxx: target '.build/pot/po/FOO.c.po' given more than once
>                    in the same rule
>
> The duplicate targets are introduced by the following pattern rule we
> added in the preceding commit for incremental build of "po/git.pot",
>
>     $(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
>
> and the duplicate entries in $(LOCALIZED_C_GEN_PO) come from the
> "git ls-files" command in SOURCES_CMD.
>
> We can pass the option "--deduplicate" to git-ls-files to suppress
> duplicate entries for unresolved conflicts.
Thanks for a quick response.

We certainly can say "your SOURCES_CMD MUST NOT produce duplicates" and passing the --deduplicate option is one valid way to fix this specific case.

But I wonder if a more future-proof solution is to dedup the output of the SOURCES_CMD ourselves on the Makefile side. That way, even if we update SOURCES_CMD in a way that could contain duplicates, we won't have to worry about duplicates.

---

It feels way overkill to "sort" the list just to dedup its elements, but that is what GNU Make documentation info page recommends us to do, and we already do use it for deduplication in our Makefile twice.

'$(sort LIST)'
     Sorts the words of LIST in lexical order, removing duplicate words.
     The output is a list of words separated by single spaces.  Thus,
          $(sort foo bar lose)
     returns the value 'bar foo lose'.
     Incidentally, since 'sort' removes duplicate words, you can use it
     for this purpose even if you don't care about the sort order.
Show changes to diff +1 −1
diff --git i/Makefile w/Makefile
index 2b61f66259..1d3d3deba1 100644
--- i/Makefile
+++ w/Makefile
@@ -860,7 +860,7 @@ SOURCES_CMD = ( \
 		-o \( -name '*.sh' -type f -print \) \
 		| sed -e 's|^\./||' \
 	)
-FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
+FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
 
 FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
 FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
Jiang Xin· May 26, 2022, 06:06 UTC · re: Junio C Hamano · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26, 2022 at 12:03 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 66 quoted lines
>
> Jiang Xin <worldhello.net@gmail.com> writes:
>
> > From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >
> > If there are unresolved conflicts left in the working tree, "make" may
> > report warnings as follows:
> >
> >     Makefile:xxxx: target '.build/pot/po/FOO.c.po' given more than once
> >                    in the same rule
> >
> > The duplicate targets are introduced by the following pattern rule we
> > added in the preceding commit for incremental build of "po/git.pot",
> >
> >     $(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> >
> > and the duplicate entries in $(LOCALIZED_C_GEN_PO) come from the
> > "git ls-files" command in SOURCES_CMD.
> >
> > We can pass the option "--deduplicate" to git-ls-files to suppress
> > duplicate entries for unresolved conflicts.
>
> Thanks for a quick response.
>
> We certainly can say "your SOURCES_CMD MUST NOT produce duplicates"
> and passing the --deduplicate option is one valid way to fix this
> specific case.
>
> But I wonder if a more future-proof solution is to dedup the output
> of the SOURCES_CMD ourselves on the Makefile side.  That way, even
> if we update SOURCES_CMD in a way that could contain duplicates, we
> won't have to worry about duplicates.
>
> ---
>
> It feels way overkill to "sort" the list just to dedup its elements,
> but that is what GNU Make documentation info page recommends us to
> do, and we already do use it for deduplication in our Makefile
> twice.
>
> '$(sort LIST)'
>      Sorts the words of LIST in lexical order, removing duplicate words.
>      The output is a list of words separated by single spaces.  Thus,
>
>           $(sort foo bar lose)
>
>      returns the value 'bar foo lose'.
>
>      Incidentally, since 'sort' removes duplicate words, you can use it
>      for this purpose even if you don't care about the sort order.
>
>
> diff --git i/Makefile w/Makefile
> index 2b61f66259..1d3d3deba1 100644
> --- i/Makefile
> +++ w/Makefile
> @@ -860,7 +860,7 @@ SOURCES_CMD = ( \
>                 -o \( -name '*.sh' -type f -print \) \
>                 | sed -e 's|^\./||' \
>         )
> -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
> +FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
>
>  FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
>  FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
>
If I disabled the git-ls-files command like below,
    @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
     ## Exhaustive lists of our source files, either dynamically generated,
     ## or hardcoded.
     SOURCES_CMD = ( \
    -       git ls-files --deduplicate \
    +       git bad-ls-files --deduplicate \
                    '*.[hcS]' \
                    '*.sh' \
                    ':!*[tp][0-9][0-9][0-9][0-9]*' \
, and run "make", will display the following warnings:
    Makefile:2751: target `.build/pot/po/command-list.h.po' given more
than once in the same rule.
    Makefile:2751: target `.build/pot/po/config-list.h.po' given more
than once in the same rule.
    Makefile:2751: target `.build/pot/po/hook-list.h.po' given more
than once in the same rule.

This is because the three generated header files (defined in $(GENERATED_H)) are also included in the result of "SOURCES_CMD". We can fix this by sorting LOCALIZED_C:

    -LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
    -             $(GENERATED_H)
    +LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES)
$(SCALAR_SOURCES) \
    +               $(GENERATED_H))
Will send v2 patch.
Junio C Hamano· May 26, 2022, 06:23 UTC · re: Jiang Xin · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

Jiang Xin <worldhello.net@gmail.com> writes:
Show 21 quoted lines
>>         )
>> -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
>> +FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
>>
>>  FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
>>  FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
>>
>
> If I disabled the git-ls-files command like below,
>
>     @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
>...
> This is because the three generated header files (defined in
> $(GENERATED_H)) are also included in the result of "SOURCES_CMD". We
> can fix this by sorting LOCALIZED_C:
>
>     -LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
>     -             $(GENERATED_H)
>     +LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES)
> $(SCALAR_SOURCES) \
>     +               $(GENERATED_H))

If you make FOUND_SOURCE_FILES unique upfront, the at least there wouldn't be any duplicates there. Do you mean that some of what is in FOUND_SOURCE_FILES appear in either SCALAR_SOURCES or GENERATED_H?

If not, I think deduplicating near the source of the issue, i.e.
  FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))

may be sufficient. Deduplicating near the consumer, like LOCALIZED_C, may force us to dedup all the consumers of it (e.g. LOCALIZED_C is not the sole consumer of FOUND_C_SOURCES; you'd need to sort the input to COCCI_SOURCES, for example).

Thanks.
Jiang Xin· May 26, 2022, 07:04 UTC · re: Junio C Hamano · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26, 2022 at 2:23 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 28 quoted lines
>
> Jiang Xin <worldhello.net@gmail.com> writes:
>
> >>         )
> >> -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
> >> +FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
> >>
> >>  FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
> >>  FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
> >>
> >
> > If I disabled the git-ls-files command like below,
> >
> >     @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
> >...
> > This is because the three generated header files (defined in
> > $(GENERATED_H)) are also included in the result of "SOURCES_CMD". We
> > can fix this by sorting LOCALIZED_C:
> >
> >     -LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
> >     -             $(GENERATED_H)
> >     +LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES)
> > $(SCALAR_SOURCES) \
> >     +               $(GENERATED_H))
>
> If you make FOUND_SOURCE_FILES unique upfront, the at least there
> wouldn't be any duplicates there.  Do you mean that some of what is
> in FOUND_SOURCE_FILES appear in either SCALAR_SOURCES or GENERATED_H?

Yes. If find source files using "git-ls-files", the generated headers are not included in FOUND_SOURCE_FILES, but this is not the case for the find command.

> If not, I think deduplicating near the source of the issue, i.e.
>
>   FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))

If we pass the "--deduplicate" option to git-ls-files, we can make sure files are unique in FOUND_SOURCE_FILES. So sorting FOUND_SOURCE_FILES becomes unnecessary. But FOUND_SOURCE_FILES may contain generated files if using find instead of git-ls-files in SOURCES_CMD, that means sort FOUND_SOURCE_FILES is not enough. Instead of sorting it, we may want to filter-out the generated files from it, like:

    FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))

Exclude the several generated headers by add extra fixed options to find command is not good, but we may need to exclude the ".build" directory from the find command in SOURCES_CMD, in case we may duplicate C files in it in future version.

    --- a/Makefile
    +++ b/Makefile
    @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
    ## Exhaustive lists of our source files, either dynamically generated,
    ## or hardcoded.
    SOURCES_CMD = ( \
    -       git ls-files \
    +       git ls-files --deduplicate \
                   '*.[hcS]' \
                   '*.sh' \
                   ':!*[tp][0-9][0-9][0-9][0-9]*' \
    @@ -857,12 +857,13 @@ SOURCES_CMD = ( \
                   -o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
                   -o \( -name contrib -type d -prune \) \
                   -o \( -name build -type d -prune \) \
    +               -o \( -name .build -type d -prune \) \
                   -o \( -name 'trash*' -type d -prune \) \
                   -o \( -name '*.[hcS]' -type f -print \) \
                   -o \( -name '*.sh' -type f -print \) \
                   | sed -e 's|^\./||' \
           )
    -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
    +FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))
    FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
    FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
> may be sufficient.  Deduplicating near the consumer, like
> LOCALIZED_C, may force us to dedup all the consumers of it (e.g.
> LOCALIZED_C is not the sole consumer of FOUND_C_SOURCES; you'd need
> to sort the input to COCCI_SOURCES, for example).
If we apply the above patch, sorting LOCALIZED_C is not necessary.

-- Jiang Xin

Ævar Arnfjörð Bjarmason· May 26, 2022, 10:00 UTC · re: Jiang Xin · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26 2022, Jiang Xin wrote:
Show 70 quoted lines
> On Thu, May 26, 2022 at 2:23 PM Junio C Hamano <gitster@pobox.com> wrote:
>>
>> Jiang Xin <worldhello.net@gmail.com> writes:
>>
>> >>         )
>> >> -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
>> >> +FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
>> >>
>> >>  FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
>> >>  FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
>> >>
>> >
>> > If I disabled the git-ls-files command like below,
>> >
>> >     @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
>> >...
>> > This is because the three generated header files (defined in
>> > $(GENERATED_H)) are also included in the result of "SOURCES_CMD". We
>> > can fix this by sorting LOCALIZED_C:
>> >
>> >     -LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
>> >     -             $(GENERATED_H)
>> >     +LOCALIZED_C = $(sort $(FOUND_C_SOURCES) $(FOUND_H_SOURCES)
>> > $(SCALAR_SOURCES) \
>> >     +               $(GENERATED_H))
>>
>> If you make FOUND_SOURCE_FILES unique upfront, the at least there
>> wouldn't be any duplicates there.  Do you mean that some of what is
>> in FOUND_SOURCE_FILES appear in either SCALAR_SOURCES or GENERATED_H?
>
> Yes. If find source files using "git-ls-files", the generated headers
> are not included in FOUND_SOURCE_FILES, but this is not the case for
> the find command.
>
>> If not, I think deduplicating near the source of the issue, i.e.
>>
>>   FOUND_SOURCE_FILES := $(sort $(shell $(SOURCES_CMD)))
>
> If we pass the "--deduplicate" option to git-ls-files, we can make
> sure files are unique in FOUND_SOURCE_FILES. So sorting
> FOUND_SOURCE_FILES becomes unnecessary. But FOUND_SOURCE_FILES may
> contain generated files if using find instead of git-ls-files in
> SOURCES_CMD, that means sort FOUND_SOURCE_FILES is not enough. Instead
> of sorting it, we may want to filter-out the generated files from it,
> like:
>
>     FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))
>
> Exclude the several generated headers by add extra fixed options to
> find command is not good, but we may need to exclude the ".build"
> directory from the find command in SOURCES_CMD, in case we may
> duplicate C files in it in future version.
>
>
>     --- a/Makefile
>     +++ b/Makefile
>     @@ -846,7 +846,7 @@ generated-hdrs: $(GENERATED_H)
>     ## Exhaustive lists of our source files, either dynamically generated,
>     ## or hardcoded.
>     SOURCES_CMD = ( \
>     -       git ls-files \
>     +       git ls-files --deduplicate \
>                    '*.[hcS]' \
>                    '*.sh' \
>                    ':!*[tp][0-9][0-9][0-9][0-9]*' \
>     @@ -857,12 +857,13 @@ SOURCES_CMD = ( \
>                    -o \( -name '[tp][0-9][0-9][0-9][0-9]*' -prune \) \
>                    -o \( -name contrib -type d -prune \) \
>                    -o \( -name build -type d -prune \) \
>     +               -o \( -name .build -type d -prune \) \

This change is good and something we should do in any case, I think (and this is my fault) that due to this we'd have broken other things, e.g. included these in the TAGS file if we don't have "git ls-files".

Show 17 quoted lines
>                    -o \( -name 'trash*' -type d -prune \) \
>                    -o \( -name '*.[hcS]' -type f -print \) \
>                    -o \( -name '*.sh' -type f -print \) \
>                    | sed -e 's|^\./||' \
>            )
>     -FOUND_SOURCE_FILES := $(shell $(SOURCES_CMD))
>     +FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD)))
>
>     FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES))
>     FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES))
>
>> may be sufficient.  Deduplicating near the consumer, like
>> LOCALIZED_C, may force us to dedup all the consumers of it (e.g.
>> LOCALIZED_C is not the sole consumer of FOUND_C_SOURCES; you'd need
>> to sort the input to COCCI_SOURCES, for example).
>
> If we apply the above patch, sorting LOCALIZED_C is not necessary.

Per earlier feedback in https://lore.kernel.org/git/220519.86tu9l6fw4.gmgdl@evledraar.gmail.com/ this all seesm a bit too complex, especially now.

I pointed out then that with --sort-by-file added we:
 * Don't group the translations by C/SH/Perl anymore
 * Change the sort order within files, to be line/sorted instead of
   line/order (i.e. first occurring translations first)
I suggested then to just use $(sort) on the respective lists.
So why not just:
 1. Switch to the $(FOUND_C_SOURCES) (good)
 2. Filter that by C/Perl/SH as before (just a simple $(filter)
 3. $(sort) that (which as noted, also de-dupes it)

Then we don't have any of the behavior change of --sort-by-file, and we don't have to carefully curate the ls-files/find commands to not include duplicates (although as seen here that seems to have been a useful canary in the "find" case).

Jiang Xin· May 26, 2022, 11:06 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26, 2022 at 6:04 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 9 quoted lines
> > If we apply the above patch, sorting LOCALIZED_C is not necessary.
>
> Per earlier feedback in
> https://lore.kernel.org/git/220519.86tu9l6fw4.gmgdl@evledraar.gmail.com/
> this all seesm a bit too complex, especially now.
>
> I pointed out then that with --sort-by-file added we:
>
>  * Don't group the translations by C/SH/Perl anymore

I missed this point in the previous discussion. Will take this into account in next reroll.

Show 10 quoted lines
>  * Change the sort order within files, to be line/sorted instead of
>    line/order (i.e. first occurring translations first)
>
> I suggested then to just use $(sort) on the respective lists.
>
> So why not just:
>
>  1. Switch to the $(FOUND_C_SOURCES) (good)
>  2. Filter that by C/Perl/SH as before (just a simple $(filter)
>  3. $(sort) that (which as noted, also de-dupes it)
Will try this direction.
> Then we don't have any of the behavior change of --sort-by-file, and we
> don't have to carefully curate the ls-files/find commands to not include
> duplicates (although as seen here that seems to have been a useful
> canary in the "find" case).
Junio C Hamano· May 26, 2022, 17:18 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
Show 18 quoted lines
> I pointed out then that with --sort-by-file added we:
>
>  * Don't group the translations by C/SH/Perl anymore
>  * Change the sort order within files, to be line/sorted instead of
>    line/order (i.e. first occurring translations first)
>
> I suggested then to just use $(sort) on the respective lists.
>
> So why not just:
>
>  1. Switch to the $(FOUND_C_SOURCES) (good)
>  2. Filter that by C/Perl/SH as before (just a simple $(filter)
>  3. $(sort) that (which as noted, also de-dupes it)
>
> Then we don't have any of the behavior change of --sort-by-file, and we
> don't have to carefully curate the ls-files/find commands to not include
> duplicates (although as seen here that seems to have been a useful
> canary in the "find" case).
Does "--sort-by-file" really mean that?

The option is documented to sort output by file location, but does it mean without the option (i.e. default), there is no guarantee in the output order? Or are we sure that the output is sorted by the order of input files, and that is guaranteed to hold in the future?

If we are depending on certain ordering of the output produced by gettext suite of programs, I would keep the option, regardless of what we do to the input to them, if I were running the i18n part of this project.

But I am not, so I would not complain if --sort-by-file is dropped against my advice ;-)

Ævar Arnfjörð Bjarmason· May 26, 2022, 18:25 UTC · re: Junio C Hamano · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26 2022, Junio C Hamano wrote:
Show 35 quoted lines
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
>
>> I pointed out then that with --sort-by-file added we:
>>
>>  * Don't group the translations by C/SH/Perl anymore
>>  * Change the sort order within files, to be line/sorted instead of
>>    line/order (i.e. first occurring translations first)
>>
>> I suggested then to just use $(sort) on the respective lists.
>>
>> So why not just:
>>
>>  1. Switch to the $(FOUND_C_SOURCES) (good)
>>  2. Filter that by C/Perl/SH as before (just a simple $(filter)
>>  3. $(sort) that (which as noted, also de-dupes it)
>>
>> Then we don't have any of the behavior change of --sort-by-file, and we
>> don't have to carefully curate the ls-files/find commands to not include
>> duplicates (although as seen here that seems to have been a useful
>> canary in the "find" case).
>
> Does "--sort-by-file" really mean that?
>
> The option is documented to sort output by file location, but does
> it mean without the option (i.e. default), there is no guarantee in
> the output order?  Or are we sure that the output is sorted by the
> order of input files, and that is guaranteed to hold in the future?
>
> If we are depending on certain ordering of the output produced by
> gettext suite of programs, I would keep the option, regardless of
> what we do to the input to them, if I were running the i18n part of
> this project.
>
> But I am not, so I would not complain if --sort-by-file is dropped
> against my advice ;-)

The gettext docs are pretty light on the subject, but the default "sort order" is none at all. I.e. it'll just inhale source and spew out translations in the order you feed them to xgettext.

So in order of input files, and then in order they're seen in the program.

I don't think that's ever going to change.
The --sort-output and and --sort-by-file then re-sort that.

AFAICT the --sort-by-file could be more accurately named --sort-by-file-then-line-number-then-by-msgid.

I.e. the semantics seem to be to sort by file, then emit messages in the order they appear in the file *by line*, but within a line act as though --sort-output was given. I don't know if that's intentional or not.

Junio C Hamano· May 26, 2022, 19:00 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
Show 23 quoted lines
>> Does "--sort-by-file" really mean that?
>>
>> The option is documented to sort output by file location, but does
>> it mean without the option (i.e. default), there is no guarantee in
>> the output order?  Or are we sure that the output is sorted by the
>> order of input files, and that is guaranteed to hold in the future?
>>
>> If we are depending on certain ordering of the output produced by
>> gettext suite of programs, I would keep the option, regardless of
>> what we do to the input to them, if I were running the i18n part of
>> this project.
>>
>> But I am not, so I would not complain if --sort-by-file is dropped
>> against my advice ;-)
>
> The gettext docs are pretty light on the subject, but the default "sort
> order" is none at all. I.e. it'll just inhale source and spew out
> translations in the order you feed them to xgettext.
>
> So in order of input files, and then in order they're seen in the
> program.
>
> I don't think that's ever going to change.

OK, so as long as make's notion of $(sort) and gettext suite's notion of --sort-by-file are the same, we didn't make any change, and even if they were different, since there is no version of Git that uses "--sort-by-file" while preparing the po and pot files, it still is OK. As long as make's $(sort) is as stable as gettext suite's "--sort-by-file" across developer locales (and our filenames are ascii-only and hopefully will stay that way), everybody will get the messages in the same order either way (or we would have the same problem so switching from --sort-by-file to $(sort) is not making anything worse).

Ævar Arnfjörð Bjarmason· May 26, 2022, 19:17 UTC · re: Junio C Hamano · lore

Re: [PATCH] Makefile: dedup git-ls-files output to prevent duplicate targets

On Thu, May 26 2022, Junio C Hamano wrote:
Show 28 quoted lines
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
>
>>> Does "--sort-by-file" really mean that?
>>>
>>> The option is documented to sort output by file location, but does
>>> it mean without the option (i.e. default), there is no guarantee in
>>> the output order?  Or are we sure that the output is sorted by the
>>> order of input files, and that is guaranteed to hold in the future?
>>>
>>> If we are depending on certain ordering of the output produced by
>>> gettext suite of programs, I would keep the option, regardless of
>>> what we do to the input to them, if I were running the i18n part of
>>> this project.
>>>
>>> But I am not, so I would not complain if --sort-by-file is dropped
>>> against my advice ;-)
>>
>> The gettext docs are pretty light on the subject, but the default "sort
>> order" is none at all. I.e. it'll just inhale source and spew out
>> translations in the order you feed them to xgettext.
>>
>> So in order of input files, and then in order they're seen in the
>> program.
>>
>> I don't think that's ever going to change.
>
> OK, so as long as make's notion of $(sort) and gettext suite's
> notion of --sort-by-file are the same.

They're not, I mean $(sort) and xgettext's *default* behavior are the same, but the --sort-by-file is not only a sort by file, it also affects intra-line-number sorting, although that's an admittedly obscure case (we have <10 messages where it matters, I think).

> , we didn't make any change, and even if they were different, since
> there is no version of Git that uses "--sort-by-file" while preparing
> the po and pot files, it still is OK.

Well, it would be OK in any case, this is just how we prepare the git.pot file, but it does affect diff churn eventually in the *.po files.

Show 6 quoted lines
> As long as make's $(sort) is as stable as gettext
> suite's "--sort-by-file" across developer locales (and our filenames
> are ascii-only and hopefully will stay that way), everybody will get
> the messages in the same order either way (or we would have the same
> problem so switching from --sort-by-file to $(sort) is not making
> anything worse).

FWIW we can't in the general case rely on the Makefile's $(sort) working the same way across our platforms, but I don't think it matters in this case. IIRC there's versions of one Windows setup or another (this was via CI) where "-" at least (the purely ASCII one) sorts differently.

I ran into that in some Makefile experiments where I wanted to use $(sort) to assert that our various hardcoded lists were in sorted order already.

Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 6/9] po/git.pot: don't check in result of "make pot"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Remove the "po/git.pot" file from being tracked, which started with dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13).

The reason the po/git.pot started being checked in was because the po/*.po files were changed a schema where we'd generate them from a known-good snapshot of po/git.pot, instead of each translator running "make pot" themselves.

This makes sense, but we don't need to carry this file in-tree just to achieve that aim, and doing so has resulted in a significant amount of "diff churn" since this method of doing it was introduced:

    $ git log -p --oneline -- po/git.pot|wc -l
    553743

We can instead let l10n contributors to generate "po/git.pot" in runtime to update their own "po/XX.po", and the l10n coordinator can check pull requests using CI pipeline.

This reverts to the schema introduced initially in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22).

The actual "git rm" of po/git.pot was in preceding commit to make this change easier to review, and to preempt the mailing list from blocking it due to it being too large.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 Makefile      | 5 +++--
 po/.gitignore | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)
Show changes to 2 files +4 −2

Makefile, po/.gitignore

diff --git a/Makefile b/Makefile
index 70d5f41c3f..161ebf4ff3 100644
--- a/Makefile
+++ b/Makefile
@@ -2788,8 +2788,8 @@ endef
 	$(call mkdir_p_parent_template)
 	$(QUIET_GEN)$(gen_pot_header)
 
-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
-	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3332,6 +3332,7 @@ cocciclean:
 
 clean: profile-clean coverage-clean cocciclean
 	$(RM) -r .build
+	$(RM) po/git.pot
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
diff --git a/po/.gitignore b/po/.gitignore
index 796b96d1c4..37d1301b32 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1 +1,2 @@
 /build
+/git.pot
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 5/9] po/git.pot: this is now a generated file

We no longer keep track of the contents of this file.
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot
Show changes to po/git.pot +0 −9449
diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"a - stash this hunk and all later hunks in the file\n"
-"d - do not stash this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-msgid ""
-"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
-"as appropriate to mark resolution and make a commit."
-msgstr ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-msgid ""
-"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
-msgstr ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 9/9] l10n: Document the new l10n workflow

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Change the "flow" of how translators interact with the l10n repository at [1] to adjust it for a new workflow of not having a po/git.pot file in-tree at all, and to not commit line numbers to the po/*.po files that we do track in tree.

The current workflow was added in a combination of dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) and 271ce198cd0 (Update l10n guide, 2012-02-29).

As noted in preceding commits I think that it came about due to technical debt I'd left behind in how the "po/git.pot" file was created, and a mis-impression that the file:line comments were needed as anything more than a transitory translation aid.

As the updated po/README.md shows the new workflow is substantially the same, the difference is that translators no longer need to initially pull from the l10n coordinator for a new po/git.pot, they can simply use git.git's canonical source repository.

The l10n coordinator is still expected to announce a release to translate, which presumably would always be Junio's latest release tag. I'm not certain if this part of the process is actually important. I.e. the delta translation-wise between that tag and "master" is usually pretty small, so perhaps translators can just work on "master" instead.

1. https://github.com/git-l10n/git-po/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/README.md | 230 ++++++++++++++++++++++++++-------------------------
 1 file changed, 117 insertions(+), 113 deletions(-)
Show changes to po/README.md +117 −113
diff --git a/po/README.md b/po/README.md
index 19fabb4acf..74856ca5bf 100644
--- a/po/README.md
+++ b/po/README.md
@@ -9,8 +9,14 @@ coordinates our localization effort in the l10 coordinator repository:
 
     https://github.com/git-l10n/git-po/
 
-The two character language translation codes are defined by ISO\_639-1, as
-stated in the gettext(1) full manual, appendix A.1, Usual Language Codes.
+We will use XX as an alias to refer to the language translation code in
+the following paragraphs, for example we use "po/XX.po" to refer to the
+translation file for a specific language. But this doesn't mean that
+the language code has only two letters. The language code can be in one
+of two forms: "ll" or "ll\_CC". Here "ll" is the ISO 639 two-letter
+language code and "CC" is the ISO 3166 two-letter code for country names
+and subdivisions. For example: "de" for German language code, "zh\_CN"
+for Simplified Chinese language code.
 
 
 ## Contributing to an existing translation
@@ -39,72 +45,74 @@ language, so that the l10n coordinator only needs to interact with one
 person per language.
 
 
-## Core translation
+## Translation Process Flow
 
-The core translation is the smallest set of work that must be completed
-for a new language translation. Because there are more than 5000 messages
-in the template message file "po/git.pot" that need to be translated,
-this is not a piece of cake for the contributor for a new language.
+The overall data-flow looks like this:
 
-The core template message file which contains a small set of messages
-will be generated in "po-core/core.pot" automatically by running a helper
-program named "git-po-helper" (described later).
+    +-------------------+             +------------------+
+    | Git source code   | ----(2)---> | L10n coordinator |
+    | repository        | <---(5)---- | repository       |
+    +-------------------+             +------------------+
+                    |                     |    ^
+                   (1)                   (3)  (4)
+                    V                     v    |
+               +----------------------------------+
+               |        Language Team XX          |
+               +----------------------------------+
 
-```shell
-git-po-helper init --core XX.po
-```
+- Translatable strings are marked in the source file.
+- Language teams can start translation iterations at any time, even
+  before the l10n window opens:
 
-After translating the generated "po-core/XX.po", you can merge it to
-"po/XX.po" using the following commands:
+  + Pull from the master branch of the source (1)
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
 
-```shell
-msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
-mv /tmp/XX.po po/XX.po
-git-po-helper update XX.po
-```
+- The L10n coordinator pulls from source and announces the l10n window
+  open (2)
+- Language team pulls from the l10n coordinator, starts another
+  translation iteration against the l10n coordinator's tree (3)
 
-Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
-translated messages and duplicate messages.
+  + Run "git pull --rebase" from the l10n coordinator
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
+  + Squash trivial l10n git commits using "git rebase -i"
 
+- Language team sends pull request to the l10n coordinator (4)
+- L10n coordinator checks and merges
+- L10n coordinator asks the result to be pulled (5).
 
-## Translation Process Flow
 
-The overall data-flow looks like this:
+## Dynamically generated POT files
 
-    +-------------------+            +------------------+
-    | Git source code   | ---(1)---> | L10n coordinator |
-    | repository        | <---(4)--- | repository       |
-    +-------------------+            +------------------+
-                                          |      ^
-                                         (2)    (3)
-                                          V      |
-                                     +------------------+
-                                     | Language Team XX |
-                                     +------------------+
+POT files are templates for l10n contributors to create or update their
+translation files. We used to have the "po/git.pot" file which was
+generated by the l10n coordinator, but this file had been removed from
+the tree.
 
-- Translatable strings are marked in the source file.
-- L10n coordinator pulls from the source (1)
-- L10n coordinator updates the message template "po/git.pot"
-- Language team pulls from L10n coordinator (2)
-- Language team updates the message file "po/XX.po"
-- L10n coordinator pulls from Language team (3)
-- L10n coordinator asks the result to be pulled (4).
+The two POT files "po/git.pot" and "po/git-core.pot" can be created
+dynamically when necessary.
 
+L10n contributors use "po/git.pot" to prepare translations for their
+languages, but they are not expected to modify it. The "po/git.pot" file
+can be generated manually with the following command:
 
-## Maintaining the "po/git.pot" file
+```shell
+make po/git.pot
+```
 
-(This is done by the l10n coordinator).
+The "po/git-core.pot" file is the template for core translations. A core
+translation is the minimum set of work necessary to complete a
+translation of a new language. Since there are more than 5000 messages
+in the full set of template message file "po/git.pot" that need to be
+translated, this is not a piece of cake for new language contributors.
 
-The "po/git.pot" file contains a message catalog extracted from Git's
-sources. The l10n coordinator maintains it by adding new translations with
-msginit(1), or update existing ones with msgmerge(1).  In order to update
-the Git sources to extract the messages from, the l10n coordinator is
-expected to pull from the main git repository at strategic point in
-history (e.g. when a major release and release candidates are tagged),
-and then run "make pot" at the top-level directory.
+The "core" template file "po/git-core.pot" can be generated manually
+by running:
 
-Language contributors use this file to prepare translations for their
-language, but they are not expected to modify it.
+```shell
+make po/git-core.pot
+```
 
 
 ## Initializing a "XX.po" file
@@ -115,32 +123,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
 you add a translation for the first time by running:
 
 ```shell
-msginit --locale=XX
+make po-init PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
-"zh\_CN", etc.
-
-Then edit the automatically generated copyright info in your new "XX.po"
-to be correct, e.g. for Icelandic:
-
-```diff
-@@ -1,6 +1,6 @@
--# Icelandic translations for PACKAGE package.
--# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
--# This file is distributed under the same license as the PACKAGE package.
-+# Icelandic translations for Git.
-+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-+# This file is distributed under the same license as the Git package.
- # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
-```
-
-And change references to PACKAGE VERSION in the PO Header Entry to
-just "Git":
+where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
 
-```shell
-perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
-```
+The newly generated message file "po/XX.po" is based on the core pot
+file "po/git-core.pot", so it contains only a minimal set of messages
+and it's a good start for a new language contribution.
 
 Once you are done testing the translation (see below), commit the result
 and ask the l10n coordinator to pull from you.
@@ -153,19 +143,53 @@ and ask the l10n coordinator to pull from you.
 If you are replacing translation strings in an existing "XX.po" file to
 improve the translation, just edit the file.
 
-If there's an existing "XX.po" file for your language, but the repository
-of the l10n coordinator has newer "po/git.pot" file, you would need to first
-pull from the l10n coordinator (see the beginning of this document for its
-URL), and then update the existing translation by running:
+If you want to find new translatable strings in source files of upstream
+repository and propagate them to your "po/XX.po", run command:
 
 ```shell
-msgmerge --add-location --backup=off -U XX.po git.pot
+make po-update PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where "XX.po" is the file you want to update.
+It will:
 
-Once you are done testing the translation (see below), commit the result
-and ask the l10n coordinator to pull from you.
+- Call "make po/git.pot" to generate new "po/git.pot" file
+- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
+  to update your "po/XX.po"
+- The "--add-location" option for msgmerge will add location lines,
+  and these location lines will help translation tools to locate
+  translation context easily.
+
+Once you are done testing the translation (see below), it's better
+to commit a location-less "po/XX.po" file to save repository space
+and make a user-friendly patch for review.
+
+To save a location-less "po/XX.po" automatically in repository, you
+can:
+
+First define a new attribute for "po/XX.po" by appending the following
+line in ".git/info/attributes":
+
+```
+/po/XX.po filter=gettext-no-location
+```
+
+Then define the driver for the "gettext-no-location" clean filter to
+strip out both filenames and locations from the contents as follows:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --no-location -"
+```
+
+For users who have gettext version 0.20 or higher, it is also possible
+to define a clean filter to preserve filenames but not locations:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --add-location=file -"
+```
+
+You're now ready to ask the l10n coordinator to pull from you.
 
 
 ## Fuzzy translation
@@ -196,6 +220,14 @@ common errors, e.g. missing printf format strings, or translated
 messages that deviate from the originals in whether they begin/end
 with a newline or not.
 
+L10n coordinator will check your contributions using a helper program
+(see "PO helper" section below):
+
+```shell
+git-po-helper check-po po/XX.po
+git-po-helper check-commits <rev-list-opts>
+```
+
 
 ## Marking strings for translation
 
@@ -370,29 +402,6 @@ l10n workflow.
 To build and install the helper program from source, see
 [git-po-helper/README][].
 
-Usage for git-po-helper:
-
-- To start a new language translation:
-
-  ```shell
-  git-po-helper init XX.po
-  ```
-
-- To update your "XX.po" file:
-
-  ```shell
-  git-po-helper update XX.po
-  ```
-
-- To check commit log and syntax of "XX.po":
-
-  ```shell
-  git-po-helper check-po XX.po
-  git-po-helper check-commits
-  ```
-
-Run "git-po-helper" without arguments to show usage.
-
 
 ## Conventions
 
@@ -436,13 +445,8 @@ additional conventions:
 - Initialize proper filename of the "XX.po" file conforming to
   iso-639 and iso-3166.
 
-- Must complete a minimal translation based on the "po-core/core.pot"
-  template. Using the following command to initialize the minimal
-  "po-core/XX.po" file:
-
-  ```shell
-  git-po-helper init --core <your-language>
-  ```
+- Must complete a minimal translation based on the "Core
+  translation". See that section above.
 
 - Add a new entry in the "po/TEAMS" file with proper format, and check
   the syntax of "po/TEAMS" by running the following command:
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 15:21 UTC · re: Jiang Xin · lore

[PATCH v4 8/9] Makefile: add "po-init" rule to initialize po/XX.po

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

The core translation is the minimum set of work that must be done for a new language translation.

There are over 5000 messages in the template message file "po/git.pot" that need to be translated. It is not a piece of cake for such a huge workload. So we used to define a small set of messages called "core translation" that a new l10n contributor must complete before sending pull request to the l10n coordinator.

By pulling in some parts of the git-po-helper[^1] logic, we add rule "core-pot" to create this core translation message "po/git-core.pot":

    make core-pot

To help new l10n contributors to initialized their "po/XX.pot" from "po/git-core.pot", we also add new rules "po-init":

    make po-init PO_FILE=po/XX.po
[^1]: https://github.com/git-l10n/git-po-helper/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 Makefile      | 43 ++++++++++++++++++++++++++++++++++++++++++-
 po/.gitignore |  1 +
 shared.mak    |  1 +
 3 files changed, 44 insertions(+), 1 deletion(-)
Show changes to 3 files +44 −1

Makefile, po/.gitignore, shared.mak

diff --git a/Makefile b/Makefile
index 34a64c5fa7..a3f8446de9 100644
--- a/Makefile
+++ b/Makefile
@@ -2808,6 +2808,7 @@ po-update: po/git.pot
 	$(check_po_file_envvar)
 	@if test ! -e $(PO_FILE); then \
 		echo >&2 "error: $(PO_FILE) does not exist"; \
+		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
 		exit 1; \
 	fi
 	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
@@ -2815,6 +2816,46 @@ po-update: po/git.pot
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
+### TODO FIXME: Translating everything in these files is a bad
+### heuristic for "core", as we'll translate obscure error() messages
+### along with commonly seen i18n messages. A better heuristic would
+### be to e.g. use spatch to first remove error/die/warning
+### etc. messages.
+LOCALIZED_C_CORE =
+LOCALIZED_C_CORE += builtin/checkout.c
+LOCALIZED_C_CORE += builtin/clone.c
+LOCALIZED_C_CORE += builtin/index-pack.c
+LOCALIZED_C_CORE += builtin/push.c
+LOCALIZED_C_CORE += builtin/reset.c
+LOCALIZED_C_CORE += remote.c
+LOCALIZED_C_CORE += wt-status.c
+
+LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
+
+.PHONY: core-pot
+core-pot: po/git-core.pot
+
+.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
+
+po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
+
+.PHONY: po-init
+po-init: po/git-core.pot
+	$(check_po_file_envvar)
+	@if test -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) exists already"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGINIT)msginit \
+		--input=$< \
+		--output=$(PO_FILE) \
+		--no-translator \
+		--locale=$(PO_FILE:po/%.po=%)
+
+## po/*.po files & their rules
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
@@ -3350,7 +3391,7 @@ cocciclean:
 
 clean: profile-clean coverage-clean cocciclean
 	$(RM) -r .build
-	$(RM) po/git.pot
+	$(RM) po/git.pot po/git-core.pot
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
diff --git a/po/.gitignore b/po/.gitignore
index 37d1301b32..ff0e5176a6 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,2 +1,3 @@
 /build
 /git.pot
+/git-core.pot
diff --git a/shared.mak b/shared.mak
index 8cd170a7e7..4330192e9c 100644
--- a/shared.mak
+++ b/shared.mak
@@ -62,6 +62,7 @@ ifndef V
 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 1/9] Makefile: sort "po/git.pot" by file location

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

We will feed xgettext with more C souce files and in different order in subsequent commit. To generate a stable "po/git.pot" regardless of the number and order of input source files, we add a new option "--sort-by-file" to xgettext program.

With this update, the newly generated "po/git.pot" will has the same entries while in a different order.

With the help of a custom diff driver as shown below,
    git config --global diff.gettext-fmt.textconv \
        "msgcat --no-location --sort-by-file"

and appending a new entry "*.po diff=gettext-fmt" to git attributes, we can see that there are no substantial changes in "po/git.pot".

We won't checkin the newly generated "po/git.pot", because we will remove it from tree in a later commit.

Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile | 1 +
 1 file changed, 1 insertion(+)
Show changes to Makefile +1 −0
diff --git a/Makefile b/Makefile
index f8bccfab5e..83e968e2a4 100644
--- a/Makefile
+++ b/Makefile
@@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 23, 2022, 08:05 UTC · re: Jiang Xin · lore

Re: [PATCH v3 1/9] Makefile: sort "po/git.pot" by file location

Jiang Xin <worldhello.net@gmail.com> writes:
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> We will feed xgettext with more C souce files and in different order in
"source"
> subsequent commit. To generate a stable "po/git.pot" regardless of the
> number and order of input source files, we add a new option
> "--sort-by-file" to xgettext program.
Probably: ... we pass the option "--sort-by-file"
> With this update, the newly generated "po/git.pot" will has the same
"will have"
Show 15 quoted lines
> entries while in a different order.
>
> With the help of a custom diff driver as shown below,
>
>     git config --global diff.gettext-fmt.textconv \
>         "msgcat --no-location --sort-by-file"
>
> and appending a new entry "*.po diff=gettext-fmt" to git attributes,
> we can see that there are no substantial changes in "po/git.pot".
>
> We won't checkin the newly generated "po/git.pot", because we will
> remove it from tree in a later commit.
>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>

This has no input from me (yet), so technically it is a bit premature to add my sign-off here. It wouldn't make a difference to the end result, though ;-)

Show 16 quoted lines
> ---
>  Makefile | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/Makefile b/Makefile
> index f8bccfab5e..83e968e2a4 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2706,6 +2706,7 @@ XGETTEXT_FLAGS = \
>  	--force-po \
>  	--add-comments=TRANSLATORS: \
>  	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> +	--sort-by-file \
>  	--from-code=UTF-8
>  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
>  	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
Jiang Xin· May 23, 2022, 08:50 UTC · re: Junio C Hamano · lore

Re: [PATCH v3 1/9] Makefile: sort "po/git.pot" by file location

On Mon, May 23, 2022 at 4:05 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 38 quoted lines
>
> Jiang Xin <worldhello.net@gmail.com> writes:
>
> > From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> >
> > We will feed xgettext with more C souce files and in different order in
>
> "source"
>
> > subsequent commit. To generate a stable "po/git.pot" regardless of the
> > number and order of input source files, we add a new option
> > "--sort-by-file" to xgettext program.
>
> Probably: ... we pass the option "--sort-by-file"
>
> > With this update, the newly generated "po/git.pot" will has the same
>
> "will have"
>
> > entries while in a different order.
> >
> > With the help of a custom diff driver as shown below,
> >
> >     git config --global diff.gettext-fmt.textconv \
> >         "msgcat --no-location --sort-by-file"
> >
> > and appending a new entry "*.po diff=gettext-fmt" to git attributes,
> > we can see that there are no substantial changes in "po/git.pot".
> >
> > We won't checkin the newly generated "po/git.pot", because we will
> > remove it from tree in a later commit.
> >
> > Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> > Signed-off-by: Junio C Hamano <gitster@pobox.com>
>
> This has no input from me (yet), so technically it is a bit
> premature to add my sign-off here.  It wouldn't make a difference to
> the end result, though ;-)
I started reroll v3 on your branch, forgot to remove your signature.
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

When running "make pot" on different platform, we may get a different message template file "po/git.pot". This is because the "LOCALIZED_C" variable may have different C source files on different platforms or different compiler conditions.

We can make a stable "LOCALIZED_C" variable by applying patch snippets as follows:

     ifdef NO_LIBGEN_H
         COMPAT_CFLAGS += -DNO_LIBGEN_H
         COMPAT_OBJS += compat/basename.o
    +else
    +    LOCALIZED_C += compat/basename.c
     endif

But it is much simpler to use variables "$(FOUND_C_SOURCES)" and "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C". We also add "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.

With this update, the newly generated "po/git.pot" will have 30 new entries coming from the following C source files:

 * compat/fsmonitor/fsm-listen-win32.c
 * compat/mingw.c
 * compat/regex/regcomp.c
 * compat/simple-ipc/ipc-win32.c
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Show changes to Makefile +2 −1
diff --git a/Makefile b/Makefile
index 83e968e2a4..46914dcd80 100644
--- a/Makefile
+++ b/Makefile
@@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
+LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
+	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 23, 2022, 08:05 UTC · re: Jiang Xin · lore

Re: [PATCH v3 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

Jiang Xin <worldhello.net@gmail.com> writes:
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> When running "make pot" on different platform, we may get a different
"on a"
Show 13 quoted lines
> message template file "po/git.pot". This is because the "LOCALIZED_C"
> variable may have different C source files on different platforms or
> different compiler conditions.
>
> We can make a stable "LOCALIZED_C" variable by applying patch snippets
> as follows:
>
>      ifdef NO_LIBGEN_H
>          COMPAT_CFLAGS += -DNO_LIBGEN_H
>          COMPAT_OBJS += compat/basename.o
>     +else
>     +    LOCALIZED_C += compat/basename.c
>      endif

While that is true, going into such a detail of an approach that you rejected does not sound like a good use of readers' time. Instead, perhaps mention why ...

> But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
> "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".

... FOUND_C_SOURCES approach works better by reminding the readers what it is. I'd probably discard everything after "This is because..." up to point and replace it with something like:

    "$(LOCALIZED_C)" is supposed to list all the sources that we
    extract the strings to be translated from.  Instead of using
    "$(C_OBJ)", which only lists the source files used in the
    current build, to compute it, use "$(FOUND_C_SOURCES)", which
    lists all source files we keep track of (or ship in a tarball
    extract).
if I were writing this.
> We also add
> "$(SCALAR_SOURCES)" files, which are part of C_OBJ but not included in
> "$(FOUND_C_SOURCES)" because they are in the "contrib/" directory.
Good.
Show 7 quoted lines
> With this update, the newly generated "po/git.pot" will have 30 new
> entries coming from the following C source files:
>
>  * compat/fsmonitor/fsm-listen-win32.c
>  * compat/mingw.c
>  * compat/regex/regcomp.c
>  * compat/simple-ipc/ipc-win32.c
Good.
Show 20 quoted lines
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  Makefile | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 83e968e2a4..46914dcd80 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>  	--keyword=gettextln --keyword=eval_gettextln
>  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>  	--keyword=__ --keyword=N__ --keyword="__n:1,2"
> -LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
> +LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
> +	      $(GENERATED_H)
>  LOCALIZED_SH = $(SCRIPT_SH)
>  LOCALIZED_SH += git-sh-setup.sh
>  LOCALIZED_PERL = $(SCRIPT_PERL)
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 9/9] l10n: Document the new l10n workflow

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Change the "flow" of how translators interact with the l10n repository at [1] to adjust it for a new workflow of not having a po/git.pot file in-tree at all, and to not commit line numbers to the po/*.po files that we do track in tree.

The current workflow was added in a combination of dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) and 271ce198cd0 (Update l10n guide, 2012-02-29).

As noted in preceding commits I think that it came about due to technical debt I'd left behind in how the "po/git.pot" file was created, and a mis-impression that the file:line comments were needed as anything more than a transitory translation aid.

As the updated po/README.md shows the new workflow is substantially the same, the difference is that translators no longer need to initially pull from the l10n coordinator for a new po/git.pot, they can simply use git.git's canonical source repository.

The l10n coordinator is still expected to announce a release to translate, which presumably would always be Junio's latest release tag. I'm not certain if this part of the process is actually important. I.e. the delta translation-wise between that tag and "master" is usually pretty small, so perhaps translators can just work on "master" instead.

1. https://github.com/git-l10n/git-po/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 po/README.md | 230 ++++++++++++++++++++++++++-------------------------
 1 file changed, 117 insertions(+), 113 deletions(-)
Show changes to po/README.md +117 −113
diff --git a/po/README.md b/po/README.md
index 19fabb4acf..74856ca5bf 100644
--- a/po/README.md
+++ b/po/README.md
@@ -9,8 +9,14 @@ coordinates our localization effort in the l10 coordinator repository:
 
     https://github.com/git-l10n/git-po/
 
-The two character language translation codes are defined by ISO\_639-1, as
-stated in the gettext(1) full manual, appendix A.1, Usual Language Codes.
+We will use XX as an alias to refer to the language translation code in
+the following paragraphs, for example we use "po/XX.po" to refer to the
+translation file for a specific language. But this doesn't mean that
+the language code has only two letters. The language code can be in one
+of two forms: "ll" or "ll\_CC". Here "ll" is the ISO 639 two-letter
+language code and "CC" is the ISO 3166 two-letter code for country names
+and subdivisions. For example: "de" for German language code, "zh\_CN"
+for Simplified Chinese language code.
 
 
 ## Contributing to an existing translation
@@ -39,72 +45,74 @@ language, so that the l10n coordinator only needs to interact with one
 person per language.
 
 
-## Core translation
+## Translation Process Flow
 
-The core translation is the smallest set of work that must be completed
-for a new language translation. Because there are more than 5000 messages
-in the template message file "po/git.pot" that need to be translated,
-this is not a piece of cake for the contributor for a new language.
+The overall data-flow looks like this:
 
-The core template message file which contains a small set of messages
-will be generated in "po-core/core.pot" automatically by running a helper
-program named "git-po-helper" (described later).
+    +-------------------+             +------------------+
+    | Git source code   | ----(2)---> | L10n coordinator |
+    | repository        | <---(5)---- | repository       |
+    +-------------------+             +------------------+
+                    |                     |    ^
+                   (1)                   (3)  (4)
+                    V                     v    |
+               +----------------------------------+
+               |        Language Team XX          |
+               +----------------------------------+
 
-```shell
-git-po-helper init --core XX.po
-```
+- Translatable strings are marked in the source file.
+- Language teams can start translation iterations at any time, even
+  before the l10n window opens:
 
-After translating the generated "po-core/XX.po", you can merge it to
-"po/XX.po" using the following commands:
+  + Pull from the master branch of the source (1)
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
 
-```shell
-msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
-mv /tmp/XX.po po/XX.po
-git-po-helper update XX.po
-```
+- The L10n coordinator pulls from source and announces the l10n window
+  open (2)
+- Language team pulls from the l10n coordinator, starts another
+  translation iteration against the l10n coordinator's tree (3)
 
-Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
-translated messages and duplicate messages.
+  + Run "git pull --rebase" from the l10n coordinator
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
+  + Squash trivial l10n git commits using "git rebase -i"
 
+- Language team sends pull request to the l10n coordinator (4)
+- L10n coordinator checks and merges
+- L10n coordinator asks the result to be pulled (5).
 
-## Translation Process Flow
 
-The overall data-flow looks like this:
+## Dynamically generated POT files
 
-    +-------------------+            +------------------+
-    | Git source code   | ---(1)---> | L10n coordinator |
-    | repository        | <---(4)--- | repository       |
-    +-------------------+            +------------------+
-                                          |      ^
-                                         (2)    (3)
-                                          V      |
-                                     +------------------+
-                                     | Language Team XX |
-                                     +------------------+
+POT files are templates for l10n contributors to create or update their
+translation files. We used to have the "po/git.pot" file which was
+generated by the l10n coordinator, but this file had been removed from
+the tree.
 
-- Translatable strings are marked in the source file.
-- L10n coordinator pulls from the source (1)
-- L10n coordinator updates the message template "po/git.pot"
-- Language team pulls from L10n coordinator (2)
-- Language team updates the message file "po/XX.po"
-- L10n coordinator pulls from Language team (3)
-- L10n coordinator asks the result to be pulled (4).
+The two POT files "po/git.pot" and "po/git-core.pot" can be created
+dynamically when necessary.
 
+L10n contributors use "po/git.pot" to prepare translations for their
+languages, but they are not expected to modify it. The "po/git.pot" file
+can be generated manually with the following command:
 
-## Maintaining the "po/git.pot" file
+```shell
+make po/git.pot
+```
 
-(This is done by the l10n coordinator).
+The "po/git-core.pot" file is the template for core translations. A core
+translation is the minimum set of work necessary to complete a
+translation of a new language. Since there are more than 5000 messages
+in the full set of template message file "po/git.pot" that need to be
+translated, this is not a piece of cake for new language contributors.
 
-The "po/git.pot" file contains a message catalog extracted from Git's
-sources. The l10n coordinator maintains it by adding new translations with
-msginit(1), or update existing ones with msgmerge(1).  In order to update
-the Git sources to extract the messages from, the l10n coordinator is
-expected to pull from the main git repository at strategic point in
-history (e.g. when a major release and release candidates are tagged),
-and then run "make pot" at the top-level directory.
+The "core" template file "po/git-core.pot" can be generated manually
+by running:
 
-Language contributors use this file to prepare translations for their
-language, but they are not expected to modify it.
+```shell
+make po/git-core.pot
+```
 
 
 ## Initializing a "XX.po" file
@@ -115,32 +123,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
 you add a translation for the first time by running:
 
 ```shell
-msginit --locale=XX
+make po-init PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
-"zh\_CN", etc.
-
-Then edit the automatically generated copyright info in your new "XX.po"
-to be correct, e.g. for Icelandic:
-
-```diff
-@@ -1,6 +1,6 @@
--# Icelandic translations for PACKAGE package.
--# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
--# This file is distributed under the same license as the PACKAGE package.
-+# Icelandic translations for Git.
-+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-+# This file is distributed under the same license as the Git package.
- # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
-```
-
-And change references to PACKAGE VERSION in the PO Header Entry to
-just "Git":
+where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
 
-```shell
-perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
-```
+The newly generated message file "po/XX.po" is based on the core pot
+file "po/git-core.pot", so it contains only a minimal set of messages
+and it's a good start for a new language contribution.
 
 Once you are done testing the translation (see below), commit the result
 and ask the l10n coordinator to pull from you.
@@ -153,19 +143,53 @@ and ask the l10n coordinator to pull from you.
 If you are replacing translation strings in an existing "XX.po" file to
 improve the translation, just edit the file.
 
-If there's an existing "XX.po" file for your language, but the repository
-of the l10n coordinator has newer "po/git.pot" file, you would need to first
-pull from the l10n coordinator (see the beginning of this document for its
-URL), and then update the existing translation by running:
+If you want to find new translatable strings in source files of upstream
+repository and propagate them to your "po/XX.po", run command:
 
 ```shell
-msgmerge --add-location --backup=off -U XX.po git.pot
+make po-update PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where "XX.po" is the file you want to update.
+It will:
 
-Once you are done testing the translation (see below), commit the result
-and ask the l10n coordinator to pull from you.
+- Call "make po/git.pot" to generate new "po/git.pot" file
+- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
+  to update your "po/XX.po"
+- The "--add-location" option for msgmerge will add location lines,
+  and these location lines will help translation tools to locate
+  translation context easily.
+
+Once you are done testing the translation (see below), it's better
+to commit a location-less "po/XX.po" file to save repository space
+and make a user-friendly patch for review.
+
+To save a location-less "po/XX.po" automatically in repository, you
+can:
+
+First define a new attribute for "po/XX.po" by appending the following
+line in ".git/info/attributes":
+
+```
+/po/XX.po filter=gettext-no-location
+```
+
+Then define the driver for the "gettext-no-location" clean filter to
+strip out both filenames and locations from the contents as follows:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --no-location -"
+```
+
+For users who have gettext version 0.20 or higher, it is also possible
+to define a clean filter to preserve filenames but not locations:
+
+```shell
+git config --global filter.gettext-no-location.clean \
+           "msgcat --add-location=file -"
+```
+
+You're now ready to ask the l10n coordinator to pull from you.
 
 
 ## Fuzzy translation
@@ -196,6 +220,14 @@ common errors, e.g. missing printf format strings, or translated
 messages that deviate from the originals in whether they begin/end
 with a newline or not.
 
+L10n coordinator will check your contributions using a helper program
+(see "PO helper" section below):
+
+```shell
+git-po-helper check-po po/XX.po
+git-po-helper check-commits <rev-list-opts>
+```
+
 
 ## Marking strings for translation
 
@@ -370,29 +402,6 @@ l10n workflow.
 To build and install the helper program from source, see
 [git-po-helper/README][].
 
-Usage for git-po-helper:
-
-- To start a new language translation:
-
-  ```shell
-  git-po-helper init XX.po
-  ```
-
-- To update your "XX.po" file:
-
-  ```shell
-  git-po-helper update XX.po
-  ```
-
-- To check commit log and syntax of "XX.po":
-
-  ```shell
-  git-po-helper check-po XX.po
-  git-po-helper check-commits
-  ```
-
-Run "git-po-helper" without arguments to show usage.
-
 
 ## Conventions
 
@@ -436,13 +445,8 @@ additional conventions:
 - Initialize proper filename of the "XX.po" file conforming to
   iso-639 and iso-3166.
 
-- Must complete a minimal translation based on the "po-core/core.pot"
-  template. Using the following command to initialize the minimal
-  "po-core/XX.po" file:
-
-  ```shell
-  git-po-helper init --core <your-language>
-  ```
+- Must complete a minimal translation based on the "Core
+  translation". See that section above.
 
 - Add a new entry in the "po/TEAMS" file with proper format, and check
   the syntax of "po/TEAMS" by running the following command:
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 7/9] Makefile: add "po-update" rule to update po/XX.po

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Since there is no longer a "po/git.pot" file in tree, a l10n team leader has to run several commands to update their "po/XX.po" file:

    $ make pot
    $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot

To make this process easier, add a new rule so that l10n team leaders can update their "po/XX.po" with one command. E.g.:

    $ make po-update PO_FILE=po/zh_CN.po
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile   | 18 ++++++++++++++++++
 shared.mak |  1 +
 2 files changed, 19 insertions(+)
Show changes to 2 files +19 −0

Makefile, shared.mak

diff --git a/Makefile b/Makefile
index 3122672263..09cbde4c2a 100644
--- a/Makefile
+++ b/Makefile
@@ -571,6 +571,7 @@ TCLTK_PATH = wish
 XGETTEXT = xgettext
 MSGCAT = msgcat
 MSGFMT = msgfmt
+MSGMERGE = msgmerge
 CURL_CONFIG = curl-config
 GCOV = gcov
 STRIP = strip
@@ -2716,6 +2717,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 MSGCAT_FLAGS = --sort-by-file
+MSGMERGE_FLAGS = --add-location --backup=off --update
 LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
 	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2794,6 +2796,22 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+define check_po_file_envvar
+	$(if $(PO_FILE), \
+		$(if $(filter po/%.po,$(PO_FILE)), , \
+			$(error PO_FILE should match pattern: "po/%.po")), \
+		$(error PO_FILE is not defined))
+endef
+
+.PHONY: po-update
+po-update: po/git.pot
+	$(check_po_file_envvar)
+	@if test ! -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) does not exist"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
+
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
diff --git a/shared.mak b/shared.mak
index 50d4596f0d..8cd170a7e7 100644
--- a/shared.mak
+++ b/shared.mak
@@ -63,6 +63,7 @@ ifndef V
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
+	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
 	QUIET_SP       = @echo '   ' SP $<;
 	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 8/9] Makefile: add "po-init" rule to initialize po/XX.po

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

The core translation is the minimum set of work that must be done for a new language translation.

There are over 5000 messages in the template message file "po/git.pot" that need to be translated. It is not a piece of cake for such a huge workload. So we used to define a small set of messages called "core translation" that a new l10n contributor must complete before sending pull request to the l10n coordinator.

By pulling in some parts of the git-po-helper[^1] logic, we add rule "core-pot" to create this core translation message "po/git-core.pot":

    make core-pot

To help new l10n contributors to initialized their "po/XX.pot" from "po/git-core.pot", we also add new rules "po-init":

    make po-init PO_FILE=po/XX.po
[^1]: https://github.com/git-l10n/git-po-helper/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile      | 41 +++++++++++++++++++++++++++++++++++++++++
 po/.gitignore |  1 +
 shared.mak    |  1 +
 3 files changed, 43 insertions(+)
Show changes to 3 files +43 −0

Makefile, po/.gitignore, shared.mak

diff --git a/Makefile b/Makefile
index 09cbde4c2a..d3eae150de 100644
--- a/Makefile
+++ b/Makefile
@@ -2808,6 +2808,7 @@ po-update: po/git.pot
 	$(check_po_file_envvar)
 	@if test ! -e $(PO_FILE); then \
 		echo >&2 "error: $(PO_FILE) does not exist"; \
+		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
 		exit 1; \
 	fi
 	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
@@ -2815,6 +2816,46 @@ po-update: po/git.pot
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
+### TODO FIXME: Translating everything in these files is a bad
+### heuristic for "core", as we'll translate obscure error() messages
+### along with commonly seen i18n messages. A better heuristic would
+### be to e.g. use spatch to first remove error/die/warning
+### etc. messages.
+LOCALIZED_C_CORE =
+LOCALIZED_C_CORE += builtin/checkout.c
+LOCALIZED_C_CORE += builtin/clone.c
+LOCALIZED_C_CORE += builtin/index-pack.c
+LOCALIZED_C_CORE += builtin/push.c
+LOCALIZED_C_CORE += builtin/reset.c
+LOCALIZED_C_CORE += remote.c
+LOCALIZED_C_CORE += wt-status.c
+
+LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
+
+.PHONY: core-pot
+core-pot: po/git-core.pot
+
+.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
+
+po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
+
+.PHONY: po-init
+po-init: po/git-core.pot
+	$(check_po_file_envvar)
+	@if test -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) exists already"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGINIT)msginit \
+		--input=$< \
+		--output=$(PO_FILE) \
+		--no-translator \
+		--locale=$(PO_FILE:po/%.po=%)
+
+## po/*.po files & their rules
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/po/.gitignore b/po/.gitignore
index 37d1301b32..ff0e5176a6 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,2 +1,3 @@
 /build
 /git.pot
+/git-core.pot
diff --git a/shared.mak b/shared.mak
index 8cd170a7e7..4330192e9c 100644
--- a/shared.mak
+++ b/shared.mak
@@ -62,6 +62,7 @@ ifndef V
 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our custom PRItime format, 2017-07-20) we'd consider source files as-is with gettext, but because we need to understand PRItime in the same way that gettext itself understands PRIuMAX we'd first check if we had a clean checkout, then munge all of the processed files in-place with "sed", generate "po/git.pot", and then finally "reset --hard" to undo our changes.

By generating "pot" snippets in ".build/pot/po" for each source file and rewriting certain source files with PRItime macros to temporary files in ".build/pot/po", we can avoid running "make pot" by altering files in place and doing a "reset --hard" afterwards.

This speed of "make pot" is slower than before on an initial run, because we run "xgettext" many times (once per source file), but it can be boosted by parallelization. It is *much* faster for incremental runs, and will allow us to implement related targets in subsequent commits.

When the "pot" target was originally added in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
re-generation of the po/git.pot if nothing had to be done.

Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked target, 2014-08-22) when it was made to depend on "FORCE". I.e. the Makefile's dependency resolution inherently can't handle incremental building when the target file may be updated by git (or something else external to "make"). But this case no longer applies, so FORCE is no longer needed.

That out of the way, the main logic change here is getting rid of the "reset --hard":

We'll generate intermediate ".build/pot/po/%.po" files from "%", which is handy to see at a glance what strings (if any) in a given file are marked for translation:

	$ make .build/pot/po/pretty.c.po
	[...]
	$ cat .build/pot/po/pretty.c.po
	#: pretty.c:1051
	msgid "unable to parse --pretty format"
	msgstr ""
	$

For these C source files which contain the PRItime macros, we will create temporary munged "*.c" files in a tree in ".build/pot/po" corresponding to our source tree, and have "xgettext" consider those. The rule needs to be careful to "(cd .build/pot/po && ...)", because otherwise the comments in the po/git.pot file wouldn't refer to the correct source locations (they'd be prefixed with ".build/pot/po"). These temporary munged "*.c” files will be removed immediately after the corresponding po files are generated, because some development tools cannot ignore the duplicate source files in the ".build" directory according to the ".gitignore" file, and that may cause trouble.

The output of the generated po/git.pot file is changed in one minor way: Because we're using msgcat(1) instead of xgettext(1) to concatenate the output we'll now disambiguate where "TRANSLATORS" comments come from, in cases where a message is the same in N files, and either only one has a "TRANSLATORS" comment, or they're different. E.g. for the "Your edited hunk[...]" message we'll now apply this change (comment content elided):

	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	 #: add-patch.c:1253 git-add--interactive.perl:1244
	 msgid ""
	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
	 msgstr ""

There are six such changes, and they all make the context more understandable, as msgcat(1) is better at handling these edge cases than xgettext(1)'s previously used "--join-existing" flag.

But filenames in the above disambiguation lines of extracted-comments have an extra ".po" extension compared to the filenames at the file locations. While we could rename the intermediate ".build/pot/po/%.po" files without the ".po" extension to use more intuitive filenames in the disambiguation lines of extracted-comments, but that will confuse developer tools with lots of invalid C or other source files in ".build/pot/po" directory.

The addition of "--omit-header" option for xgettext makes the "pot" snippets in ".build/pot/po/*.po" smaller. But as we'll see in a subsequent commit this header behavior has been hiding an encoding-related bug from us, so let's carry it forward instead of re-generating it with xgettext(1).

The "po/git.pot" file should have a header entry, because a proper header entry will increase the speed of creating a new po file using msginit and set a proper "POT-Creation-Date:" field in the header entry of a "po/XX.po" file. We use xgettext to generate a separate header file at ".build/pot/git.header" from "/dev/null", and use this header to assemble "po/git.pot".

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 .gitignore |  1 +
 Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 60 insertions(+), 21 deletions(-)
Show changes to 2 files +60 −21

.gitignore, Makefile

diff --git a/.gitignore b/.gitignore
index e81de1063a..a452215764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@
 *.[aos]
 *.o.json
 *.py[co]
+.build/
 .depend/
 *.gcda
 *.gcno
diff --git a/Makefile b/Makefile
index 46914dcd80..1962999c18 100644
--- a/Makefile
+++ b/Makefile
@@ -569,6 +569,7 @@ INSTALL = install
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
+MSGCAT = msgcat
 MSGFMT = msgfmt
 CURL_CONFIG = curl-config
 GCOV = gcov
@@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--package-name=Git \
 	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
@@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
+MSGCAT_FLAGS = --sort-by-file
 LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
 	      $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2726,34 +2729,68 @@ LOCALIZED_SH += t/t0200/test.sh
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-## Note that this is meant to be run only by the localization coordinator
-## under a very controlled condition, i.e. (1) it is to be run in a
-## Git repository (not a tarball extract), (2) any local modifications
-## will be lost.
+## We generate intermediate .build/pot/po/%.po files containing a
+## extract of the translations we find in each file in the source
+## tree. We will assemble them using msgcat to create the final
+## "po/git.pot" file.
+LOCALIZED_ALL_GEN_PO =
+
+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
+
+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
+
+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
+
 ## Gettext tools cannot work with our own custom PRItime type, so
 ## we replace PRItime with PRIuMAX.  We need to update this to
 ## PRIdMAX if we switch to a signed type later.
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT) \
+	    if grep -q PRItime $<; then \
+		(\
+			sed -e 's|PRItime|PRIuMAX|g' <$< \
+				>.build/pot/po/$< && \
+			cd .build/pot/po && \
+			$(XGETTEXT) --omit-header \
+				-o $(@:.build/pot/po/%=%) \
+				$(XGETTEXT_FLAGS_C) $< && \
+			rm $<; \
+		); \
+	    else \
+		$(XGETTEXT) --omit-header \
+			-o $@ $(XGETTEXT_FLAGS_C) $<; \
+	    fi
 
-po/git.pot: $(GENERATED_H) FORCE
-	# All modifications will be reverted at the end, so we do not
-	# want to have any local change.
-	git diff --quiet HEAD && git diff --quiet --cached
+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_SH) $<
 
-	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
-	do \
-		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
-		cat "$$s+" >"$$s" && rm "$$s+"; \
-	done
+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_PERL) $<
+
+define gen_pot_header
+$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+	-o - /dev/null | \
+sed -e 's|charset=CHARSET|charset=UTF-8|' \
+    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
+    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
+    >$@ && \
+echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
+endef
 
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
-		$(LOCALIZED_SH)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
-		$(LOCALIZED_PERL)
+.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_GEN)$(gen_pot_header)
 
-	# Reverting the munged source, leaving only the updated $@
-	git reset --hard
-	mv $@+ $@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3292,6 +3329,7 @@ cocciclean:
 	$(RM) contrib/coccinelle/*.cocci.patch*
 
 clean: profile-clean coverage-clean cocciclean
+	$(RM) -r .build
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 23, 2022, 07:28 UTC · re: Jiang Xin · lore

Re: [PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

On Mon, May 23 2022, Jiang Xin wrote:
Show 234 quoted lines
> From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> custom PRItime format, 2017-07-20) we'd consider source files as-is
> with gettext, but because we need to understand PRItime in the same way
> that gettext itself understands PRIuMAX we'd first check if we had a
> clean checkout, then munge all of the processed files in-place with
> "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> our changes.
>
> By generating "pot" snippets in ".build/pot/po" for each source file
> and rewriting certain source files with PRItime macros to temporary
> files in ".build/pot/po", we can avoid running "make pot" by altering
> files in place and doing a "reset --hard" afterwards.
>
> This speed of "make pot" is slower than before on an initial run,
> because we run "xgettext" many times (once per source file), but it
> can be boosted by parallelization. It is *much* faster for incremental
> runs, and will allow us to implement related targets in subsequent
> commits.
>
> When the "pot" target was originally added in cd5513a7168 (i18n:
> Makefile: "pot" target to extract messages marked for translation,
> 2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
> re-generation of the po/git.pot if nothing had to be done.
>
> Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial
> git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken
> until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked
> target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
> Makefile's dependency resolution inherently can't handle incremental
> building when the target file may be updated by git (or something else
> external to "make"). But this case no longer applies, so FORCE is no
> longer needed.
>
> That out of the way, the main logic change here is getting rid of the
> "reset --hard":
>
> We'll generate intermediate ".build/pot/po/%.po" files from "%", which
> is handy to see at a glance what strings (if any) in a given file are
> marked for translation:
>
> 	$ make .build/pot/po/pretty.c.po
> 	[...]
> 	$ cat .build/pot/po/pretty.c.po
> 	#: pretty.c:1051
> 	msgid "unable to parse --pretty format"
> 	msgstr ""
> 	$
>
> For these C source files which contain the PRItime macros, we will
> create temporary munged "*.c" files in a tree in ".build/pot/po"
> corresponding to our source tree, and have "xgettext" consider those.
> The rule needs to be careful to "(cd .build/pot/po && ...)", because
> otherwise the comments in the po/git.pot file wouldn't refer to the
> correct source locations (they'd be prefixed with ".build/pot/po").
> These temporary munged "*.c” files will be removed immediately after
> the corresponding po files are generated, because some development tools
> cannot ignore the duplicate source files in the ".build" directory
> according to the ".gitignore" file, and that may cause trouble.
>
> The output of the generated po/git.pot file is changed in one minor
> way: Because we're using msgcat(1) instead of xgettext(1) to
> concatenate the output we'll now disambiguate where "TRANSLATORS"
> comments come from, in cases where a message is the same in N files,
> and either only one has a "TRANSLATORS" comment, or they're
> different. E.g. for the "Your edited hunk[...]" message we'll now
> apply this change (comment content elided):
>
> 	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
> 	 #. TRANSLATORS: do not translate [y/n]
> 	[...]
> 	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> 	 #. TRANSLATORS: do not translate [y/n]
> 	[...]
> 	 #: add-patch.c:1253 git-add--interactive.perl:1244
> 	 msgid ""
> 	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
> 	 msgstr ""
>
> There are six such changes, and they all make the context more
> understandable, as msgcat(1) is better at handling these edge cases
> than xgettext(1)'s previously used "--join-existing" flag.
>
> But filenames in the above disambiguation lines of extracted-comments
> have an extra ".po" extension compared to the filenames at the file
> locations. While we could rename the intermediate ".build/pot/po/%.po"
> files without the ".po" extension to use more intuitive filenames in
> the disambiguation lines of extracted-comments, but that will confuse
> developer tools with lots of invalid C or other source files in
> ".build/pot/po" directory.
>
> The addition of "--omit-header" option for xgettext makes the "pot"
> snippets in ".build/pot/po/*.po" smaller. But as we'll see in a
> subsequent commit this header behavior has been hiding an
> encoding-related bug from us, so let's carry it forward instead of
> re-generating it with xgettext(1).
>
> The "po/git.pot" file should have a header entry, because a proper
> header entry will increase the speed of creating a new po file using
> msginit and set a proper "POT-Creation-Date:" field in the header
> entry of a "po/XX.po" file. We use xgettext to generate a separate
> header file at ".build/pot/git.header" from "/dev/null", and use this
> header to assemble "po/git.pot".
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  .gitignore |  1 +
>  Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
>  2 files changed, 60 insertions(+), 21 deletions(-)
>
> diff --git a/.gitignore b/.gitignore
> index e81de1063a..a452215764 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -200,6 +200,7 @@
>  *.[aos]
>  *.o.json
>  *.py[co]
> +.build/
>  .depend/
>  *.gcda
>  *.gcno
> diff --git a/Makefile b/Makefile
> index 46914dcd80..1962999c18 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -569,6 +569,7 @@ INSTALL = install
>  TCL_PATH = tclsh
>  TCLTK_PATH = wish
>  XGETTEXT = xgettext
> +MSGCAT = msgcat
>  MSGFMT = msgfmt
>  CURL_CONFIG = curl-config
>  GCOV = gcov
> @@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
>  	--force-po \
>  	--add-comments=TRANSLATORS: \
>  	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> +	--package-name=Git \
>  	--sort-by-file \
>  	--from-code=UTF-8
>  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
> @@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>  	--keyword=gettextln --keyword=eval_gettextln
>  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>  	--keyword=__ --keyword=N__ --keyword="__n:1,2"
> +MSGCAT_FLAGS = --sort-by-file
>  LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
>  	      $(GENERATED_H)
>  LOCALIZED_SH = $(SCRIPT_SH)
> @@ -2726,34 +2729,68 @@ LOCALIZED_SH += t/t0200/test.sh
>  LOCALIZED_PERL += t/t0200/test.perl
>  endif
>  
> -## Note that this is meant to be run only by the localization coordinator
> -## under a very controlled condition, i.e. (1) it is to be run in a
> -## Git repository (not a tarball extract), (2) any local modifications
> -## will be lost.
> +## We generate intermediate .build/pot/po/%.po files containing a
> +## extract of the translations we find in each file in the source
> +## tree. We will assemble them using msgcat to create the final
> +## "po/git.pot" file.
> +LOCALIZED_ALL_GEN_PO =
> +
> +LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
> +
> +LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
> +
> +LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
> +
>  ## Gettext tools cannot work with our own custom PRItime type, so
>  ## we replace PRItime with PRIuMAX.  We need to update this to
>  ## PRIdMAX if we switch to a signed type later.
> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT) \
> +	    if grep -q PRItime $<; then \
> +		(\
> +			sed -e 's|PRItime|PRIuMAX|g' <$< \
> +				>.build/pot/po/$< && \
> +			cd .build/pot/po && \
> +			$(XGETTEXT) --omit-header \
> +				-o $(@:.build/pot/po/%=%) \
> +				$(XGETTEXT_FLAGS_C) $< && \
> +			rm $<; \
> +		); \
> +	    else \
> +		$(XGETTEXT) --omit-header \
> +			-o $@ $(XGETTEXT_FLAGS_C) $<; \
> +	    fi
>  
> -po/git.pot: $(GENERATED_H) FORCE
> -	# All modifications will be reverted at the end, so we do not
> -	# want to have any local change.
> -	git diff --quiet HEAD && git diff --quiet --cached
> +$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> +		-o$@ $(XGETTEXT_FLAGS_SH) $<
>  
> -	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
> -	do \
> -		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
> -		cat "$$s+" >"$$s" && rm "$$s+"; \
> -	done
> +$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> +		-o$@ $(XGETTEXT_FLAGS_PERL) $<
> +q
> +define gen_pot_header
> +$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
> +	-o - /dev/null | \
> +sed -e 's|charset=CHARSET|charset=UTF-8|' \
> +    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
> +    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
> +    >$@ && \
> +echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
> +endef
>  
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
> -		$(LOCALIZED_SH)
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
> -		$(LOCALIZED_PERL)
> +.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_GEN)$(gen_pot_header)

So re a previous round I think the addition of a header to po/git.pot doesn't make sense, i.e. it's not needed, so we can just drop this entirely.

But if you really want to include it anyway then this dependency is broken, the header just depends on this gen_pot_header you've defined, we don't need to re-generate it every time any single source file changes.

Or is the intent to have its timestamp bumped if any of the source files change?

If so I think that to the extent we need headers at all (for the *.po files) it might be worthwhile to just have the timestamp be the same epoch we use for the tests in t/, i.e. never update it and avoid the needless churn. If people need to check when things were last changed, or initially added, they can use this little thing called "git" :)

Jiang Xin· May 23, 2022, 15:00 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

On Mon, May 23, 2022 at 4:07 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 242 quoted lines
>
>
> On Mon, May 23 2022, Jiang Xin wrote:
>
> > From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> >
> > Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> > custom PRItime format, 2017-07-20) we'd consider source files as-is
> > with gettext, but because we need to understand PRItime in the same way
> > that gettext itself understands PRIuMAX we'd first check if we had a
> > clean checkout, then munge all of the processed files in-place with
> > "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> > our changes.
> >
> > By generating "pot" snippets in ".build/pot/po" for each source file
> > and rewriting certain source files with PRItime macros to temporary
> > files in ".build/pot/po", we can avoid running "make pot" by altering
> > files in place and doing a "reset --hard" afterwards.
> >
> > This speed of "make pot" is slower than before on an initial run,
> > because we run "xgettext" many times (once per source file), but it
> > can be boosted by parallelization. It is *much* faster for incremental
> > runs, and will allow us to implement related targets in subsequent
> > commits.
> >
> > When the "pot" target was originally added in cd5513a7168 (i18n:
> > Makefile: "pot" target to extract messages marked for translation,
> > 2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
> > re-generation of the po/git.pot if nothing had to be done.
> >
> > Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial
> > git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken
> > until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked
> > target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
> > Makefile's dependency resolution inherently can't handle incremental
> > building when the target file may be updated by git (or something else
> > external to "make"). But this case no longer applies, so FORCE is no
> > longer needed.
> >
> > That out of the way, the main logic change here is getting rid of the
> > "reset --hard":
> >
> > We'll generate intermediate ".build/pot/po/%.po" files from "%", which
> > is handy to see at a glance what strings (if any) in a given file are
> > marked for translation:
> >
> >       $ make .build/pot/po/pretty.c.po
> >       [...]
> >       $ cat .build/pot/po/pretty.c.po
> >       #: pretty.c:1051
> >       msgid "unable to parse --pretty format"
> >       msgstr ""
> >       $
> >
> > For these C source files which contain the PRItime macros, we will
> > create temporary munged "*.c" files in a tree in ".build/pot/po"
> > corresponding to our source tree, and have "xgettext" consider those.
> > The rule needs to be careful to "(cd .build/pot/po && ...)", because
> > otherwise the comments in the po/git.pot file wouldn't refer to the
> > correct source locations (they'd be prefixed with ".build/pot/po").
> > These temporary munged "*.c” files will be removed immediately after
> > the corresponding po files are generated, because some development tools
> > cannot ignore the duplicate source files in the ".build" directory
> > according to the ".gitignore" file, and that may cause trouble.
> >
> > The output of the generated po/git.pot file is changed in one minor
> > way: Because we're using msgcat(1) instead of xgettext(1) to
> > concatenate the output we'll now disambiguate where "TRANSLATORS"
> > comments come from, in cases where a message is the same in N files,
> > and either only one has a "TRANSLATORS" comment, or they're
> > different. E.g. for the "Your edited hunk[...]" message we'll now
> > apply this change (comment content elided):
> >
> >       +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
> >        #. TRANSLATORS: do not translate [y/n]
> >       [...]
> >       +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> >        #. TRANSLATORS: do not translate [y/n]
> >       [...]
> >        #: add-patch.c:1253 git-add--interactive.perl:1244
> >        msgid ""
> >        "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
> >        msgstr ""
> >
> > There are six such changes, and they all make the context more
> > understandable, as msgcat(1) is better at handling these edge cases
> > than xgettext(1)'s previously used "--join-existing" flag.
> >
> > But filenames in the above disambiguation lines of extracted-comments
> > have an extra ".po" extension compared to the filenames at the file
> > locations. While we could rename the intermediate ".build/pot/po/%.po"
> > files without the ".po" extension to use more intuitive filenames in
> > the disambiguation lines of extracted-comments, but that will confuse
> > developer tools with lots of invalid C or other source files in
> > ".build/pot/po" directory.
> >
> > The addition of "--omit-header" option for xgettext makes the "pot"
> > snippets in ".build/pot/po/*.po" smaller. But as we'll see in a
> > subsequent commit this header behavior has been hiding an
> > encoding-related bug from us, so let's carry it forward instead of
> > re-generating it with xgettext(1).
> >
> > The "po/git.pot" file should have a header entry, because a proper
> > header entry will increase the speed of creating a new po file using
> > msginit and set a proper "POT-Creation-Date:" field in the header
> > entry of a "po/XX.po" file. We use xgettext to generate a separate
> > header file at ".build/pot/git.header" from "/dev/null", and use this
> > header to assemble "po/git.pot".
> >
> > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> > Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> > Signed-off-by: Junio C Hamano <gitster@pobox.com>
> > ---
> >  .gitignore |  1 +
> >  Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
> >  2 files changed, 60 insertions(+), 21 deletions(-)
> >
> > diff --git a/.gitignore b/.gitignore
> > index e81de1063a..a452215764 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -200,6 +200,7 @@
> >  *.[aos]
> >  *.o.json
> >  *.py[co]
> > +.build/
> >  .depend/
> >  *.gcda
> >  *.gcno
> > diff --git a/Makefile b/Makefile
> > index 46914dcd80..1962999c18 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -569,6 +569,7 @@ INSTALL = install
> >  TCL_PATH = tclsh
> >  TCLTK_PATH = wish
> >  XGETTEXT = xgettext
> > +MSGCAT = msgcat
> >  MSGFMT = msgfmt
> >  CURL_CONFIG = curl-config
> >  GCOV = gcov
> > @@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
> >       --force-po \
> >       --add-comments=TRANSLATORS: \
> >       --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> > +     --package-name=Git \
> >       --sort-by-file \
> >       --from-code=UTF-8
> >  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
> > @@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
> >       --keyword=gettextln --keyword=eval_gettextln
> >  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
> >       --keyword=__ --keyword=N__ --keyword="__n:1,2"
> > +MSGCAT_FLAGS = --sort-by-file
> >  LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
> >             $(GENERATED_H)
> >  LOCALIZED_SH = $(SCRIPT_SH)
> > @@ -2726,34 +2729,68 @@ LOCALIZED_SH += t/t0200/test.sh
> >  LOCALIZED_PERL += t/t0200/test.perl
> >  endif
> >
> > -## Note that this is meant to be run only by the localization coordinator
> > -## under a very controlled condition, i.e. (1) it is to be run in a
> > -## Git repository (not a tarball extract), (2) any local modifications
> > -## will be lost.
> > +## We generate intermediate .build/pot/po/%.po files containing a
> > +## extract of the translations we find in each file in the source
> > +## tree. We will assemble them using msgcat to create the final
> > +## "po/git.pot" file.
> > +LOCALIZED_ALL_GEN_PO =
> > +
> > +LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
> > +
> > +LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
> > +
> > +LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
> > +
> >  ## Gettext tools cannot work with our own custom PRItime type, so
> >  ## we replace PRItime with PRIuMAX.  We need to update this to
> >  ## PRIdMAX if we switch to a signed type later.
> > +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT) \
> > +         if grep -q PRItime $<; then \
> > +             (\
> > +                     sed -e 's|PRItime|PRIuMAX|g' <$< \
> > +                             >.build/pot/po/$< && \
> > +                     cd .build/pot/po && \
> > +                     $(XGETTEXT) --omit-header \
> > +                             -o $(@:.build/pot/po/%=%) \
> > +                             $(XGETTEXT_FLAGS_C) $< && \
> > +                     rm $<; \
> > +             ); \
> > +         else \
> > +             $(XGETTEXT) --omit-header \
> > +                     -o $@ $(XGETTEXT_FLAGS_C) $<; \
> > +         fi
> >
> > -po/git.pot: $(GENERATED_H) FORCE
> > -     # All modifications will be reverted at the end, so we do not
> > -     # want to have any local change.
> > -     git diff --quiet HEAD && git diff --quiet --cached
> > +$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> > +             -o$@ $(XGETTEXT_FLAGS_SH) $<
> >
> > -     @for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
> > -     do \
> > -             sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
> > -             cat "$$s+" >"$$s" && rm "$$s+"; \
> > -     done
> > +$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> > +             -o$@ $(XGETTEXT_FLAGS_PERL) $<
> > +q
> > +define gen_pot_header
> > +$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
> > +     -o - /dev/null | \
> > +sed -e 's|charset=CHARSET|charset=UTF-8|' \
> > +    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
> > +    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
> > +    >$@ && \
> > +echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
> > +endef
> >
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
> > -             $(LOCALIZED_SH)
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
> > -             $(LOCALIZED_PERL)
> > +.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_GEN)$(gen_pot_header)
>
> So re a previous round I think the addition of a header to po/git.pot
> doesn't make sense, i.e. it's not needed, so we can just drop this
> entirely.
You missed a note about this in commit log in this reroll:
    The "po/git.pot" file should have a header entry, because a proper
    header entry will increase the speed of creating a new po file using
    msginit and set a proper "POT-Creation-Date:" field in the header
    entry of a "po/XX.po" file. We use xgettext to generate a separate
    header file at ".build/pot/git.header" from "/dev/null", and use this
    header to assemble "po/git.pot".
> But if you really want to include it anyway then this dependency is
> broken, the header just depends on this gen_pot_header you've defined,
> we don't need to re-generate it every time any single source file
> changes.

The header file ".build/pot/git.header" should have the same prerequisites as the file "po/git.pot". This is because we need to refresh the timestamp of the "POT-Creation-Date:" field.

> Or is the intent to have its timestamp bumped if any of the source files
> change?

Right. Just like using xgettext to create a "po/git.pot" with a fresh header entry, we should recreate the header file for msgcat to create "po/git.pot".

We want to switch to a new l10n workflow, and we want everything works as usual. When l10n contributors update their "po/XX.po" file, it should contain the latest "POT-Creation-Date" timestamp instead of sticking to a fixed and outdated timestamp.

Show 5 quoted lines
> If so I think that to the extent we need headers at all (for the *.po
> files) it might be worthwhile to just have the timestamp be the same
> epoch we use for the tests in t/, i.e. never update it and avoid the
> needless churn. If people need to check when things were last changed,
> or initially added, they can use this little thing called "git" :)
I stick to my option, see above.
Jiang Xin· May 24, 2022, 00:56 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

On Mon, May 23, 2022 at 4:07 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 256 quoted lines
>
>
> On Mon, May 23 2022, Jiang Xin wrote:
>
> > From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> >
> > Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> > custom PRItime format, 2017-07-20) we'd consider source files as-is
> > with gettext, but because we need to understand PRItime in the same way
> > that gettext itself understands PRIuMAX we'd first check if we had a
> > clean checkout, then munge all of the processed files in-place with
> > "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> > our changes.
> >
> > By generating "pot" snippets in ".build/pot/po" for each source file
> > and rewriting certain source files with PRItime macros to temporary
> > files in ".build/pot/po", we can avoid running "make pot" by altering
> > files in place and doing a "reset --hard" afterwards.
> >
> > This speed of "make pot" is slower than before on an initial run,
> > because we run "xgettext" many times (once per source file), but it
> > can be boosted by parallelization. It is *much* faster for incremental
> > runs, and will allow us to implement related targets in subsequent
> > commits.
> >
> > When the "pot" target was originally added in cd5513a7168 (i18n:
> > Makefile: "pot" target to extract messages marked for translation,
> > 2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
> > re-generation of the po/git.pot if nothing had to be done.
> >
> > Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial
> > git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken
> > until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked
> > target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
> > Makefile's dependency resolution inherently can't handle incremental
> > building when the target file may be updated by git (or something else
> > external to "make"). But this case no longer applies, so FORCE is no
> > longer needed.
> >
> > That out of the way, the main logic change here is getting rid of the
> > "reset --hard":
> >
> > We'll generate intermediate ".build/pot/po/%.po" files from "%", which
> > is handy to see at a glance what strings (if any) in a given file are
> > marked for translation:
> >
> >       $ make .build/pot/po/pretty.c.po
> >       [...]
> >       $ cat .build/pot/po/pretty.c.po
> >       #: pretty.c:1051
> >       msgid "unable to parse --pretty format"
> >       msgstr ""
> >       $
> >
> > For these C source files which contain the PRItime macros, we will
> > create temporary munged "*.c" files in a tree in ".build/pot/po"
> > corresponding to our source tree, and have "xgettext" consider those.
> > The rule needs to be careful to "(cd .build/pot/po && ...)", because
> > otherwise the comments in the po/git.pot file wouldn't refer to the
> > correct source locations (they'd be prefixed with ".build/pot/po").
> > These temporary munged "*.c” files will be removed immediately after
> > the corresponding po files are generated, because some development tools
> > cannot ignore the duplicate source files in the ".build" directory
> > according to the ".gitignore" file, and that may cause trouble.
> >
> > The output of the generated po/git.pot file is changed in one minor
> > way: Because we're using msgcat(1) instead of xgettext(1) to
> > concatenate the output we'll now disambiguate where "TRANSLATORS"
> > comments come from, in cases where a message is the same in N files,
> > and either only one has a "TRANSLATORS" comment, or they're
> > different. E.g. for the "Your edited hunk[...]" message we'll now
> > apply this change (comment content elided):
> >
> >       +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
> >        #. TRANSLATORS: do not translate [y/n]
> >       [...]
> >       +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> >        #. TRANSLATORS: do not translate [y/n]
> >       [...]
> >        #: add-patch.c:1253 git-add--interactive.perl:1244
> >        msgid ""
> >        "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
> >        msgstr ""
> >
> > There are six such changes, and they all make the context more
> > understandable, as msgcat(1) is better at handling these edge cases
> > than xgettext(1)'s previously used "--join-existing" flag.
> >
> > But filenames in the above disambiguation lines of extracted-comments
> > have an extra ".po" extension compared to the filenames at the file
> > locations. While we could rename the intermediate ".build/pot/po/%.po"
> > files without the ".po" extension to use more intuitive filenames in
> > the disambiguation lines of extracted-comments, but that will confuse
> > developer tools with lots of invalid C or other source files in
> > ".build/pot/po" directory.
> >
> > The addition of "--omit-header" option for xgettext makes the "pot"
> > snippets in ".build/pot/po/*.po" smaller. But as we'll see in a
> > subsequent commit this header behavior has been hiding an
> > encoding-related bug from us, so let's carry it forward instead of
> > re-generating it with xgettext(1).
> >
> > The "po/git.pot" file should have a header entry, because a proper
> > header entry will increase the speed of creating a new po file using
> > msginit and set a proper "POT-Creation-Date:" field in the header
> > entry of a "po/XX.po" file. We use xgettext to generate a separate
> > header file at ".build/pot/git.header" from "/dev/null", and use this
> > header to assemble "po/git.pot".
> >
> > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> > Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> > Signed-off-by: Junio C Hamano <gitster@pobox.com>
> > ---
> >  .gitignore |  1 +
> >  Makefile   | 80 ++++++++++++++++++++++++++++++++++++++++--------------
> >  2 files changed, 60 insertions(+), 21 deletions(-)
> >
> > diff --git a/.gitignore b/.gitignore
> > index e81de1063a..a452215764 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -200,6 +200,7 @@
> >  *.[aos]
> >  *.o.json
> >  *.py[co]
> > +.build/
> >  .depend/
> >  *.gcda
> >  *.gcno
> > diff --git a/Makefile b/Makefile
> > index 46914dcd80..1962999c18 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -569,6 +569,7 @@ INSTALL = install
> >  TCL_PATH = tclsh
> >  TCLTK_PATH = wish
> >  XGETTEXT = xgettext
> > +MSGCAT = msgcat
> >  MSGFMT = msgfmt
> >  CURL_CONFIG = curl-config
> >  GCOV = gcov
> > @@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
> >       --force-po \
> >       --add-comments=TRANSLATORS: \
> >       --msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> > +     --package-name=Git \
> >       --sort-by-file \
> >       --from-code=UTF-8
> >  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
> > @@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
> >       --keyword=gettextln --keyword=eval_gettextln
> >  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
> >       --keyword=__ --keyword=N__ --keyword="__n:1,2"
> > +MSGCAT_FLAGS = --sort-by-file
> >  LOCALIZED_C = $(FOUND_C_SOURCES) $(FOUND_H_SOURCES) $(SCALAR_SOURCES) \
> >             $(GENERATED_H)
> >  LOCALIZED_SH = $(SCRIPT_SH)
> > @@ -2726,34 +2729,68 @@ LOCALIZED_SH += t/t0200/test.sh
> >  LOCALIZED_PERL += t/t0200/test.perl
> >  endif
> >
> > -## Note that this is meant to be run only by the localization coordinator
> > -## under a very controlled condition, i.e. (1) it is to be run in a
> > -## Git repository (not a tarball extract), (2) any local modifications
> > -## will be lost.
> > +## We generate intermediate .build/pot/po/%.po files containing a
> > +## extract of the translations we find in each file in the source
> > +## tree. We will assemble them using msgcat to create the final
> > +## "po/git.pot" file.
> > +LOCALIZED_ALL_GEN_PO =
> > +
> > +LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
> > +
> > +LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
> > +
> > +LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
> > +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
> > +
> >  ## Gettext tools cannot work with our own custom PRItime type, so
> >  ## we replace PRItime with PRIuMAX.  We need to update this to
> >  ## PRIdMAX if we switch to a signed type later.
> > +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT) \
> > +         if grep -q PRItime $<; then \
> > +             (\
> > +                     sed -e 's|PRItime|PRIuMAX|g' <$< \
> > +                             >.build/pot/po/$< && \
> > +                     cd .build/pot/po && \
> > +                     $(XGETTEXT) --omit-header \
> > +                             -o $(@:.build/pot/po/%=%) \
> > +                             $(XGETTEXT_FLAGS_C) $< && \
> > +                     rm $<; \
> > +             ); \
> > +         else \
> > +             $(XGETTEXT) --omit-header \
> > +                     -o $@ $(XGETTEXT_FLAGS_C) $<; \
> > +         fi
> >
> > -po/git.pot: $(GENERATED_H) FORCE
> > -     # All modifications will be reverted at the end, so we do not
> > -     # want to have any local change.
> > -     git diff --quiet HEAD && git diff --quiet --cached
> > +$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> > +             -o$@ $(XGETTEXT_FLAGS_SH) $<
> >
> > -     @for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
> > -     do \
> > -             sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
> > -             cat "$$s+" >"$$s" && rm "$$s+"; \
> > -     done
> > +$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> > +             -o$@ $(XGETTEXT_FLAGS_PERL) $<
> > +q
> > +define gen_pot_header
> > +$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
> > +     -o - /dev/null | \
> > +sed -e 's|charset=CHARSET|charset=UTF-8|' \
> > +    -e 's|\(Last-Translator: \)FULL NAME <.*>|\1make by the Makefile|' \
> > +    -e 's|\(Language-Team: \)LANGUAGE <.*>|\1Git Mailing List <git@vger.kernel.org>|' \
> > +    >$@ && \
> > +echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
> > +endef
> >
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
> > -             $(LOCALIZED_SH)
> > -     $(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
> > -             $(LOCALIZED_PERL)
> > +.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> > +     $(call mkdir_p_parent_template)
> > +     $(QUIET_GEN)$(gen_pot_header)
>
> So re a previous round I think the addition of a header to po/git.pot
> doesn't make sense, i.e. it's not needed, so we can just drop this
> entirely.
>
> But if you really want to include it anyway then this dependency is
> broken, the header just depends on this gen_pot_header you've defined,
> we don't need to re-generate it every time any single source file
> changes.
>
> Or is the intent to have its timestamp bumped if any of the source files
> change?
>
> If so I think that to the extent we need headers at all (for the *.po
> files) it might be worthwhile to just have the timestamp be the same
> epoch we use for the tests in t/, i.e. never update it and avoid the
> needless churn. If people need to check when things were last changed,
> or initially added, they can use this little thing called "git" :)

After rereading all the replies, I feel it's better to to leave a note here to make my point clear. As we removed the "po/git.pot" file, it is not easy to find the base version of a "po/XX.po" file, and we need the "POT-Creation-Date:" field which comes from the header of the generated POT file to tell us the version of the base.

    $ git -P grep POT-Creation-Date -- po/
    po/bg.po:"POT-Creation-Date: 2022-01-17 08:34+0800\n"
    po/ca.po:"POT-Creation-Date: 2022-04-06 14:40+0800\n"
    po/de.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/el.po:"POT-Creation-Date: 2019-02-15 10:09+0800\n"
    po/es.po:"POT-Creation-Date: 2021-11-04 08:34+0800\n"
    po/fr.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/id.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/is.po:"POT-Creation-Date: 2016-06-17 18:55+0000\n"
    po/it.po:"POT-Creation-Date: 2020-10-10 09:32+0800\n"
    po/ko.po:"POT-Creation-Date: 2018-06-16 22:06+0800\n"
    po/pl.po:"POT-Creation-Date: 2021-11-10 08:55+0800\n"
    po/pt_PT.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/ru.po:"POT-Creation-Date: 2020-12-21 07:10+0800\n"
    po/sv.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/tr.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/vi.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/zh_CN.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
    po/zh_TW.po:"POT-Creation-Date: 2022-04-13 14:52+0800\n"
Junio C Hamano· May 23, 2022, 08:15 UTC · re: Jiang Xin · lore

Re: [PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

Jiang Xin <worldhello.net@gmail.com> writes:
> From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> custom PRItime format, 2017-07-20) we'd consider source files as-is
", we'd consider".
> with gettext, but because we need to understand PRItime in the same way
> that gettext itself understands PRIuMAX we'd first check if we had a
"PRIuMAX, we'd first"
Show 8 quoted lines
> clean checkout, then munge all of the processed files in-place with
> "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> our changes.
>
> By generating "pot" snippets in ".build/pot/po" for each source file
> and rewriting certain source files with PRItime macros to temporary
> files in ".build/pot/po", we can avoid running "make pot" by altering
> files in place and doing a "reset --hard" afterwards.
Good.
Show 5 quoted lines
> This speed of "make pot" is slower than before on an initial run,
> because we run "xgettext" many times (once per source file), but it
> can be boosted by parallelization. It is *much* faster for incremental
> runs, and will allow us to implement related targets in subsequent
> commits.

This is to show my ignorance, but is there any downside, other than increased overhead coming from runing many instances of the program, in the "one file at a time" approach? I was wondering if two or more identical translatable strings appear in multiple source files, where they are coalesced into a single entry in the resulting .pot file, and if xgettext having visibility into all these files would somehow help the process, but presumably we'd use msgcat to unify them into one entry so there wouldn't be such a downside there. But are there others?

Thanks.
Jiang Xin· May 23, 2022, 09:37 UTC · re: Junio C Hamano · lore

Re: [PATCH v3 3/9] Makefile: have "make pot" not "reset --hard"

On Mon, May 23, 2022 at 4:15 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 41 quoted lines
>
> Jiang Xin <worldhello.net@gmail.com> writes:
>
> > From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> >
> > Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> > custom PRItime format, 2017-07-20) we'd consider source files as-is
>
> ", we'd consider".
>
> > with gettext, but because we need to understand PRItime in the same way
> > that gettext itself understands PRIuMAX we'd first check if we had a
>
> "PRIuMAX, we'd first"
>
> > clean checkout, then munge all of the processed files in-place with
> > "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> > our changes.
> >
> > By generating "pot" snippets in ".build/pot/po" for each source file
> > and rewriting certain source files with PRItime macros to temporary
> > files in ".build/pot/po", we can avoid running "make pot" by altering
> > files in place and doing a "reset --hard" afterwards.
>
> Good.
>
> > This speed of "make pot" is slower than before on an initial run,
> > because we run "xgettext" many times (once per source file), but it
> > can be boosted by parallelization. It is *much* faster for incremental
> > runs, and will allow us to implement related targets in subsequent
> > commits.
>
> This is to show my ignorance, but is there any downside, other than
> increased overhead coming from runing many instances of the program,
> in the "one file at a time" approach?  I was wondering if two or
> more identical translatable strings appear in multiple source files,
> where they are coalesced into a single entry in the resulting .pot
> file, and if xgettext having visibility into all these files would
> somehow help the process, but presumably we'd use msgcat to unify
> them into one entry so there wouldn't be such a downside there.  But
> are there others?

Both xgettext and msgcat have the ability to unify identical translatable strings, and list all the filenames and locations in the reference-comment part of the entry. In the following example, we can see the message "could not write index" comes from several C source files. We can also find this message in the corresponding intermediate po files, such as: ".build/pot/po/add-interactive.c.po" and ".build/pot/po/reset.c.po".

    #: add-interactive.c:709 add-interactive.c:898 reset.c:160 ...
    msgid "could not write index"
    msgstr ""

If there are different contexts (I.E. notes for translators in source code) for the identical translatable string from different files, "msgcat" will add additional lines "#. #-#-#-#-# ... #-#-#-#-#" for disambiguation like below:

    +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
     #. TRANSLATORS: 'it' refers to the patch mentioned in the
previous messages.
     #: add-patch.c:1106 git-add--interactive.perl:1129
     msgid ""
     "If it does not apply cleanly, you will be given an opportunity to\n"
     "edit again.  If all lines of the hunk are removed, then the edit is\n"
     "aborted and the hunk is left unchanged.\n"
     msgstr ""

The filename in the disambiguation comment line ends with ".po" extension. Ævar tries to fix this issue by introducing more intermediate files (which I will try to understand by some experiment) or remove ".po" extension from po files, while I think it is tolerable.

Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 4/9] i18n CI: stop allowing non-ASCII source messages in po/git.pot

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

In the preceding commit we moved away from using xgettext(1) to both generate the po/git.pot, and to merge the incrementally generated po/git.pot+ file as we sourced translations from C, shell and Perl.

Doing it this way, which dates back to my initial implementation[1][2][3] was conflating two things: With xgettext(1) the --from-code both controls what encoding is specified in the po/git.pot's header, and what encoding we allow in source messages.

We don't ever want to allow non-ASCII in *source messages*, and doing so has hid e.g. a buggy message introduced in a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C, 2021-08-10) from us, we'd warn about it before, but only when running "make pot", but the operation would still succeed. Now we'll error out on it when running "make pot".

Since the preceding Makefile changes made this easy: let's add a "make check-pot" target with the same prerequisites as the "po/git.pot" target, but without changing the file "po/git.pot". Running it as part of the "static-analysis" CI target will ensure that we catch any such issues in the future. E.g.:

    $ make check-pot
        XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
              Please specify the source encoding through --from-code.
    make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
   marked for translation, 2011-02-22)
2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
   2011-05-14)
3. 5e9637c6297 (i18n: add infrastructure for translating Git with
   gettext, 2011-11-18)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile                    | 6 ++++--
 builtin/submodule--helper.c | 2 +-
 ci/run-static-analysis.sh   | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)
Show changes to 3 files +7 −3

Makefile, builtin/submodule--helper.c, ci/run-static-analysis.sh

diff --git a/Makefile b/Makefile
index 1962999c18..70d5f41c3f 100644
--- a/Makefile
+++ b/Makefile
@@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 	--package-name=Git \
-	--sort-by-file \
-	--from-code=UTF-8
+	--sort-by-file
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
@@ -2795,6 +2794,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
 .PHONY: pot
 pot: po/git.pot
 
+.PHONY: check-pot
+check-pot: $(LOCALIZED_ALL_GEN_PO)
+
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2c87ef9364..b97f02eed5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
 			   N_("reference repository")),
 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
-			   N_("sets the submodule’s name to the given string "
+			   N_("sets the submodule's name to the given string "
 			      "instead of defaulting to its path")),
 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
 		OPT_END()
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 65bcebda41..0d51e5ce0e 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -29,4 +29,6 @@ fi
 make hdr-check ||
 exit 1
 
+make check-pot
+
 save_good_tree
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 6/9] po/git.pot: don't check in result of "make pot"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Remove the "po/git.pot" file from being tracked, which started with dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13).

The reason the po/git.pot started being checked in was because the po/*.po files were changed a schema where we'd generate them from a known-good snapshot of po/git.pot, instead of each translator running "make pot" themselves.

This makes sense, but we don't need to carry this file in-tree just to achieve that aim, and doing so has resulted in a significant amount of "diff churn" since this method of doing it was introduced:

    $ git log -p --oneline -- po/git.pot|wc -l
    553743

We can instead let l10n contributors to generate "po/git.pot" in runtime to update their own "po/XX.po", and the l10n coordinator can check pull requests using CI pipeline.

This reverts to the schema introduced initially in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22).

The actual "git rm" of po/git.pot was in preceding commit to make this change easier to review, and to preempt the mailing list from blocking it due to it being too large.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile      | 5 +++--
 po/.gitignore | 1 +
 2 files changed, 4 insertions(+), 2 deletions(-)
Show changes to 2 files +4 −2

Makefile, po/.gitignore

diff --git a/Makefile b/Makefile
index 70d5f41c3f..3122672263 100644
--- a/Makefile
+++ b/Makefile
@@ -2788,8 +2788,8 @@ endef
 	$(call mkdir_p_parent_template)
 	$(QUIET_GEN)$(gen_pot_header)
 
-po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO) FORCE
-	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $(filter-out FORCE,$^) >$@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3319,6 +3319,7 @@ dist-doc: git$X
 
 distclean: clean
 	$(RM) configure
+	$(RM) po/git.pot
 	$(RM) config.log config.status config.cache
 	$(RM) config.mak.autogen config.mak.append
 	$(RM) -r autom4te.cache
diff --git a/po/.gitignore b/po/.gitignore
index 796b96d1c4..37d1301b32 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1 +1,2 @@
 /build
+/git.pot
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 23, 2022, 07:26 UTC · re: Jiang Xin · lore

Re: [PATCH v3 6/9] po/git.pot: don't check in result of "make pot"

On Mon, May 23 2022, Jiang Xin wrote:
Show 7 quoted lines
>  .PHONY: pot
>  pot: po/git.pot
> @@ -3319,6 +3319,7 @@ dist-doc: git$X
>  
>  distclean: clean
>  	$(RM) configure
> +	$(RM) po/git.pot

I think I noted "why not add this to clean?" in an earlier round, but didn't think it through.

On second thought we should do that, but the reason is that "distclean" should only clean things that you get if you do "make dist".

I.e. we add "configure" to a generated tarball, but not po/git.pot, so this should just be under regular "clean", not "distclean".

Jiang Xin· May 23, 2022, 08:30 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v3 6/9] po/git.pot: don't check in result of "make pot"

On Mon, May 23, 2022 at 3:27 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 20 quoted lines
>
>
> On Mon, May 23 2022, Jiang Xin wrote:
>
> >  .PHONY: pot
> >  pot: po/git.pot
> > @@ -3319,6 +3319,7 @@ dist-doc: git$X
> >
> >  distclean: clean
> >       $(RM) configure
> > +     $(RM) po/git.pot
>
> I think I noted "why not add this to clean?" in an earlier round, but
> didn't think it through.
>
> On second thought we should do that, but the reason is that "distclean"
> should only clean things that you get if you do "make dist".
>
> I.e. we add "configure" to a generated tarball, but not po/git.pot, so
> this should just be under regular "clean", not "distclean".

Will remove "po/git.pot" under regular "clean" rule in next reroll. I copied it from your original patch without thinking carefully.

Jiang Xin· May 23, 2022, 08:35 UTC · re: Jiang Xin · lore

Re: [PATCH v3 6/9] po/git.pot: don't check in result of "make pot"

On Mon, May 23, 2022 at 4:30 PM Jiang Xin <worldhello.net@gmail.com> wrote:
Show 26 quoted lines
>
> On Mon, May 23, 2022 at 3:27 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
> >
> >
> > On Mon, May 23 2022, Jiang Xin wrote:
> >
> > >  .PHONY: pot
> > >  pot: po/git.pot
> > > @@ -3319,6 +3319,7 @@ dist-doc: git$X
> > >
> > >  distclean: clean
> > >       $(RM) configure
> > > +     $(RM) po/git.pot
> >
> > I think I noted "why not add this to clean?" in an earlier round, but
> > didn't think it through.
> >
> > On second thought we should do that, but the reason is that "distclean"
> > should only clean things that you get if you do "make dist".
> >
> > I.e. we add "configure" to a generated tarball, but not po/git.pot, so
> > this should just be under regular "clean", not "distclean".
>
> Will remove "po/git.pot" under regular "clean" rule in next reroll. I
> copied it from your original patch without thinking carefully.
Like this:
-- snip --
Show changes to Makefile +1 −2
diff --git a/Makefile b/Makefile
index 3122672263..161ebf4ff3 100644
--- a/Makefile
+++ b/Makefile
@@ -3319,7 +3319,6 @@ dist-doc: git$X

 distclean: clean
        $(RM) configure
-       $(RM) po/git.pot
        $(RM) config.log config.status config.cache
        $(RM) config.mak.autogen config.mak.append
        $(RM) -r autom4te.cache
@@ -3333,6 +3332,7 @@ cocciclean:

 clean: profile-clean coverage-clean cocciclean
        $(RM) -r .build
+       $(RM) po/git.pot
        $(RM) *.res
        $(RM) $(OBJECTS)
        $(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- snap --
Ævar Arnfjörð Bjarmason· May 23, 2022, 09:28 UTC · re: Jiang Xin · lore

Re: [PATCH v3 6/9] po/git.pot: don't check in result of "make pot"

On Mon, May 23 2022, Jiang Xin wrote:
Show 25 quoted lines
> On Mon, May 23, 2022 at 3:27 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>>
>>
>> On Mon, May 23 2022, Jiang Xin wrote:
>>
>> >  .PHONY: pot
>> >  pot: po/git.pot
>> > @@ -3319,6 +3319,7 @@ dist-doc: git$X
>> >
>> >  distclean: clean
>> >       $(RM) configure
>> > +     $(RM) po/git.pot
>>
>> I think I noted "why not add this to clean?" in an earlier round, but
>> didn't think it through.
>>
>> On second thought we should do that, but the reason is that "distclean"
>> should only clean things that you get if you do "make dist".
>>
>> I.e. we add "configure" to a generated tarball, but not po/git.pot, so
>> this should just be under regular "clean", not "distclean".
>
> Will remove "po/git.pot" under regular "clean" rule in next reroll. I
> copied it from your original patch without thinking carefully.

Yes, sorry about that. Just to be clear I didn't think this was an issue you introduced. To be honest I thought it could be mine or yours, and didn't dig to look into the history :)

I have no idea why I added it to distclean, and it doesn't make any sense to me now, but oh well, as long as we fix it ... :)

Jiang Xin· May 23, 2022, 01:25 UTC · re: Jiang Xin · lore

[PATCH v3 5/9] po/git.pot: this is now a generated file

We no longer keep track of the contents of this file.
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot
Show changes to po/git.pot +0 −9449
diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"a - stash this hunk and all later hunks in the file\n"
-"d - do not stash this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-msgid ""
-"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
-"as appropriate to mark resolution and make a commit."
-msgstr ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-msgid ""
-"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
-msgstr ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

When running "make pot" on different platform, we may get a different message template file "po/git.pot". This is because the "LOCALIZED_C" variable may have different C source files on different platforms or different compiler conditions.

We can make a stable "LOCALIZED_C" variable by applying patch snippets as follows:

     ifdef NO_LIBGEN_H
         COMPAT_CFLAGS += -DNO_LIBGEN_H
         COMPAT_OBJS += compat/basename.o
    +else
    +    LOCALIZED_C += compat/basename.c
     endif

But it is much simpler to use variables "$(FOUND_C_SOURCES)" and "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".

With this update, the newly generated "po/git.pot" will have 30 new entries coming from the following C source files:

 * compat/fsmonitor/fsm-listen-win32.c
 * compat/mingw.c
 * compat/regex/regcomp.c
 * compat/simple-ipc/ipc-win32.c
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Show changes to Makefile +2 −1
diff --git a/Makefile b/Makefile
index 83e968e2a4..60ca42c268 100644
--- a/Makefile
+++ b/Makefile
@@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
-LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
+LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
+	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
 LOCALIZED_SH += git-sh-setup.sh
 LOCALIZED_PERL = $(SCRIPT_PERL)
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 09:18 UTC · re: Jiang Xin · lore

Re: [PATCH v2 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

On Thu, May 19 2022, Jiang Xin wrote:
Show 6 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> When running "make pot" on different platform, we may get a different
> message template file "po/git.pot". This is because the "LOCALIZED_C"
> variable may have different C source files on different platforms or
> different compiler conditions.

As noted in my review of 1/9 this part of the rationale makes perfect sense, no matter what we should always get the same results from "make pot" on different platforms.

And I like the simplicity of using FOUND_C_SOURCES, unfortunately...
Show 20 quoted lines
> We can make a stable "LOCALIZED_C" variable by applying patch snippets
> as follows:
>
>      ifdef NO_LIBGEN_H
>          COMPAT_CFLAGS += -DNO_LIBGEN_H
>          COMPAT_OBJS += compat/basename.o
>     +else
>     +    LOCALIZED_C += compat/basename.c
>      endif
>
> But it is much simpler to use variables "$(FOUND_C_SOURCES)" and
> "$(FOUND_C_SOURCES)" to form a stable "LOCALIZED_C".
>
> With this update, the newly generated "po/git.pot" will have 30 new
> entries coming from the following C source files:
>
>  * compat/fsmonitor/fsm-listen-win32.c
>  * compat/mingw.c
>  * compat/regex/regcomp.c
>  * compat/simple-ipc/ipc-win32.c

Those files which list "our" code look like obvious bug fixes, i.e. we are the primary maintainer of that compat/* code, so we should do the translation.

But the inclusion of compat/regex/regcomp.c there is a bug IMO. It's code we got from glibc/awk. Do we really want to be using translator time on that?

Hrm, maybe. After all those systems (most notably Windows) won't have glibc/awk's translation catalogs, and in any case even if they did we'd be using some ~decade old version of the code, so the two won't match up well.

So maybe this is fine....
Show 17 quoted lines
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  Makefile | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile b/Makefile
> index 83e968e2a4..60ca42c268 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>  	--keyword=gettextln --keyword=eval_gettextln
>  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>  	--keyword=__ --keyword=N__ --keyword="__n:1,2"
> -LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
> +LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
> +	      $(FOUND_H_SOURCES) $(GENERATED_H)

The SCALAR_SOURCES seems snuck in here, but it's worth noting in the commit message that we effectively had it here before as part of C_OBJ.

Jiang Xin· May 19, 2022, 12:48 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v2 2/9] Makefile: generate "po/git.pot" from stable LOCALIZED_C

On Thu, May 19, 2022 at 5:25 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 14 quoted lines
> > diff --git a/Makefile b/Makefile
> > index 83e968e2a4..60ca42c268 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -2714,7 +2714,8 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
> >       --keyword=gettextln --keyword=eval_gettextln
> >  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
> >       --keyword=__ --keyword=N__ --keyword="__n:1,2"
> > -LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
> > +LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
> > +           $(FOUND_H_SOURCES) $(GENERATED_H)
>
> The SCALAR_SOURCES seems snuck in here, but it's worth noting in the
> commit message that we effectively had it here before as part of C_OBJ.
Agree.
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 3/9] Makefile: have "make pot" not "reset --hard"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our custom PRItime format, 2017-07-20) we'd consider source files as-is with gettext, but because we need to understand PRItime in the same way that gettext itself understands PRIuMAX we'd first check if we had a clean checkout, then munge all of the processed files in-place with "sed", generate "po/git.pot", and then finally "reset --hard" to undo our changes.

By generating "pot" snippets in ".build/pot/po" for each source file and rewriting certain source files with PRItime macros to temporary files in ".build/pot/po", we can avoid running "make pot" by altering files in place and doing a "reset --hard" afterwards.

This speed of "make pot" is slower than before on an initial run, because we run "xgettext" many times (once per source file), but it can be boosted by parallelization. It is *much* faster for incremental runs, and will allow us to implement related targets in subsequent commits.

When the "pot" target was originally added in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
re-generation of the po/git.pot if nothing had to be done.

Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked target, 2014-08-22) when it was made to depend on "FORCE". I.e. the Makefile's dependency resolution inherently can't handle incremental building when the target file may be updated by git (or something else external to "make"). But this case no longer applies, so FORCE is no longer needed.

That out of the way, the main logic change here is getting rid of the "reset --hard":

We'll generate intermediate .build/pot/po/%.po files from %, which is handy to see at a glance what strings (if any) in a given file are marked for translation:

	$ make .build/pot/po/pretty.c.po
	[...]
	$ cat .build/pot/po/pretty.c.po
	#: pretty.c:1051
	msgid "unable to parse --pretty format"
	msgstr ""
	$

For these C source files which contain the PRItime macros, we will create temporary munged *.c files in a tree in ".build/pot/po" corresponding to our source tree, and have "xgettext" consider those. The rule needs to be careful to "(cd .build/pot/po && ...)", because otherwise the comments in the po/git.pot file wouldn't refer to the correct source locations (they'd be prefixed with ".build/pot/po").

This changes the output of the generated po/git.pot file in one minor way: Because we're using msgcat(1) instead of xgettext(1) to concatenate the output we'll now disambiguate where "TRANSLATORS" comments come from, in cases where a message is the same in N files, and either only one has a "TRANSLATORS" comment, or they're different. E.g. for the "Your edited hunk[...]" message we'll now apply this change (comment content elided):

	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
	 #. TRANSLATORS: do not translate [y/n]
	[...]
	 #: add-patch.c:1253 git-add--interactive.perl:1244
	 msgid ""
	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
	 msgstr ""

There are six such changes, and they all make the context more understandable, as msgcat(1) is better at handling these edge cases than xgettext(1)'s previously used "--join-existing" flag.

While we could rename the "pot" snippets without the ".po" extention to use more intuitive filenames in the comments, but that will confuse the IDE with lots of invalid C or perl source files in ".build/pot/po" directory.

The addition of "--omit-header" option for xgettext makes the "pot" snippets in ".build/pot/po/*.po" smaller. For the pot header of "po/git.pot", we use xgettext to generate a "pot" header file ".build/pot/git.header" from an empty file at runtime, and use this header to assemble "po/git.pot".

But as we'll see in a subsequent commit this header behavior has been hiding an encoding-related bug from us, so let's carry it forward instead of re-generating it with xgettext(1).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 .gitignore |  1 +
 Makefile   | 73 ++++++++++++++++++++++++++++++++++++++----------------
 2 files changed, 53 insertions(+), 21 deletions(-)
Show changes to 2 files +53 −21

.gitignore, Makefile

diff --git a/.gitignore b/.gitignore
index e81de1063a..a452215764 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@
 *.[aos]
 *.o.json
 *.py[co]
+.build/
 .depend/
 *.gcda
 *.gcno
diff --git a/Makefile b/Makefile
index 60ca42c268..c32ac4ca30 100644
--- a/Makefile
+++ b/Makefile
@@ -569,6 +569,7 @@ INSTALL = install
 TCL_PATH = tclsh
 TCLTK_PATH = wish
 XGETTEXT = xgettext
+MSGCAT = msgcat
 MSGFMT = msgfmt
 CURL_CONFIG = curl-config
 GCOV = gcov
@@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
 	--force-po \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
+	--package-name=Git \
 	--sort-by-file \
 	--from-code=UTF-8
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
@@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 	--keyword=gettextln --keyword=eval_gettextln
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
+MSGCAT_FLAGS = --sort-by-file
 LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
 	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2726,34 +2729,61 @@ LOCALIZED_SH += t/t0200/test.sh
 LOCALIZED_PERL += t/t0200/test.perl
 endif
 
-## Note that this is meant to be run only by the localization coordinator
-## under a very controlled condition, i.e. (1) it is to be run in a
-## Git repository (not a tarball extract), (2) any local modifications
-## will be lost.
+## We generate intermediate .build/pot/po/%.po files containing a
+## extract of the translations we find in each file in the source
+## tree. We will assemble them using msgcat to create the final
+## "po/git.pot" file.
+LOCALIZED_ALL_GEN_PO =
+
+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
+
+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
+
+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
+LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
+
 ## Gettext tools cannot work with our own custom PRItime type, so
 ## we replace PRItime with PRIuMAX.  We need to update this to
 ## PRIdMAX if we switch to a signed type later.
+$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT) \
+	    if grep -q PRItime $<; then \
+		(\
+			sed -e 's|PRItime|PRIuMAX|g' <$< \
+				>.build/pot/po/$< && \
+			cd .build/pot/po && \
+			$(XGETTEXT) --omit-header \
+				-o $(@:.build/pot/po/%=%) \
+				$(XGETTEXT_FLAGS_C) $< && \
+			rm $<; \
+		); \
+	    else \
+		$(XGETTEXT) --omit-header \
+			-o $@ $(XGETTEXT_FLAGS_C) $<; \
+	    fi
 
-po/git.pot: $(GENERATED_H) FORCE
-	# All modifications will be reverted at the end, so we do not
-	# want to have any local change.
-	git diff --quiet HEAD && git diff --quiet --cached
+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_SH) $<
 
-	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
-	do \
-		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
-		cat "$$s+" >"$$s" && rm "$$s+"; \
-	done
+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
+		-o$@ $(XGETTEXT_FLAGS_PERL) $<
 
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
-		$(LOCALIZED_SH)
-	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
-		$(LOCALIZED_PERL)
+.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+		-o - /dev/null | \
+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
 
-	# Reverting the munged source, leaving only the updated $@
-	git reset --hard
-	mv $@+ $@
+po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
 
 .PHONY: pot
 pot: po/git.pot
@@ -3292,6 +3322,7 @@ cocciclean:
 	$(RM) contrib/coccinelle/*.cocci.patch*
 
 clean: profile-clean coverage-clean cocciclean
+	$(RM) -r .build
 	$(RM) *.res
 	$(RM) $(OBJECTS)
 	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 09:43 UTC · re: Jiang Xin · lore

Re: [PATCH v2 3/9] Makefile: have "make pot" not "reset --hard"

On Thu, May 19 2022, Jiang Xin wrote:
Show 234 quoted lines
> From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
> custom PRItime format, 2017-07-20) we'd consider source files as-is
> with gettext, but because we need to understand PRItime in the same way
> that gettext itself understands PRIuMAX we'd first check if we had a
> clean checkout, then munge all of the processed files in-place with
> "sed", generate "po/git.pot", and then finally "reset --hard" to undo
> our changes.
>
> By generating "pot" snippets in ".build/pot/po" for each source file
> and rewriting certain source files with PRItime macros to temporary
> files in ".build/pot/po", we can avoid running "make pot" by altering
> files in place and doing a "reset --hard" afterwards.
>
> This speed of "make pot" is slower than before on an initial run,
> because we run "xgettext" many times (once per source file), but it
> can be boosted by parallelization. It is *much* faster for incremental
> runs, and will allow us to implement related targets in subsequent
> commits.
>
> When the "pot" target was originally added in cd5513a7168 (i18n:
> Makefile: "pot" target to extract messages marked for translation,
> 2011-02-22) it behaved like a "normal" target. I.e. we'd skip the
> re-generation of the po/git.pot if nothing had to be done.
>
> Then after po/git.pot was checked in in dce37b66fb0 (l10n: initial
> git.pot for 1.7.10 upcoming release, 2012-02-13) the target was broken
> until 1f31963e921 (i18n: treat "make pot" as an explicitly-invoked
> target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
> Makefile's dependency resolution inherently can't handle incremental
> building when the target file may be updated by git (or something else
> external to "make"). But this case no longer applies, so FORCE is no
> longer needed.
>
> That out of the way, the main logic change here is getting rid of the
> "reset --hard":
>
> We'll generate intermediate .build/pot/po/%.po files from %, which is
> handy to see at a glance what strings (if any) in a given file are
> marked for translation:
>
> 	$ make .build/pot/po/pretty.c.po
> 	[...]
> 	$ cat .build/pot/po/pretty.c.po
> 	#: pretty.c:1051
> 	msgid "unable to parse --pretty format"
> 	msgstr ""
> 	$
>
> For these C source files which contain the PRItime macros, we will
> create temporary munged *.c files in a tree in ".build/pot/po"
> corresponding to our source tree, and have "xgettext" consider those.
> The rule needs to be careful to "(cd .build/pot/po && ...)", because
> otherwise the comments in the po/git.pot file wouldn't refer to the
> correct source locations (they'd be prefixed with ".build/pot/po").
>
> This changes the output of the generated po/git.pot file in one minor
> way: Because we're using msgcat(1) instead of xgettext(1) to
> concatenate the output we'll now disambiguate where "TRANSLATORS"
> comments come from, in cases where a message is the same in N files,
> and either only one has a "TRANSLATORS" comment, or they're
> different. E.g. for the "Your edited hunk[...]" message we'll now
> apply this change (comment content elided):
>
> 	+#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
> 	 #. TRANSLATORS: do not translate [y/n]
> 	[...]
> 	+#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
> 	 #. TRANSLATORS: do not translate [y/n]
> 	[...]
> 	 #: add-patch.c:1253 git-add--interactive.perl:1244
> 	 msgid ""
> 	 "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
> 	 msgstr ""
>
> There are six such changes, and they all make the context more
> understandable, as msgcat(1) is better at handling these edge cases
> than xgettext(1)'s previously used "--join-existing" flag.
>
> While we could rename the "pot" snippets without the ".po" extention
> to use more intuitive filenames in the comments, but that will
> confuse the IDE with lots of invalid C or perl source files in
> ".build/pot/po" directory.
>
> The addition of "--omit-header" option for xgettext makes the "pot"
> snippets in ".build/pot/po/*.po" smaller. For the pot header of
> "po/git.pot", we use xgettext to generate a "pot" header file
> ".build/pot/git.header" from an empty file at runtime, and use this
> header to assemble "po/git.pot".
>
> But as we'll see in a subsequent commit this header behavior has been
> hiding an encoding-related bug from us, so let's carry it forward
> instead of re-generating it with xgettext(1).
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  .gitignore |  1 +
>  Makefile   | 73 ++++++++++++++++++++++++++++++++++++++----------------
>  2 files changed, 53 insertions(+), 21 deletions(-)
>
> diff --git a/.gitignore b/.gitignore
> index e81de1063a..a452215764 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -200,6 +200,7 @@
>  *.[aos]
>  *.o.json
>  *.py[co]
> +.build/
>  .depend/
>  *.gcda
>  *.gcno
> diff --git a/Makefile b/Makefile
> index 60ca42c268..c32ac4ca30 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -569,6 +569,7 @@ INSTALL = install
>  TCL_PATH = tclsh
>  TCLTK_PATH = wish
>  XGETTEXT = xgettext
> +MSGCAT = msgcat
>  MSGFMT = msgfmt
>  CURL_CONFIG = curl-config
>  GCOV = gcov
> @@ -2706,6 +2707,7 @@ XGETTEXT_FLAGS = \
>  	--force-po \
>  	--add-comments=TRANSLATORS: \
>  	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
> +	--package-name=Git \
>  	--sort-by-file \
>  	--from-code=UTF-8
>  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
> @@ -2714,6 +2716,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>  	--keyword=gettextln --keyword=eval_gettextln
>  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>  	--keyword=__ --keyword=N__ --keyword="__n:1,2"
> +MSGCAT_FLAGS = --sort-by-file
>  LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
>  	      $(FOUND_H_SOURCES) $(GENERATED_H)
>  LOCALIZED_SH = $(SCRIPT_SH)
> @@ -2726,34 +2729,61 @@ LOCALIZED_SH += t/t0200/test.sh
>  LOCALIZED_PERL += t/t0200/test.perl
>  endif
>  
> -## Note that this is meant to be run only by the localization coordinator
> -## under a very controlled condition, i.e. (1) it is to be run in a
> -## Git repository (not a tarball extract), (2) any local modifications
> -## will be lost.
> +## We generate intermediate .build/pot/po/%.po files containing a
> +## extract of the translations we find in each file in the source
> +## tree. We will assemble them using msgcat to create the final
> +## "po/git.pot" file.
> +LOCALIZED_ALL_GEN_PO =
> +
> +LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
> +
> +LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
> +
> +LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
> +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
> +
>  ## Gettext tools cannot work with our own custom PRItime type, so
>  ## we replace PRItime with PRIuMAX.  We need to update this to
>  ## PRIdMAX if we switch to a signed type later.
> +$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT) \
> +	    if grep -q PRItime $<; then \
> +		(\
> +			sed -e 's|PRItime|PRIuMAX|g' <$< \
> +				>.build/pot/po/$< && \
> +			cd .build/pot/po && \
> +			$(XGETTEXT) --omit-header \
> +				-o $(@:.build/pot/po/%=%) \
> +				$(XGETTEXT_FLAGS_C) $< && \
> +			rm $<; \
> +		); \
> +	    else \
> +		$(XGETTEXT) --omit-header \
> +			-o $@ $(XGETTEXT_FLAGS_C) $<; \
> +	    fi
>  
> -po/git.pot: $(GENERATED_H) FORCE
> -	# All modifications will be reverted at the end, so we do not
> -	# want to have any local change.
> -	git diff --quiet HEAD && git diff --quiet --cached
> +$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> +		-o$@ $(XGETTEXT_FLAGS_SH) $<
>  
> -	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
> -	do \
> -		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
> -		cat "$$s+" >"$$s" && rm "$$s+"; \
> -	done
> +$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
> +		-o$@ $(XGETTEXT_FLAGS_PERL) $<
>  
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
> -		$(LOCALIZED_SH)
> -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
> -		$(LOCALIZED_PERL)
> +.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
> +		-o - /dev/null | \
> +	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
> +	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
>  
> -	# Reverting the munged source, leaving only the updated $@
> -	git reset --hard
> -	mv $@+ $@
> +po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
> +	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
>  
>  .PHONY: pot
>  pot: po/git.pot
> @@ -3292,6 +3322,7 @@ cocciclean:
>  	$(RM) contrib/coccinelle/*.cocci.patch*
>  
>  clean: profile-clean coverage-clean cocciclean
> +	$(RM) -r .build
>  	$(RM) *.res
>  	$(RM) $(OBJECTS)
>  	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)

In the previous discussion of kicking things around I lost track of what version of mine this is picked up from, but I range-diff'd it to my 6cf9c1f7022 (Makefile: have "make pot" not "reset --hard", 2022-04-02), which is the latest I had in avar/Makefile-incremental-po-git-pot-rule on my branch.

A range-diff of the two follows below (yours being the RHS). Some comments:

 * There's a bug here where you're creating .build/pot/po/pretty.c.po
   files, not .build/pot/po/pretty.c, i.e. you add a *.po extension.
   As the commit message diff shows that results in us adding comments
   to po/git.pot that reference the filename as e.g. add-patch.c.po
   instead of the correct add-patch.c.
   So while it sucks to have a pretty.c file in .build/ that's really
   just a partial *.po instead of one with a *.po extension the whole
   excercise of us sub-shelling into .build/pot/ etc. is to work around
   msgcat's and xgettext's lack specifying a custom "trust me, this is
   the filename", so we should make it *.c again.
   (We could also post-munge the file, but that would suck more)
 * We went a bit back & forth on the "if grep -q PRItime" part on the GH
   ticket. FWIW I still think just skipping that work is a better
   choice. Yes we'll have ~10MB of redundant files in .build, and it's
   marginally slower, but "make pot" isn't a hot target, better to
   optimize for simplicity.
   But if you're really set on having it I don't mind...
 * You add a "MSGCAT_FLAGS = --sort-by-file" here, maybe worth having
   some "common" flags variable in the earlier commit we can use here?
   I.e. share --sort-by-file with xgettext.
 * Your version is missing FORCE on po/git.pot, which is a bug. We can't
   omit it on any file that's checked in. We're about to "git rm" it
   anyway, so maybe we shouldn't worry about it though...
 * This commit breaks the non-ASCII msgid, but 4/9 is about to fix it,
   so likewise maybe not worth worrying about re-arranging them...
1:  6cf9c1f7022 ! 1:  c569d1cd688 Makefile: have "make pot" not "reset --hard"
    @@ Metadata
      ## Commit message ##
         Makefile: have "make pot" not "reset --hard"
     
    -    Change "make pot" to work on copies of the working tree files in a new
    -    ".build/pot/" directory, instead of altering them in place and doing a
    -    "reset --hard" afterwards.
    -
    -    This both speeds up the "make pot" target on an initial run, and makes
    -    it *much* faster for incremental runs, and will allow us to implement
    -    related targets in subsequent commits.
    +    Before commit fc0fd5b23b (Makefile: help gettext tools to cope with our
    +    custom PRItime format, 2017-07-20) we'd consider source files as-is
    +    with gettext, but because we need to understand PRItime in the same way
    +    that gettext itself understands PRIuMAX we'd first check if we had a
    +    clean checkout, then munge all of the processed files in-place with
    +    "sed", generate "po/git.pot", and then finally "reset --hard" to undo
    +    our changes.
    +
    +    By generating "pot" snippets in ".build/pot/po" for each source file
    +    and rewriting certain source files with PRItime macros to temporary
    +    files in ".build/pot/po", we can avoid running "make pot" by altering
    +    files in place and doing a "reset --hard" afterwards.
    +
    +    This speed of "make pot" is slower than before on an initial run,
    +    because we run "xgettext" many times (once per source file), but it
    +    can be boosted by parallelization. It is *much* faster for incremental
    +    runs, and will allow us to implement related targets in subsequent
    +    commits.
     
         When the "pot" target was originally added in cd5513a7168 (i18n:
         Makefile: "pot" target to extract messages marked for translation,
    @@ Commit message
         target, 2014-08-22) when it was made to depend on "FORCE". I.e. the
         Makefile's dependency resolution inherently can't handle incremental
         building when the target file may be updated by git (or something else
    -    external to "make").
    -
    -    So we still need a FORCE on po/git.pot, but now we'll have that target
    -    copy ".build/pot/git.pot" to "po/git.pot", and the former doesn't need
    -    FORCE.
    -
    -    I think 1f31963e921 was confused in the rationale for adding "FORCE"
    -    though, it's needed for the reasons noted above, but it's got nothing
    -    to do with how we do C compilation or find headers, which it suggest
    -    is the case. It was also made as a preparatory change for
    -    d85b0dff729 (Makefile: use `find` to determine static header
    -    dependencies, 2014-08-25).
    -
    -    Unlike the compiler, when we generate the "pot "file we won't recurse
    -    from one header file to another, we only consider the specific targets
    -    we're given, so if we miss a bar.h included via foo.h $(LOCALIZED_C)
    -    the FORCE won't help us.
    +    external to "make"). But this case no longer applies, so FORCE is no
    +    longer needed.
     
         That out of the way, the main logic change here is getting rid of the
         "reset --hard":
     
    -    Before fc0fd5b23bc we'd consider source files as-is with gettext, but
    -    because we need to understand PRItime in the same way that gettext
    -    itself understands PRIuMAX we'd first check if we had a clean
    -    checkout, then munge all of the processed files in-place with "sed",
    -    generate "po/git.pot, and then finally "reset --hard" to undo our
    -    changes.
    -
    -    We didn't need to do this for the *.perl and *.sh files, so let's
    -    skip that and only do it for the *.[ch] files.
    -
    -    Let's then create these munged *.[ch] files in a tree in .build/pot/"
    -    corresponding to our source tree, and have "xgettext" consider
    -    those. The rule needs to be careful to "(cd .build/pot && ...)",
    -    because otherwise the comments in the po/git.pot file wouldn't refer
    -    to the correct source locations (they'd be prefixed with
    -    ".build/git/").
    -
    -    We'll then generate intermediate .build/pot/po/% files from %, which
    -    is handy to see at a glance what strings (if any) in a given file are
    +    We'll generate intermediate .build/pot/po/%.po files from %, which is
    +    handy to see at a glance what strings (if any) in a given file are
         marked for translation:
     
    -            $ make .build/pot/po/pretty.c
    +            $ make .build/pot/po/pretty.c.po
                 [...]
    -            $ cat .build/pot/po/pretty.c
    +            $ cat .build/pot/po/pretty.c.po
                 #: pretty.c:1051
                 msgid "unable to parse --pretty format"
                 msgstr ""
                 $
     
    +    For these C source files which contain the PRItime macros, we will
    +    create temporary munged *.c files in a tree in ".build/pot/po"
    +    corresponding to our source tree, and have "xgettext" consider those.
    +    The rule needs to be careful to "(cd .build/pot/po && ...)", because
    +    otherwise the comments in the po/git.pot file wouldn't refer to the
    +    correct source locations (they'd be prefixed with ".build/pot/po").
    +
         This changes the output of the generated po/git.pot file in one minor
         way: Because we're using msgcat(1) instead of xgettext(1) to
         concatenate the output we'll now disambiguate where "TRANSLATORS"
    @@ Commit message
         different. E.g. for the "Your edited hunk[...]" message we'll now
         apply this change (comment content elided):
     
    -            +#. #-#-#-#-#  add-patch.c  #-#-#-#-#
    +            +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
                  #. TRANSLATORS: do not translate [y/n]
                 [...]
    -            +#. #-#-#-#-#  git-add--interactive.perl  #-#-#-#-#
    +            +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
                  #. TRANSLATORS: do not translate [y/n]
                 [...]
                  #: add-patch.c:1253 git-add--interactive.perl:1244
    @@ Commit message
                  "Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
                  msgstr ""
     
    -    There are three such changes, and they all make the context more
    +    There are six such changes, and they all make the context more
         understandable, as msgcat(1) is better at handling these edge cases
         than xgettext(1)'s previously used "--join-existing" flag.
     
    -    The removal of the "--msgid-bugs-address" here and the addition of
    -    "--omit-header" and ".build/pot/pot.header" is because we'll now
    -    always carry forward the existing po/git.pot header.
    +    While we could rename the "pot" snippets without the ".po" extention
    +    to use more intuitive filenames in the comments, but that will
    +    confuse the IDE with lots of invalid C or perl source files in
    +    ".build/pot/po" directory.
     
    -    We'd previously generate the header with xgettext(1), but now we'll be
    -    carrying forward whatever header we find in po/git.pot. Right now this
    -    doesn't matter, we'll even update the timestamp in the header as
    -    before when running "make pot".
    +    The addition of "--omit-header" option for xgettext makes the "pot"
    +    snippets in ".build/pot/po/*.po" smaller. For the pot header of
    +    "po/git.pot", we use xgettext to generate a "pot" header file
    +    ".build/pot/git.header" from an empty file at runtime, and use this
    +    header to assemble "po/git.pot".
     
    -    But as we'll see in a subsequent commit our previous header behavior
    -    has been hiding an encoding-related bug from us, so let's carry it
    -    forward instead of re-generating it with xgettext(1).
    +    But as we'll see in a subsequent commit this header behavior has been
    +    hiding an encoding-related bug from us, so let's carry it forward
    +    instead of re-generating it with xgettext(1).
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    +    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## .gitignore ##
     @@
    @@ .gitignore
      *.gcno
     
      ## Makefile ##
    -@@ Makefile: pdf:
    - XGETTEXT_FLAGS = \
    +@@ Makefile: INSTALL = install
    + TCL_PATH = tclsh
    + TCLTK_PATH = wish
    + XGETTEXT = xgettext
    ++MSGCAT = msgcat
    + MSGFMT = msgfmt
    + CURL_CONFIG = curl-config
    + GCOV = gcov
    +@@ Makefile: XGETTEXT_FLAGS = \
      	--force-po \
      	--add-comments=TRANSLATORS: \
    --	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    --	--from-code=UTF-8
    -+	--from-code=UTF-8 \
    -+	--omit-header
    -+
    + 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    ++	--package-name=Git \
    + 	--sort-by-file \
    + 	--from-code=UTF-8
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    - 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
    - XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    +@@ Makefile: XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    + 	--keyword=gettextln --keyword=eval_gettextln
    + XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
    + 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
    ++MSGCAT_FLAGS = --sort-by-file
    + LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
    + 	      $(FOUND_H_SOURCES) $(GENERATED_H)
    + LOCALIZED_SH = $(SCRIPT_SH)
     @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
      LOCALIZED_PERL += t/t0200/test.perl
      endif
    @@ Makefile: LOCALIZED_SH += t/t0200/test.sh
     -## under a very controlled condition, i.e. (1) it is to be run in a
     -## Git repository (not a tarball extract), (2) any local modifications
     -## will be lost.
    -+## We generate intermediate .build/pot/po/% files containing a extract
    -+## of the translations we find in each file in the source tree. The
    -+## files have the same basename as the source due xgettext(1) not
    -+## having a way to override the basename inserted into comments.
    ++## We generate intermediate .build/pot/po/%.po files containing a
    ++## extract of the translations we find in each file in the source
    ++## tree. We will assemble them using msgcat to create the final
    ++## "po/git.pot" file.
     +LOCALIZED_ALL_GEN_PO =
     +
    -+LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%)
    ++LOCALIZED_C_GEN_PO = $(LOCALIZED_C:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_C_GEN_PO)
     +
    -+LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%)
    ++LOCALIZED_SH_GEN_PO = $(LOCALIZED_SH:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_SH_GEN_PO)
     +
    -+LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%)
    ++LOCALIZED_PERL_GEN_PO = $(LOCALIZED_PERL:%=.build/pot/po/%.po)
     +LOCALIZED_ALL_GEN_PO += $(LOCALIZED_PERL_GEN_PO)
     +
      ## Gettext tools cannot work with our own custom PRItime type, so
      ## we replace PRItime with PRIuMAX.  We need to update this to
      ## PRIdMAX if we switch to a signed type later.
    -+LOCALIZED_C_GEN	= $(LOCALIZED_C:%=.build/pot/in/%)
    -+$(LOCALIZED_C_GEN): .build/pot/in/%: %
    ++$(LOCALIZED_C_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_GEN)sed -e 's|PRItime|PRIuMAX|g' <$< >$@
    -+
    -+$(LOCALIZED_C_GEN_PO): .build/pot/po/%: .build/pot/in/%
    -+	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)(\
    -+		cd .build/pot/in && \
    -+		$(XGETTEXT) -o $(@:.build/pot/po/%=../po/%) \
    -+			$(XGETTEXT_FLAGS_C) \
    -+			$(<:.build/pot/in/%=%) \
    -+	)
    ++	$(QUIET_XGETTEXT) \
    ++	    if grep -q PRItime $<; then \
    ++		(\
    ++			sed -e 's|PRItime|PRIuMAX|g' <$< \
    ++				>.build/pot/po/$< && \
    ++			cd .build/pot/po && \
    ++			$(XGETTEXT) --omit-header \
    ++				-o $(@:.build/pot/po/%=%) \
    ++				$(XGETTEXT_FLAGS_C) $< && \
    ++			rm $<; \
    ++		); \
    ++	    else \
    ++		$(XGETTEXT) --omit-header \
    ++			-o $@ $(XGETTEXT_FLAGS_C) $<; \
    ++	    fi
      
     -po/git.pot: $(GENERATED_H) FORCE
     -	# All modifications will be reverted at the end, so we do not
     -	# want to have any local change.
     -	git diff --quiet HEAD && git diff --quiet --cached
    -+$(LOCALIZED_SH_GEN_PO): .build/pot/po/%: %
    ++$(LOCALIZED_SH_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_SH) $<
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
    ++		-o$@ $(XGETTEXT_FLAGS_SH) $<
      
     -	@for s in $(LOCALIZED_C) $(LOCALIZED_SH) $(LOCALIZED_PERL); \
     -	do \
     -		sed -e 's|PRItime|PRIuMAX|g' <"$$s" >"$$s+" && \
     -		cat "$$s+" >"$$s" && rm "$$s+"; \
     -	done
    -+$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%: %
    -+	$(call mkdir_p_parent_template)
    -+	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@ $(XGETTEXT_FLAGS_PERL) $<
    -+
    -+.build/pot/pot.header:
    ++$(LOCALIZED_PERL_GEN_PO): .build/pot/po/%.po: %
     +	$(call mkdir_p_parent_template)
    -+	$(QUIET_GEN)sed -n -e '/^$$/q' -e 'p' <po/git.pot >$@
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) --omit-header \
    ++		-o$@ $(XGETTEXT_FLAGS_PERL) $<
      
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ $(XGETTEXT_FLAGS_C) $(LOCALIZED_C)
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_SH) \
     -		$(LOCALIZED_SH)
     -	$(QUIET_XGETTEXT)$(XGETTEXT) -o$@+ --join-existing $(XGETTEXT_FLAGS_PERL) \
     -		$(LOCALIZED_PERL)
    -+.build/pot/git.pot: .build/pot/pot.header $(LOCALIZED_ALL_GEN_PO)
    -+	$(QUIET_GEN)msgcat $^ >$@
    ++.build/pot/git.header: $(LOCALIZED_ALL_GEN_PO)
    ++	$(call mkdir_p_parent_template)
    ++	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
    ++		-o - /dev/null | \
    ++	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
    ++	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
      
     -	# Reverting the munged source, leaving only the updated $@
     -	git reset --hard
     -	mv $@+ $@
    -+po/git.pot: .build/pot/git.pot FORCE
    -+	$(QUIET_CP)cp $< $@
    ++po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
    ++	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
      
      .PHONY: pot
      pot: po/git.pot
    @@ Makefile: cocciclean:
      	$(RM) *.res
      	$(RM) $(OBJECTS)
      	$(RM) $(LIB_FILE) $(XDIFF_LIB) $(REFTABLE_LIB) $(REFTABLE_TEST_LIB)
    -
    - ## shared.mak ##
    -@@ shared.mak: ifndef V
    - 	QUIET_AR       = @echo '   ' AR $@;
    - 	QUIET_LINK     = @echo '   ' LINK $@;
    - 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
    -+	QUIET_CP       = @echo '   ' CP $@;
    - 	QUIET_LNCP     = @echo '   ' LN/CP $@;
    - 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
    - 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
Jiang Xin· May 19, 2022, 13:19 UTC · re: Ævar Arnfjörð Bjarmason · lore

Re: [PATCH v2 3/9] Makefile: have "make pot" not "reset --hard"

On Thu, May 19, 2022 at 5:53 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:

Show 11 quoted lines
> In the previous discussion of kicking things around I lost track of what
> version of mine this is picked up from, but I range-diff'd it to my
> 6cf9c1f7022 (Makefile: have "make pot" not "reset --hard", 2022-04-02),
> which is the latest I had in avar/Makefile-incremental-po-git-pot-rule
> on my branch.
>
> A range-diff of the two follows below (yours being the RHS). Some
> comments:
>
>  * There's a bug here where you're creating .build/pot/po/pretty.c.po
>    files, not .build/pot/po/pretty.c, i.e. you add a *.po extension.

In the original version of your commit, each source file has a duplicate version in the ".build/" directory, and this will confuse IDE (E.g.: VS Code) when I jump to a function declaration.

Name the "pot" snippets with the ".po" extension only have the following side effect, nothing else:

            +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
             #. TRANSLATORS: do not translate [y/n]
            [...]
            +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#
I add some notes in commit message:
    While we could rename the "pot" snippets without the ".po" extension
    to use more intuitive filenames in the comments, but that will
    confuse the IDE with lots of invalid C or perl source files in
    ".build/pot/po" directory.
>  * We went a bit back & forth on the "if grep -q PRItime" part on the GH
>    ticket. FWIW I still think just skipping that work is a better
>    choice. Yes we'll have ~10MB of redundant files in .build, and it's
Redundant source files (*.c, *.h, *.perl) in .build will make IDE mad.
Show 12 quoted lines
>    marginally slower, but "make pot" isn't a hot target, better to
>    optimize for simplicity.
>
>    But if you're really set on having it I don't mind...
>
>  * You add a "MSGCAT_FLAGS = --sort-by-file" here, maybe worth having
>    some "common" flags variable in the earlier commit we can use here?
>    I.e. share --sort-by-file with xgettext.
>
>  * Your version is missing FORCE on po/git.pot, which is a bug. We can't
>    omit it on any file that's checked in. We're about to "git rm" it
>    anyway, so maybe we shouldn't worry about it though...

I'm confused. Since the "po/git.pot" target has a full set of prerequisites, it is fine to remove FORCE from dependence.

Ævar Arnfjörð Bjarmason· May 19, 2022, 14:06 UTC · re: Jiang Xin · lore

Re: [PATCH v2 3/9] Makefile: have "make pot" not "reset --hard"

On Thu, May 19 2022, Jiang Xin wrote:
Show 25 quoted lines
> On Thu, May 19, 2022 at 5:53 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> In the previous discussion of kicking things around I lost track of what
>> version of mine this is picked up from, but I range-diff'd it to my
>> 6cf9c1f7022 (Makefile: have "make pot" not "reset --hard", 2022-04-02),
>> which is the latest I had in avar/Makefile-incremental-po-git-pot-rule
>> on my branch.
>>
>> A range-diff of the two follows below (yours being the RHS). Some
>> comments:
>>
>>  * There's a bug here where you're creating .build/pot/po/pretty.c.po
>>    files, not .build/pot/po/pretty.c, i.e. you add a *.po extension.
>
> In the original version of your commit, each source file has a
> duplicate version in the ".build/" directory, and this will confuse
> IDE (E.g.: VS Code) when I jump to a function declaration.
>
> Name the "pot" snippets with the ".po" extension only have the
> following side effect, nothing else:
>
>             +#. #-#-#-#-#  add-patch.c.po  #-#-#-#-#
>              #. TRANSLATORS: do not translate [y/n]
>             [...]
>             +#. #-#-#-#-#  git-add--interactive.perl.po  #-#-#-#-#

I don't think we should sacrifice correctness for such an IDE workaround, which surely will just bite someone else in a different way. I.e. now if I'm auto-completing .po<TAB> in a hypothetical naïve IDE that's looking in .build/ I'll get these built files instead.

The right solution in both cases being that the IDE in question should be ignoring things covered by .gitignore, or perhaps we could ship something in contrib/ for specific IDEs?

There's also an easy workaround we can do on the GNU make side. Unless you mark files as PRECIOUS it'll delete files that are only used for intermediate targets.

We could thus make the chain e.g.:
    git.c -> .build/pot/po/git.c -> .build/pot/po/git.c.done 
Instead of:
    git.c -> .build/pot/po/git.c -> .build/pot/po/git.c.done

Where the only point of the ".build/pot/po/git.c.done" is to have make delete the intermediate file as soon as it's done with it.

Or, since the comments all start with #. or #: we could post-munge them with "sed" I guess.

Show 6 quoted lines
> I add some notes in commit message:
>
>     While we could rename the "pot" snippets without the ".po" extension
>     to use more intuitive filenames in the comments, but that will
>     confuse the IDE with lots of invalid C or perl source files in
>     ".build/pot/po" directory.

Ah, I see that after you pointed out. I'd skimmed entirely over the commit message thinking it must have been something I wrote, and didn't notice that edit. Sorry.

Show 5 quoted lines
>>  * We went a bit back & forth on the "if grep -q PRItime" part on the GH
>>    ticket. FWIW I still think just skipping that work is a better
>>    choice. Yes we'll have ~10MB of redundant files in .build, and it's
>
> Redundant source files (*.c, *.h, *.perl) in .build will make IDE mad.
Hopefully we can have our cake & eat it too here, per the above. 
Show 15 quoted lines
>>    marginally slower, but "make pot" isn't a hot target, better to
>>    optimize for simplicity.
>>
>>    But if you're really set on having it I don't mind...
>>
>>  * You add a "MSGCAT_FLAGS = --sort-by-file" here, maybe worth having
>>    some "common" flags variable in the earlier commit we can use here?
>>    I.e. share --sort-by-file with xgettext.
>>
>>  * Your version is missing FORCE on po/git.pot, which is a bug. We can't
>>    omit it on any file that's checked in. We're about to "git rm" it
>>    anyway, so maybe we shouldn't worry about it though...
>
> I'm confused. Since the "po/git.pot" target has a full set of
> prerequisites, it is fine to remove FORCE from dependence.
At this point in the series po/git.pot is still a file tracked by git.
Thus:
    make pot
    git reset --hard HEAD^
    make pot

Or whatever will report that there's nothing to do, since the timestamp of the "generated" file will be newer than that of what it depends on.

That's why my version pulled that dance with having the .build/pot/git.pot be non-FORCE and the po/git.pot be FORCE until it was git rm'd.

Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 5/9] po/git.pot: this is now a generated file

From: Junio C Hamano <gitster@pobox.com>
---
 po/git.pot | 25151 ---------------------------------------------------
 1 file changed, 25151 deletions(-)
 delete mode 100644 po/git.pot
Show changes to po/git.pot +0 −9452
diff --git a/po/git.pot b/po/git.pot
deleted file mode 100644
index 054cb99c06..0000000000
--- a/po/git.pot
+++ /dev/null
@@ -1,25151 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2022-04-13 14:52+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-
-#: add-interactive.c:382
-#, c-format
-msgid "Huh (%s)?"
-msgstr ""
-
-#: add-interactive.c:535 add-interactive.c:836 reset.c:136 sequencer.c:3505
-#: sequencer.c:3970 sequencer.c:4127 builtin/rebase.c:1261
-#: builtin/rebase.c:1671
-msgid "could not read index"
-msgstr ""
-
-#: add-interactive.c:590 git-add--interactive.perl:269
-#: git-add--interactive.perl:294
-msgid "binary"
-msgstr ""
-
-#: add-interactive.c:648 git-add--interactive.perl:278
-#: git-add--interactive.perl:332
-msgid "nothing"
-msgstr ""
-
-#: add-interactive.c:649 git-add--interactive.perl:314
-#: git-add--interactive.perl:329
-msgid "unchanged"
-msgstr ""
-
-#: add-interactive.c:686 git-add--interactive.perl:641
-msgid "Update"
-msgstr ""
-
-#: add-interactive.c:703 add-interactive.c:891
-#, c-format
-msgid "could not stage '%s'"
-msgstr ""
-
-#: add-interactive.c:709 add-interactive.c:898 reset.c:160 sequencer.c:3709
-msgid "could not write index"
-msgstr ""
-
-#: add-interactive.c:712 git-add--interactive.perl:626
-#, c-format, perl-format
-msgid "updated %d path\n"
-msgid_plural "updated %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:730 git-add--interactive.perl:676
-#, c-format, perl-format
-msgid "note: %s is untracked now.\n"
-msgstr ""
-
-#: add-interactive.c:735 apply.c:4133 builtin/checkout.c:311
-#: builtin/reset.c:167
-#, c-format
-msgid "make_cache_entry failed for path '%s'"
-msgstr ""
-
-#: add-interactive.c:765 git-add--interactive.perl:653
-msgid "Revert"
-msgstr ""
-
-#: add-interactive.c:781
-msgid "Could not parse HEAD^{tree}"
-msgstr ""
-
-#: add-interactive.c:819 git-add--interactive.perl:629
-#, c-format, perl-format
-msgid "reverted %d path\n"
-msgid_plural "reverted %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:870 git-add--interactive.perl:693
-#, c-format
-msgid "No untracked files.\n"
-msgstr ""
-
-#: add-interactive.c:874 git-add--interactive.perl:687
-msgid "Add untracked"
-msgstr ""
-
-#: add-interactive.c:901 git-add--interactive.perl:623
-#, c-format, perl-format
-msgid "added %d path\n"
-msgid_plural "added %d paths\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-interactive.c:931
-#, c-format
-msgid "ignoring unmerged: %s"
-msgstr ""
-
-#: add-interactive.c:943 add-patch.c:1758 git-add--interactive.perl:1371
-#, c-format
-msgid "Only binary files changed.\n"
-msgstr ""
-
-#: add-interactive.c:945 add-patch.c:1756 git-add--interactive.perl:1373
-#, c-format
-msgid "No changes.\n"
-msgstr ""
-
-#: add-interactive.c:949 git-add--interactive.perl:1381
-msgid "Patch update"
-msgstr ""
-
-#: add-interactive.c:988 git-add--interactive.perl:1794
-msgid "Review diff"
-msgstr ""
-
-#: add-interactive.c:1016
-msgid "show paths with changes"
-msgstr ""
-
-#: add-interactive.c:1018
-msgid "add working tree state to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1020
-msgid "revert staged set of changes back to the HEAD version"
-msgstr ""
-
-#: add-interactive.c:1022
-msgid "pick hunks and update selectively"
-msgstr ""
-
-#: add-interactive.c:1024
-msgid "view diff between HEAD and index"
-msgstr ""
-
-#: add-interactive.c:1026
-msgid "add contents of untracked files to the staged set of changes"
-msgstr ""
-
-#: add-interactive.c:1034 add-interactive.c:1083
-msgid "Prompt help:"
-msgstr ""
-
-#: add-interactive.c:1036
-msgid "select a single item"
-msgstr ""
-
-#: add-interactive.c:1038
-msgid "select a range of items"
-msgstr ""
-
-#: add-interactive.c:1040
-msgid "select multiple ranges"
-msgstr ""
-
-#: add-interactive.c:1042 add-interactive.c:1087
-msgid "select item based on unique prefix"
-msgstr ""
-
-#: add-interactive.c:1044
-msgid "unselect specified items"
-msgstr ""
-
-#: add-interactive.c:1046
-msgid "choose all items"
-msgstr ""
-
-#: add-interactive.c:1048
-msgid "(empty) finish selecting"
-msgstr ""
-
-#: add-interactive.c:1085
-msgid "select a numbered item"
-msgstr ""
-
-#: add-interactive.c:1089
-msgid "(empty) select nothing"
-msgstr ""
-
-#: add-interactive.c:1097 builtin/clean.c:839 git-add--interactive.perl:1898
-msgid "*** Commands ***"
-msgstr ""
-
-#: add-interactive.c:1098 builtin/clean.c:840 git-add--interactive.perl:1895
-msgid "What now"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "staged"
-msgstr ""
-
-#: add-interactive.c:1150 git-add--interactive.perl:213
-msgid "unstaged"
-msgstr ""
-
-#: add-interactive.c:1150 apply.c:5002 apply.c:5005 builtin/am.c:2370
-#: builtin/am.c:2373 builtin/bugreport.c:107 builtin/clone.c:132
-#: builtin/fetch.c:154 builtin/merge.c:287 builtin/pull.c:194
-#: builtin/submodule--helper.c:412 builtin/submodule--helper.c:1872
-#: builtin/submodule--helper.c:1875 builtin/submodule--helper.c:2709
-#: builtin/submodule--helper.c:2712 builtin/submodule--helper.c:2891
-#: git-add--interactive.perl:213
-msgid "path"
-msgstr ""
-
-#: add-interactive.c:1157
-msgid "could not refresh index"
-msgstr ""
-
-#: add-interactive.c:1171 builtin/clean.c:804 git-add--interactive.perl:1805
-#, c-format
-msgid "Bye.\n"
-msgstr ""
-
-#: add-patch.c:34 git-add--interactive.perl:1433
-#, c-format, perl-format
-msgid "Stage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:35 git-add--interactive.perl:1434
-#, c-format, perl-format
-msgid "Stage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:36 git-add--interactive.perl:1435
-#, c-format, perl-format
-msgid "Stage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:37 git-add--interactive.perl:1436
-#, c-format, perl-format
-msgid "Stage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:39
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"staging."
-msgstr ""
-
-#: add-patch.c:42
-msgid ""
-"y - stage this hunk\n"
-"n - do not stage this hunk\n"
-"q - quit; do not stage this hunk or any of the remaining ones\n"
-"a - stage this hunk and all later hunks in the file\n"
-"d - do not stage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:56 git-add--interactive.perl:1439
-#, c-format, perl-format
-msgid "Stash mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:57 git-add--interactive.perl:1440
-#, c-format, perl-format
-msgid "Stash deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:58 git-add--interactive.perl:1441
-#, c-format, perl-format
-msgid "Stash addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:59 git-add--interactive.perl:1442
-#, c-format, perl-format
-msgid "Stash this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:61
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"stashing."
-msgstr ""
-
-#: add-patch.c:64
-msgid ""
-"y - stash this hunk\n"
-"n - do not stash this hunk\n"
-"q - quit; do not stash this hunk or any of the remaining ones\n"
-"a - stash this hunk and all later hunks in the file\n"
-"d - do not stash this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:80 git-add--interactive.perl:1445
-#, c-format, perl-format
-msgid "Unstage mode change [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:81 git-add--interactive.perl:1446
-#, c-format, perl-format
-msgid "Unstage deletion [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:82 git-add--interactive.perl:1447
-#, c-format, perl-format
-msgid "Unstage addition [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:83 git-add--interactive.perl:1448
-#, c-format, perl-format
-msgid "Unstage this hunk [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:85
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"unstaging."
-msgstr ""
-
-#: add-patch.c:88
-msgid ""
-"y - unstage this hunk\n"
-"n - do not unstage this hunk\n"
-"q - quit; do not unstage this hunk or any of the remaining ones\n"
-"a - unstage this hunk and all later hunks in the file\n"
-"d - do not unstage this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:103 git-add--interactive.perl:1451
-#, c-format, perl-format
-msgid "Apply mode change to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:104 git-add--interactive.perl:1452
-#, c-format, perl-format
-msgid "Apply deletion to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:105 git-add--interactive.perl:1453
-#, c-format, perl-format
-msgid "Apply addition to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:106 git-add--interactive.perl:1454
-#, c-format, perl-format
-msgid "Apply this hunk to index [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:108 add-patch.c:176 add-patch.c:221
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"applying."
-msgstr ""
-
-#: add-patch.c:111
-msgid ""
-"y - apply this hunk to index\n"
-"n - do not apply this hunk to index\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:126 git-add--interactive.perl:1457
-#: git-add--interactive.perl:1475
-#, c-format, perl-format
-msgid "Discard mode change from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:127 git-add--interactive.perl:1458
-#: git-add--interactive.perl:1476
-#, c-format, perl-format
-msgid "Discard deletion from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:128 git-add--interactive.perl:1459
-#: git-add--interactive.perl:1477
-#, c-format, perl-format
-msgid "Discard addition from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:129 git-add--interactive.perl:1460
-#: git-add--interactive.perl:1478
-#, c-format, perl-format
-msgid "Discard this hunk from worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:131 add-patch.c:154 add-patch.c:199
-msgid ""
-"If the patch applies cleanly, the edited hunk will immediately be marked for "
-"discarding."
-msgstr ""
-
-#: add-patch.c:134 add-patch.c:202
-msgid ""
-"y - discard this hunk from worktree\n"
-"n - do not discard this hunk from worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:149 add-patch.c:194 git-add--interactive.perl:1463
-#, c-format, perl-format
-msgid "Discard mode change from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:150 add-patch.c:195 git-add--interactive.perl:1464
-#, c-format, perl-format
-msgid "Discard deletion from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:151 add-patch.c:196 git-add--interactive.perl:1465
-#, c-format, perl-format
-msgid "Discard addition from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:152 add-patch.c:197 git-add--interactive.perl:1466
-#, c-format, perl-format
-msgid "Discard this hunk from index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:157
-msgid ""
-"y - discard this hunk from index and worktree\n"
-"n - do not discard this hunk from index and worktree\n"
-"q - quit; do not discard this hunk or any of the remaining ones\n"
-"a - discard this hunk and all later hunks in the file\n"
-"d - do not discard this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:171 add-patch.c:216 git-add--interactive.perl:1469
-#, c-format, perl-format
-msgid "Apply mode change to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:172 add-patch.c:217 git-add--interactive.perl:1470
-#, c-format, perl-format
-msgid "Apply deletion to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:173 add-patch.c:218 git-add--interactive.perl:1471
-#, c-format, perl-format
-msgid "Apply addition to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:174 add-patch.c:219 git-add--interactive.perl:1472
-#, c-format, perl-format
-msgid "Apply this hunk to index and worktree [y,n,q,a,d%s,?]? "
-msgstr ""
-
-#: add-patch.c:179
-msgid ""
-"y - apply this hunk to index and worktree\n"
-"n - do not apply this hunk to index and worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:224
-msgid ""
-"y - apply this hunk to worktree\n"
-"n - do not apply this hunk to worktree\n"
-"q - quit; do not apply this hunk or any of the remaining ones\n"
-"a - apply this hunk and all later hunks in the file\n"
-"d - do not apply this hunk or any of the later hunks in the file\n"
-msgstr ""
-
-#: add-patch.c:343
-#, c-format
-msgid "could not parse hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:362 add-patch.c:366
-#, c-format
-msgid "could not parse colored hunk header '%.*s'"
-msgstr ""
-
-#: add-patch.c:431
-msgid "could not parse diff"
-msgstr ""
-
-#: add-patch.c:450
-msgid "could not parse colored diff"
-msgstr ""
-
-#: add-patch.c:464
-#, c-format
-msgid "failed to run '%s'"
-msgstr ""
-
-#: add-patch.c:618
-msgid "mismatched output from interactive.diffFilter"
-msgstr ""
-
-#: add-patch.c:619
-msgid ""
-"Your filter must maintain a one-to-one correspondence\n"
-"between its input and output lines."
-msgstr ""
-
-#: add-patch.c:797
-#, c-format
-msgid ""
-"expected context line #%d in\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:812
-#, c-format
-msgid ""
-"hunks do not overlap:\n"
-"%.*s\n"
-"\tdoes not end with:\n"
-"%.*s"
-msgstr ""
-
-#: add-patch.c:1088 git-add--interactive.perl:1115
-msgid "Manual hunk edit mode -- see bottom for a quick guide.\n"
-msgstr ""
-
-#: add-patch.c:1092
-#, c-format
-msgid ""
-"---\n"
-"To remove '%c' lines, make them ' ' lines (context).\n"
-"To remove '%c' lines, delete them.\n"
-"Lines starting with %c will be removed.\n"
-msgstr ""
-
-#. TRANSLATORS: 'it' refers to the patch mentioned in the previous messages.
-#: add-patch.c:1106 git-add--interactive.perl:1129
-msgid ""
-"If it does not apply cleanly, you will be given an opportunity to\n"
-"edit again.  If all lines of the hunk are removed, then the edit is\n"
-"aborted and the hunk is left unchanged.\n"
-msgstr ""
-
-#: add-patch.c:1139
-msgid "could not parse hunk header"
-msgstr ""
-
-#: add-patch.c:1184
-msgid "'git apply --cached' failed"
-msgstr ""
-
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#.
-#. TRANSLATORS: do not translate [y/n]
-#. The program will only accept that input
-#. at this point.
-#. Consider translating (saying "no" discards!) as
-#. (saying "n" for "no" discards!) if the translation
-#. of the word "no" does not start with n.
-#: add-patch.c:1253 git-add--interactive.perl:1244
-msgid ""
-"Your edited hunk does not apply. Edit again (saying \"no\" discards!) [y/n]? "
-msgstr ""
-
-#: add-patch.c:1296
-msgid "The selected hunks do not apply to the index!"
-msgstr ""
-
-#: add-patch.c:1297 git-add--interactive.perl:1348
-msgid "Apply them to the worktree anyway? "
-msgstr ""
-
-#: add-patch.c:1304 git-add--interactive.perl:1351
-msgid "Nothing was applied.\n"
-msgstr ""
-
-#: add-patch.c:1361
-msgid ""
-"j - leave this hunk undecided, see next undecided hunk\n"
-"J - leave this hunk undecided, see next hunk\n"
-"k - leave this hunk undecided, see previous undecided hunk\n"
-"K - leave this hunk undecided, see previous hunk\n"
-"g - select a hunk to go to\n"
-"/ - search for a hunk matching the given regex\n"
-"s - split the current hunk into smaller hunks\n"
-"e - manually edit the current hunk\n"
-"? - print help\n"
-msgstr ""
-
-#: add-patch.c:1523 add-patch.c:1533
-msgid "No previous hunk"
-msgstr ""
-
-#: add-patch.c:1528 add-patch.c:1538
-msgid "No next hunk"
-msgstr ""
-
-#: add-patch.c:1544
-msgid "No other hunks to goto"
-msgstr ""
-
-#: add-patch.c:1555 git-add--interactive.perl:1608
-msgid "go to which hunk (<ret> to see more)? "
-msgstr ""
-
-#: add-patch.c:1556 git-add--interactive.perl:1610
-msgid "go to which hunk? "
-msgstr ""
-
-#: add-patch.c:1567
-#, c-format
-msgid "Invalid number: '%s'"
-msgstr ""
-
-#: add-patch.c:1572
-#, c-format
-msgid "Sorry, only %d hunk available."
-msgid_plural "Sorry, only %d hunks available."
-msgstr[0] ""
-msgstr[1] ""
-
-#: add-patch.c:1581
-msgid "No other hunks to search"
-msgstr ""
-
-#: add-patch.c:1587 git-add--interactive.perl:1663
-msgid "search for regex? "
-msgstr ""
-
-#: add-patch.c:1602
-#, c-format
-msgid "Malformed search regexp %s: %s"
-msgstr ""
-
-#: add-patch.c:1619
-msgid "No hunk matches the given pattern"
-msgstr ""
-
-#: add-patch.c:1626
-msgid "Sorry, cannot split this hunk"
-msgstr ""
-
-#: add-patch.c:1630
-#, c-format
-msgid "Split into %d hunks."
-msgstr ""
-
-#: add-patch.c:1634
-msgid "Sorry, cannot edit this hunk"
-msgstr ""
-
-#: add-patch.c:1686
-msgid "'git apply' failed"
-msgstr ""
-
-#: advice.c:81
-#, c-format
-msgid ""
-"\n"
-"Disable this message with \"git config advice.%s false\""
-msgstr ""
-
-#: advice.c:97
-#, c-format
-msgid "%shint: %.*s%s\n"
-msgstr ""
-
-#: advice.c:181
-msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:183
-msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:185
-msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:187
-msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:189
-msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-
-#: advice.c:191
-#, c-format
-msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-
-#: advice.c:199
-msgid ""
-"Fix them up in the work tree, and then use 'git add/rm <file>'\n"
-"as appropriate to mark resolution and make a commit."
-msgstr ""
-
-#: advice.c:207
-msgid "Exiting because of an unresolved conflict."
-msgstr ""
-
-#: advice.c:212 builtin/merge.c:1388
-msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
-
-#: advice.c:214
-msgid "Please, commit your changes before merging."
-msgstr ""
-
-#: advice.c:215
-msgid "Exiting because of unfinished merge."
-msgstr ""
-
-#: advice.c:220
-msgid "Not possible to fast-forward, aborting."
-msgstr ""
-
-#: advice.c:230
-#, c-format
-msgid ""
-"The following paths and/or pathspecs matched paths that exist\n"
-"outside of your sparse-checkout definition, so will not be\n"
-"updated in the index:\n"
-msgstr ""
-
-#: advice.c:237
-msgid ""
-"If you intend to update such entries, try one of the following:\n"
-"* Use the --sparse option.\n"
-"* Disable or modify the sparsity rules."
-msgstr ""
-
-#: advice.c:245
-#, c-format
-msgid ""
-"Note: switching to '%s'.\n"
-"\n"
-"You are in 'detached HEAD' state. You can look around, make experimental\n"
-"changes and commit them, and you can discard any commits you make in this\n"
-"state without impacting any branches by switching back to a branch.\n"
-"\n"
-"If you want to create a new branch to retain commits you create, you may\n"
-"do so (now or later) by using -c with the switch command. Example:\n"
-"\n"
-"  git switch -c <new-branch-name>\n"
-"\n"
-"Or undo this operation with:\n"
-"\n"
-"  git switch -\n"
-"\n"
-"Turn off this advice by setting config variable advice.detachedHead to "
-"false\n"
-"\n"
-msgstr ""
-
-#: alias.c:50
-msgid "cmdline ends with \\"
-msgstr ""
-
-#: alias.c:51
-msgid "unclosed quote"
-msgstr ""
-
-#: apply.c:70
-#, c-format
-msgid "unrecognized whitespace option '%s'"
-msgstr ""
-
-#: apply.c:86
-#, c-format
-msgid "unrecognized whitespace ignore option '%s'"
-msgstr ""
-
-#: apply.c:138 archive.c:584 parse-options.c:1122 range-diff.c:555
-#: revision.c:2314 revision.c:2318 revision.c:2327 revision.c:2332
-#: revision.c:2560 revision.c:2895 revision.c:2899 revision.c:2907
-#: revision.c:2910 revision.c:2912 builtin/add.c:507 builtin/add.c:509
-#: builtin/add.c:515 builtin/add.c:527 builtin/branch.c:755
-#: builtin/checkout.c:472 builtin/checkout.c:475 builtin/checkout.c:1663
-#: builtin/checkout.c:1773 builtin/checkout.c:1776 builtin/clone.c:921
-#: builtin/commit.c:359 builtin/commit.c:362 builtin/commit.c:1200
-#: builtin/commit.c:1256 builtin/commit.c:1273 builtin/describe.c:593
-#: builtin/diff-tree.c:155 builtin/difftool.c:733 builtin/fast-export.c:1245
-#: builtin/fetch.c:2141 builtin/fetch.c:2162 builtin/fetch.c:2167
-#: builtin/help.c:602 builtin/index-pack.c:1858 builtin/init-db.c:560
-#: builtin/log.c:1968 builtin/log.c:1970 builtin/ls-files.c:778
-#: builtin/merge-base.c:163 builtin/merge-base.c:169 builtin/merge.c:1409
-#: builtin/merge.c:1411 builtin/pack-objects.c:4098 builtin/push.c:592
-#: builtin/push.c:630 builtin/push.c:636 builtin/push.c:641
-#: builtin/rebase.c:1221 builtin/rebase.c:1223 builtin/rebase.c:1227
-#: builtin/repack.c:688 builtin/repack.c:719 builtin/reset.c:433
-#: builtin/reset.c:469 builtin/rev-list.c:537 builtin/show-branch.c:711
-#: builtin/stash.c:1696 builtin/stash.c:1699 builtin/submodule--helper.c:1328
-#: builtin/submodule--helper.c:3054 builtin/tag.c:527 builtin/tag.c:573
-#: builtin/worktree.c:779
-#, c-format
-msgid "options '%s' and '%s' cannot be used together"
-msgstr ""
-
-#: apply.c:141 apply.c:152 apply.c:155
-#, c-format
-msgid "'%s' outside a repository"
-msgstr ""
-
-#: apply.c:807
-#, c-format
-msgid "Cannot prepare timestamp regexp %s"
-msgstr ""
-
-#: apply.c:816
-#, c-format
-msgid "regexec returned %d for input: %s"
-msgstr ""
-
-#: apply.c:890
-#, c-format
-msgid "unable to find filename in patch at line %d"
-msgstr ""
-
-#: apply.c:928
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
-msgstr ""
-
-#: apply.c:934
-#, c-format
-msgid "git apply: bad git-diff - inconsistent new filename on line %d"
-msgstr ""
-
-#: apply.c:935
-#, c-format
-msgid "git apply: bad git-diff - inconsistent old filename on line %d"
-msgstr ""
-
-#: apply.c:940
-#, c-format
-msgid "git apply: bad git-diff - expected /dev/null on line %d"
-msgstr ""
-
-#: apply.c:969
-#, c-format
-msgid "invalid mode on line %d: %s"
-msgstr ""
-
-#: apply.c:1288
-#, c-format
-msgid "inconsistent header lines %d and %d"
-msgstr ""
-
-#: apply.c:1378
-#, c-format
-msgid ""
-"git diff header lacks filename information when removing %d leading pathname "
-"component (line %d)"
-msgid_plural ""
-"git diff header lacks filename information when removing %d leading pathname "
-"components (line %d)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:1391
-#, c-format
-msgid "git diff header lacks filename information (line %d)"
-msgstr ""
-
-#: apply.c:1487
-#, c-format
-msgid "recount: unexpected line: %.*s"
-msgstr ""
-
-#: apply.c:1556
-#, c-format
-msgid "patch fragment without header at line %d: %.*s"
-msgstr ""
-
-#: apply.c:1759
-msgid "new file depends on old contents"
-msgstr ""
-
-#: apply.c:1761
-msgid "deleted file still has contents"
-msgstr ""
-
-#: apply.c:1795
-#, c-format
-msgid "corrupt patch at line %d"
-msgstr ""
-
-#: apply.c:1832
-#, c-format
-msgid "new file %s depends on old contents"
-msgstr ""
-
-#: apply.c:1834
-#, c-format
-msgid "deleted file %s still has contents"
-msgstr ""
-
-#: apply.c:1837
-#, c-format
-msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
-
-#: apply.c:1985
-#, c-format
-msgid "corrupt binary patch at line %d: %.*s"
-msgstr ""
-
-#: apply.c:2022
-#, c-format
-msgid "unrecognized binary patch at line %d"
-msgstr ""
-
-#: apply.c:2184
-#, c-format
-msgid "patch with only garbage at line %d"
-msgstr ""
-
-#: apply.c:2270
-#, c-format
-msgid "unable to read symlink %s"
-msgstr ""
-
-#: apply.c:2274
-#, c-format
-msgid "unable to open or read %s"
-msgstr ""
-
-#: apply.c:2943
-#, c-format
-msgid "invalid start of line: '%c'"
-msgstr ""
-
-#: apply.c:3064
-#, c-format
-msgid "Hunk #%d succeeded at %d (offset %d line)."
-msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:3076
-#, c-format
-msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
-msgstr ""
-
-#: apply.c:3082
-#, c-format
-msgid ""
-"while searching for:\n"
-"%.*s"
-msgstr ""
-
-#: apply.c:3104
-#, c-format
-msgid "missing binary patch data for '%s'"
-msgstr ""
-
-#: apply.c:3112
-#, c-format
-msgid "cannot reverse-apply a binary patch without the reverse hunk to '%s'"
-msgstr ""
-
-#: apply.c:3159
-#, c-format
-msgid "cannot apply binary patch to '%s' without full index line"
-msgstr ""
-
-#: apply.c:3170
-#, c-format
-msgid ""
-"the patch applies to '%s' (%s), which does not match the current contents."
-msgstr ""
-
-#: apply.c:3178
-#, c-format
-msgid "the patch applies to an empty '%s' but it is not empty"
-msgstr ""
-
-#: apply.c:3196
-#, c-format
-msgid "the necessary postimage %s for '%s' cannot be read"
-msgstr ""
-
-#: apply.c:3209
-#, c-format
-msgid "binary patch does not apply to '%s'"
-msgstr ""
-
-#: apply.c:3216
-#, c-format
-msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
-msgstr ""
-
-#: apply.c:3237
-#, c-format
-msgid "patch failed: %s:%ld"
-msgstr ""
-
-#: apply.c:3360
-#, c-format
-msgid "cannot checkout %s"
-msgstr ""
-
-#: apply.c:3412 apply.c:3423 apply.c:3469 midx.c:105 pack-revindex.c:214
-#: setup.c:310
-#, c-format
-msgid "failed to read %s"
-msgstr ""
-
-#: apply.c:3420
-#, c-format
-msgid "reading from '%s' beyond a symbolic link"
-msgstr ""
-
-#: apply.c:3449 apply.c:3721
-#, c-format
-msgid "path %s has been renamed/deleted"
-msgstr ""
-
-#: apply.c:3559 apply.c:3736
-#, c-format
-msgid "%s: does not exist in index"
-msgstr ""
-
-#: apply.c:3568 apply.c:3744 apply.c:3960
-#, c-format
-msgid "%s: does not match index"
-msgstr ""
-
-#: apply.c:3605
-msgid "repository lacks the necessary blob to perform 3-way merge."
-msgstr ""
-
-#: apply.c:3608
-#, c-format
-msgid "Performing three-way merge...\n"
-msgstr ""
-
-#: apply.c:3624 apply.c:3628
-#, c-format
-msgid "cannot read the current contents of '%s'"
-msgstr ""
-
-#: apply.c:3640
-#, c-format
-msgid "Failed to perform three-way merge...\n"
-msgstr ""
-
-#: apply.c:3654
-#, c-format
-msgid "Applied patch to '%s' with conflicts.\n"
-msgstr ""
-
-#: apply.c:3659
-#, c-format
-msgid "Applied patch to '%s' cleanly.\n"
-msgstr ""
-
-#: apply.c:3676
-#, c-format
-msgid "Falling back to direct application...\n"
-msgstr ""
-
-#: apply.c:3688
-msgid "removal patch leaves file contents"
-msgstr ""
-
-#: apply.c:3761
-#, c-format
-msgid "%s: wrong type"
-msgstr ""
-
-#: apply.c:3763
-#, c-format
-msgid "%s has type %o, expected %o"
-msgstr ""
-
-#: apply.c:3900 apply.c:3902 read-cache.c:903 read-cache.c:932
-#: read-cache.c:1399
-#, c-format
-msgid "invalid path '%s'"
-msgstr ""
-
-#: apply.c:3958
-#, c-format
-msgid "%s: already exists in index"
-msgstr ""
-
-#: apply.c:3962
-#, c-format
-msgid "%s: already exists in working directory"
-msgstr ""
-
-#: apply.c:3982
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o)"
-msgstr ""
-
-#: apply.c:3987
-#, c-format
-msgid "new mode (%o) of %s does not match old mode (%o) of %s"
-msgstr ""
-
-#: apply.c:4007
-#, c-format
-msgid "affected file '%s' is beyond a symbolic link"
-msgstr ""
-
-#: apply.c:4011
-#, c-format
-msgid "%s: patch does not apply"
-msgstr ""
-
-#: apply.c:4026
-#, c-format
-msgid "Checking patch %s..."
-msgstr ""
-
-#: apply.c:4118
-#, c-format
-msgid "sha1 information is lacking or useless for submodule %s"
-msgstr ""
-
-#: apply.c:4125
-#, c-format
-msgid "mode change for %s, which is not in current HEAD"
-msgstr ""
-
-#: apply.c:4128
-#, c-format
-msgid "sha1 information is lacking or useless (%s)."
-msgstr ""
-
-#: apply.c:4137
-#, c-format
-msgid "could not add %s to temporary index"
-msgstr ""
-
-#: apply.c:4147
-#, c-format
-msgid "could not write temporary index to %s"
-msgstr ""
-
-#: apply.c:4285
-#, c-format
-msgid "unable to remove %s from index"
-msgstr ""
-
-#: apply.c:4319
-#, c-format
-msgid "corrupt patch for submodule %s"
-msgstr ""
-
-#: apply.c:4325
-#, c-format
-msgid "unable to stat newly created file '%s'"
-msgstr ""
-
-#: apply.c:4333
-#, c-format
-msgid "unable to create backing store for newly created file %s"
-msgstr ""
-
-#: apply.c:4339 apply.c:4484
-#, c-format
-msgid "unable to add cache entry for %s"
-msgstr ""
-
-#: apply.c:4382 builtin/bisect--helper.c:540 builtin/gc.c:2258
-#: builtin/gc.c:2293
-#, c-format
-msgid "failed to write to '%s'"
-msgstr ""
-
-#: apply.c:4386
-#, c-format
-msgid "closing file '%s'"
-msgstr ""
-
-#: apply.c:4456
-#, c-format
-msgid "unable to write file '%s' mode %o"
-msgstr ""
-
-#: apply.c:4554
-#, c-format
-msgid "Applied patch %s cleanly."
-msgstr ""
-
-#: apply.c:4562
-msgid "internal error"
-msgstr ""
-
-#: apply.c:4565
-#, c-format
-msgid "Applying patch %%s with %d reject..."
-msgid_plural "Applying patch %%s with %d rejects..."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4576
-#, c-format
-msgid "truncating .rej filename to %.*s.rej"
-msgstr ""
-
-#: apply.c:4584
-#, c-format
-msgid "cannot open %s"
-msgstr ""
-
-#: apply.c:4598
-#, c-format
-msgid "Hunk #%d applied cleanly."
-msgstr ""
-
-#: apply.c:4602
-#, c-format
-msgid "Rejected hunk #%d."
-msgstr ""
-
-#: apply.c:4731
-#, c-format
-msgid "Skipped patch '%s'."
-msgstr ""
-
-#: apply.c:4740
-msgid "No valid patches in input (allow with \"--allow-empty\")"
-msgstr ""
-
-#: apply.c:4761
-msgid "unable to read index file"
-msgstr ""
-
-#: apply.c:4918
-#, c-format
-msgid "can't open patch '%s': %s"
-msgstr ""
-
-#: apply.c:4945
-#, c-format
-msgid "squelched %d whitespace error"
-msgid_plural "squelched %d whitespace errors"
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4951 apply.c:4966
-#, c-format
-msgid "%d line adds whitespace errors."
-msgid_plural "%d lines add whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4959
-#, c-format
-msgid "%d line applied after fixing whitespace errors."
-msgid_plural "%d lines applied after fixing whitespace errors."
-msgstr[0] ""
-msgstr[1] ""
-
-#: apply.c:4975 builtin/add.c:690 builtin/mv.c:338 builtin/rm.c:430
-msgid "Unable to write new index file"
-msgstr ""
-
-#: apply.c:5003
-msgid "don't apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5006
-msgid "apply changes matching the given path"
-msgstr ""
-
-#: apply.c:5008 builtin/am.c:2379
-msgid "num"
-msgstr ""
-
-#: apply.c:5009
-msgid "remove <num> leading slashes from traditional diff paths"
-msgstr ""
-
-#: apply.c:5012
-msgid "ignore additions made by the patch"
-msgstr ""
-
-#: apply.c:5014
-msgid "instead of applying the patch, output diffstat for the input"
-msgstr ""
-
-#: apply.c:5018
-msgid "show number of added and deleted lines in decimal notation"
-msgstr ""
-
-#: apply.c:5020
-msgid "instead of applying the patch, output a summary for the input"
-msgstr ""
-
-#: apply.c:5022
-msgid "instead of applying the patch, see if the patch is applicable"
-msgstr ""
-
-#: apply.c:5024
-msgid "make sure the patch is applicable to the current index"
-msgstr ""
-
-#: apply.c:5026
-msgid "mark new files with `git add --intent-to-add`"
-msgstr ""
-
-#: apply.c:5028
-msgid "apply a patch without touching the working tree"
-msgstr ""
-
-#: apply.c:5030
-msgid "accept a patch that touches outside the working area"
-msgstr ""
-
-#: apply.c:5033
-msgid "also apply the patch (use with --stat/--summary/--check)"
-msgstr ""
-
-#: apply.c:5035
-msgid "attempt three-way merge, fall back on normal patch if that fails"
-msgstr ""
-
-#: apply.c:5037
-msgid "build a temporary index based on embedded index information"
-msgstr ""
-
-#: apply.c:5040 builtin/checkout-index.c:230
-msgid "paths are separated with NUL character"
-msgstr ""
-
-#: apply.c:5042
-msgid "ensure at least <n> lines of context match"
-msgstr ""
-
-#: apply.c:5043 builtin/am.c:2355 builtin/am.c:2358
-#: builtin/interpret-trailers.c:98 builtin/interpret-trailers.c:100
-#: builtin/interpret-trailers.c:102 builtin/pack-objects.c:3983
-#: builtin/rebase.c:1079
-msgid "action"
-msgstr ""
-
-#: apply.c:5044
-msgid "detect new or modified lines that have whitespace errors"
-msgstr ""
-
-#: apply.c:5047 apply.c:5050
-msgid "ignore changes in whitespace when finding context"
-msgstr ""
-
-#: apply.c:5053
-msgid "apply the patch in reverse"
-msgstr ""
-
-#: apply.c:5055
-msgid "don't expect at least one line of context"
-msgstr ""
-
-#: apply.c:5057
-msgid "leave the rejected hunks in corresponding *.rej files"
-msgstr ""
-
-#: apply.c:5059
-msgid "allow overlapping hunks"
-msgstr ""
-
-#: apply.c:5062
-msgid "tolerate incorrectly detected missing new-line at the end of file"
-msgstr ""
-
-#: apply.c:5065
-msgid "do not trust the line counts in the hunk headers"
-msgstr ""
-
-#: apply.c:5067 builtin/am.c:2367
-msgid "root"
-msgstr ""
-
-#: apply.c:5068
-msgid "prepend <root> to all filenames"
-msgstr ""
-
-#: apply.c:5071
-msgid "don't return error for empty patches"
-msgstr ""
-
-#: archive-tar.c:125 archive-zip.c:346
-#, c-format
-msgid "cannot stream blob %s"
-msgstr ""
-
-#: archive-tar.c:265 archive-zip.c:359
-#, c-format
-msgid "unsupported file mode: 0%o (SHA1: %s)"
-msgstr ""
-
-#: archive-tar.c:447
-#, c-format
-msgid "unable to start '%s' filter"
-msgstr ""
-
-#: archive-tar.c:450
-msgid "unable to redirect descriptor"
-msgstr ""
-
-#: archive-tar.c:457
-#, c-format
-msgid "'%s' filter reported error"
-msgstr ""
-
-#: archive-zip.c:319
-#, c-format
-msgid "path is not valid UTF-8: %s"
-msgstr ""
-
-#: archive-zip.c:323
-#, c-format
-msgid "path too long (%d chars, SHA1: %s): %s"
-msgstr ""
-
-#: archive-zip.c:470 builtin/pack-objects.c:363 builtin/pack-objects.c:366
-#, c-format
-msgid "deflate error (%d)"
-msgstr ""
-
-#: archive-zip.c:604
-#, c-format
-msgid "timestamp too large for this system: %<PRIuMAX>"
-msgstr ""
-
-#: archive.c:14
-msgid "git archive [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:16
-msgid ""
-"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
-msgstr ""
-
-#: archive.c:17
-msgid "git archive --remote <repo> [--exec <cmd>] --list"
-msgstr ""
-
-#: archive.c:188 archive.c:341 builtin/gc.c:497 builtin/notes.c:238
-#: builtin/tag.c:579
-#, c-format
-msgid "cannot read '%s'"
-msgstr ""
-
-#: archive.c:426 builtin/add.c:214 builtin/add.c:657 builtin/rm.c:334
-#, c-format
-msgid "pathspec '%s' did not match any files"
-msgstr ""
-
-#: archive.c:450
-#, c-format
-msgid "no such ref: %.*s"
-msgstr ""
-
-#: archive.c:456
-#, c-format
-msgid "not a valid object name: %s"
-msgstr ""
-
-#: archive.c:469
-#, c-format
-msgid "not a tree object: %s"
-msgstr ""
-
-#: archive.c:481
-msgid "current working directory is untracked"
-msgstr ""
-
-#: archive.c:522
-#, c-format
-msgid "File not found: %s"
-msgstr ""
-
-#: archive.c:524
-#, c-format
-msgid "Not a regular file: %s"
-msgstr ""
-
-#: archive.c:551
-msgid "fmt"
-msgstr ""
-
-#: archive.c:551
-msgid "archive format"
-msgstr ""
-
-#: archive.c:552 builtin/log.c:1809
-msgid "prefix"
-msgstr ""
-
-#: archive.c:553
-msgid "prepend prefix to each pathname in the archive"
-msgstr ""
-
-#: archive.c:554 archive.c:557 builtin/blame.c:881 builtin/blame.c:885
-#: builtin/blame.c:886 builtin/commit-tree.c:115 builtin/config.c:135
-#: builtin/fast-export.c:1181 builtin/fast-export.c:1183
-#: builtin/fast-export.c:1187 builtin/grep.c:936 builtin/hash-object.c:104
-#: builtin/ls-files.c:654 builtin/ls-files.c:657 builtin/notes.c:410
-#: builtin/notes.c:576 builtin/read-tree.c:115 parse-options.h:195
-msgid "file"
-msgstr ""
-
-#: archive.c:555
-msgid "add untracked file to archive"
-msgstr ""
-
-#: archive.c:558 builtin/archive.c:88
-msgid "write the archive to this file"
-msgstr ""
-
-#: archive.c:560
-msgid "read .gitattributes in working directory"
-msgstr ""
-
-#: archive.c:561
-msgid "report archived files on stderr"
-msgstr ""
-
-#: archive.c:563
-msgid "set compression level"
-msgstr ""
-
-#: archive.c:566
-msgid "list supported archive formats"
-msgstr ""
-
-#: archive.c:568 builtin/archive.c:89 builtin/clone.c:122 builtin/clone.c:125
-#: builtin/submodule--helper.c:1884 builtin/submodule--helper.c:2718
-msgid "repo"
-msgstr ""
-
-#: archive.c:569 builtin/archive.c:90
-msgid "retrieve the archive from remote repository <repo>"
-msgstr ""
-
-#: archive.c:570 builtin/archive.c:91 builtin/difftool.c:708
-#: builtin/notes.c:496
-msgid "command"
-msgstr ""
-
-#: archive.c:571 builtin/archive.c:92
-msgid "path to the remote git-upload-archive command"
-msgstr ""
-
-#: archive.c:578
-msgid "Unexpected option --remote"
-msgstr ""
-
-#: archive.c:580 fetch-pack.c:300 revision.c:2914 builtin/add.c:530
-#: builtin/add.c:562 builtin/checkout.c:1782 builtin/clone.c:1099
-#: builtin/clone.c:1102 builtin/commit.c:371 builtin/fast-export.c:1230
-#: builtin/index-pack.c:1854 builtin/log.c:2140 builtin/reset.c:442
-#: builtin/reset.c:500 builtin/rm.c:281 builtin/stash.c:1708
-#: builtin/worktree.c:580 builtin/worktree.c:781 http-fetch.c:144
-#: http-fetch.c:153
-#, c-format
-msgid "the option '%s' requires '%s'"
-msgstr ""
-
-#: archive.c:582
-msgid "Unexpected option --output"
-msgstr ""
-
-#: archive.c:606
-#, c-format
-msgid "Unknown archive format '%s'"
-msgstr ""
-
-#: archive.c:615
-#, c-format
-msgid "Argument not supported for format '%s': -%d"
-msgstr ""
-
-#: attr.c:202
-#, c-format
-msgid "%.*s is not a valid attribute name"
-msgstr ""
-
-#: attr.c:363
-#, c-format
-msgid "%s not allowed: %s:%d"
-msgstr ""
-
-#: attr.c:403
-msgid ""
-"Negative patterns are ignored in git attributes\n"
-"Use '\\!' for literal leading exclamation."
-msgstr ""
-
-#: bisect.c:488
-#, c-format
-msgid "Badly quoted content in file '%s': %s"
-msgstr ""
-
-#: bisect.c:698
-#, c-format
-msgid "We cannot bisect more!\n"
-msgstr ""
-
-#: bisect.c:765
-#, c-format
-msgid "Not a valid commit name %s"
-msgstr ""
-
-#: bisect.c:790
-#, c-format
-msgid ""
-"The merge base %s is bad.\n"
-"This means the bug has been fixed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:795
-#, c-format
-msgid ""
-"The merge base %s is new.\n"
-"The property has changed between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:800
-#, c-format
-msgid ""
-"The merge base %s is %s.\n"
-"This means the first '%s' commit is between %s and [%s].\n"
-msgstr ""
-
-#: bisect.c:808
-#, c-format
-msgid ""
-"Some %s revs are not ancestors of the %s rev.\n"
-"git bisect cannot work properly in this case.\n"
-"Maybe you mistook %s and %s revs?\n"
-msgstr ""
-
-#: bisect.c:821
-#, c-format
-msgid ""
-"the merge base between %s and [%s] must be skipped.\n"
-"So we cannot be sure the first %s commit is between %s and %s.\n"
-"We continue anyway."
-msgstr ""
-
-#: bisect.c:860
-#, c-format
-msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
-
-#: bisect.c:910
-#, c-format
-msgid "a %s revision is needed"
-msgstr ""
-
-#: bisect.c:940
-#, c-format
-msgid "could not create file '%s'"
-msgstr ""
-
-#: bisect.c:986 builtin/merge.c:155
-#, c-format
-msgid "could not read file '%s'"
-msgstr ""
-
-#: bisect.c:1026
-msgid "reading bisect refs failed"
-msgstr ""
-
-#: bisect.c:1056
-#, c-format
-msgid "%s was both %s and %s\n"
-msgstr ""
-
-#: bisect.c:1065
-#, c-format
-msgid ""
-"No testable commit found.\n"
-"Maybe you started with bad path arguments?\n"
-msgstr ""
-
-#: bisect.c:1094
-#, c-format
-msgid "(roughly %d step)"
-msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: the last %s will be replaced with "(roughly %d
-#. steps)" translation.
-#.
-#: bisect.c:1100
-#, c-format
-msgid "Bisecting: %d revision left to test after this %s\n"
-msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: blame.c:2773
-msgid "--contents and --reverse do not blend well."
-msgstr ""
-
-#: blame.c:2787
-msgid "cannot use --contents with final commit object name"
-msgstr ""
-
-#: blame.c:2808
-msgid "--reverse and --first-parent together require specified latest commit"
-msgstr ""
-
-#: blame.c:2817 bundle.c:231 midx.c:1058 ref-filter.c:2371 remote.c:2157
-#: sequencer.c:2348 sequencer.c:4872 submodule.c:913 builtin/commit.c:1118
-#: builtin/log.c:437 builtin/log.c:1055 builtin/log.c:1663 builtin/log.c:2096
-#: builtin/log.c:2387 builtin/merge.c:431 builtin/pack-objects.c:3381
-#: builtin/pack-objects.c:3781 builtin/pack-objects.c:3796
-#: builtin/shortlog.c:255
-msgid "revision walk setup failed"
-msgstr ""
-
-#: blame.c:2835
-msgid ""
-"--reverse --first-parent together require range along first-parent chain"
-msgstr ""
-
-#: blame.c:2846
-#, c-format
-msgid "no such path %s in %s"
-msgstr ""
-
-#: blame.c:2857
-#, c-format
-msgid "cannot read blob %s for path %s"
-msgstr ""
-
-#: branch.c:93
-msgid ""
-"cannot inherit upstream tracking configuration of multiple refs when "
-"rebasing is requested"
-msgstr ""
-
-#: branch.c:104
-#, c-format
-msgid "not setting branch '%s' as its own upstream"
-msgstr ""
-
-#: branch.c:160
-#, c-format
-msgid "branch '%s' set up to track '%s' by rebasing."
-msgstr ""
-
-#: branch.c:161
-#, c-format
-msgid "branch '%s' set up to track '%s'."
-msgstr ""
-
-#: branch.c:164
-#, c-format
-msgid "branch '%s' set up to track:"
-msgstr ""
-
-#: branch.c:176
-msgid "unable to write upstream branch configuration"
-msgstr ""
-
-#: branch.c:178
-msgid ""
-"\n"
-"After fixing the error cause you may try to fix up\n"
-"the remote tracking information by invoking:"
-msgstr ""
-
-#: branch.c:219
-#, c-format
-msgid "asked to inherit tracking from '%s', but no remote is set"
-msgstr ""
-
-#: branch.c:225
-#, c-format
-msgid "asked to inherit tracking from '%s', but no merge configuration is set"
-msgstr ""
-
-#: branch.c:277
-#, c-format
-msgid "not tracking: ambiguous information for ref '%s'"
-msgstr ""
-
-#. TRANSLATORS: This is a line listing a remote with duplicate
-#. refspecs in the advice message below. For RTL languages you'll
-#. probably want to swap the "%s" and leading "  " space around.
-#.
-#. TRANSLATORS: This is line item of ambiguous object output
-#. from describe_ambiguous_object() above. For RTL languages
-#. you'll probably want to swap the "%s" and leading " " space
-#. around.
-#.
-#: branch.c:289 object-name.c:464
-#, c-format
-msgid "  %s\n"
-msgstr ""
-
-#. TRANSLATORS: The second argument is a \n-delimited list of
-#. duplicate refspecs, composed above.
-#.
-#: branch.c:295
-#, c-format
-msgid ""
-"There are multiple remotes whose fetch refspecs map to the remote\n"
-"tracking ref '%s':\n"
-"%s\n"
-"This is typically a configuration error.\n"
-"\n"
-"To support setting up tracking branches, ensure that\n"
-"different remotes' fetch refspecs map into different\n"
-"tracking namespaces."
-msgstr ""
-
-#: branch.c:344
-#, c-format
-msgid "'%s' is not a valid branch name"
-msgstr ""
-
-#: branch.c:364
-#, c-format
-msgid "a branch named '%s' already exists"
-msgstr ""
-
-#: branch.c:370
-#, c-format
-msgid "cannot force update the branch '%s' checked out at '%s'"
-msgstr ""
-
-#: branch.c:393
-#, c-format
-msgid "cannot set up tracking information; starting point '%s' is not a branch"
-msgstr ""
-
-#: branch.c:395
-#, c-format
-msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
-
-#: branch.c:397
-msgid ""
-"\n"
-"If you are planning on basing your work on an upstream\n"
-"branch that already exists at the remote, you may need to\n"
-"run \"git fetch\" to retrieve it.\n"
-"\n"
-"If you are planning to push out a new local branch that\n"
-"will track its remote counterpart, you may want to use\n"
-"\"git push -u\" to set the upstream config as you push."
-msgstr ""
-
-#: branch.c:445 builtin/replace.c:321 builtin/replace.c:377
-#: builtin/replace.c:423 builtin/replace.c:453
-#, c-format
-msgid "not a valid object name: '%s'"
-msgstr ""
-
-#: branch.c:465
-#, c-format
-msgid "ambiguous object name: '%s'"
-msgstr ""
-
-#: branch.c:470
-#, c-format
-msgid "not a valid branch point: '%s'"
-msgstr ""
-
-#: branch.c:658
-#, c-format
-msgid "submodule '%s': unable to find submodule"
-msgstr ""
-
-#: branch.c:661
-#, c-format
-msgid ""
-"You may try updating the submodules using 'git checkout %s && git submodule "
-"update --init'"
-msgstr ""
-
-#: branch.c:672 branch.c:698
-#, c-format
-msgid "submodule '%s': cannot create branch '%s'"
-msgstr ""
-
-#: branch.c:730
-#, c-format
-msgid "'%s' is already checked out at '%s'"
-msgstr ""
-
-#: branch.c:755
-#, c-format
-msgid "HEAD of working tree %s is not updated"
-msgstr ""
-
-#: bundle.c:45
-#, c-format
-msgid "unrecognized bundle hash algorithm: %s"
-msgstr ""
-
-#: bundle.c:53
-#, c-format
-msgid "unknown capability '%s'"
-msgstr ""
-
-#: bundle.c:79
-#, c-format
-msgid "'%s' does not look like a v2 or v3 bundle file"
-msgstr ""
-
-#: bundle.c:118
-#, c-format
-msgid "unrecognized header: %s%s (%d)"
-msgstr ""
-
-#: bundle.c:145 rerere.c:464 rerere.c:675 sequencer.c:2616 sequencer.c:3402
-#: builtin/commit.c:865
-#, c-format
-msgid "could not open '%s'"
-msgstr ""
-
-#: bundle.c:203
-msgid "Repository lacks these prerequisite commits:"
-msgstr ""
-
-#: bundle.c:206
-msgid "need a repository to verify a bundle"
-msgstr ""
-
-#: bundle.c:264
-#, c-format
-msgid "The bundle contains this ref:"
-msgid_plural "The bundle contains these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:272
-msgid "The bundle records a complete history."
-msgstr ""
-
-#: bundle.c:274
-#, c-format
-msgid "The bundle requires this ref:"
-msgid_plural "The bundle requires these %<PRIuMAX> refs:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bundle.c:350
-msgid "unable to dup bundle descriptor"
-msgstr ""
-
-#: bundle.c:357
-msgid "Could not spawn pack-objects"
-msgstr ""
-
-#: bundle.c:368
-msgid "pack-objects died"
-msgstr ""
-
-#: bundle.c:417
-#, c-format
-msgid "ref '%s' is excluded by the rev-list options"
-msgstr ""
-
-#: bundle.c:533 builtin/log.c:211 builtin/log.c:1975 builtin/shortlog.c:400
-#, c-format
-msgid "unrecognized argument: %s"
-msgstr ""
-
-#: bundle.c:548
-#, c-format
-msgid "unsupported bundle version %d"
-msgstr ""
-
-#: bundle.c:550
-#, c-format
-msgid "cannot write bundle version %d with algorithm %s"
-msgstr ""
-
-#: bundle.c:600
-msgid "Refusing to create empty bundle."
-msgstr ""
-
-#: bundle.c:610
-#, c-format
-msgid "cannot create '%s'"
-msgstr ""
-
-#: bundle.c:639
-msgid "index-pack died"
-msgstr ""
-
-#: chunk-format.c:117
-msgid "terminating chunk id appears earlier than expected"
-msgstr ""
-
-#: chunk-format.c:126
-#, c-format
-msgid "improper chunk offset(s) %<PRIx64> and %<PRIx64>"
-msgstr ""
-
-#: chunk-format.c:133
-#, c-format
-msgid "duplicate chunk ID %<PRIx32> found"
-msgstr ""
-
-#: chunk-format.c:147
-#, c-format
-msgid "final chunk has non-zero id %<PRIx32>"
-msgstr ""
-
-#: color.c:354
-#, c-format
-msgid "invalid color value: %.*s"
-msgstr ""
-
-#: commit-graph.c:204 midx.c:52
-msgid "invalid hash version"
-msgstr ""
-
-#: commit-graph.c:262
-msgid "commit-graph file is too small"
-msgstr ""
-
-#: commit-graph.c:355
-#, c-format
-msgid "commit-graph signature %X does not match signature %X"
-msgstr ""
-
-#: commit-graph.c:362
-#, c-format
-msgid "commit-graph version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:369
-#, c-format
-msgid "commit-graph hash version %X does not match version %X"
-msgstr ""
-
-#: commit-graph.c:386
-#, c-format
-msgid "commit-graph file is too small to hold %u chunks"
-msgstr ""
-
-#: commit-graph.c:485
-msgid "commit-graph has no base graphs chunk"
-msgstr ""
-
-#: commit-graph.c:495
-msgid "commit-graph chain does not match"
-msgstr ""
-
-#: commit-graph.c:543
-#, c-format
-msgid "invalid commit-graph chain: line '%s' not a hash"
-msgstr ""
-
-#: commit-graph.c:567
-msgid "unable to find all commit-graph files"
-msgstr ""
-
-#: commit-graph.c:752 commit-graph.c:789
-msgid "invalid commit position. commit-graph is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:773
-#, c-format
-msgid "could not find commit %s"
-msgstr ""
-
-#: commit-graph.c:806
-msgid "commit-graph requires overflow generation data but has none"
-msgstr ""
-
-#: commit-graph.c:1111 builtin/am.c:1370 builtin/checkout.c:775
-#: builtin/clone.c:705
-#, c-format
-msgid "unable to parse commit %s"
-msgstr ""
-
-#: commit-graph.c:1373 builtin/pack-objects.c:3078
-#, c-format
-msgid "unable to get type of object %s"
-msgstr ""
-
-#: commit-graph.c:1404
-msgid "Loading known commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1421
-msgid "Expanding reachable commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:1441
-msgid "Clearing commit marks in commit graph"
-msgstr ""
-
-#: commit-graph.c:1460
-msgid "Computing commit graph topological levels"
-msgstr ""
-
-#: commit-graph.c:1513
-msgid "Computing commit graph generation numbers"
-msgstr ""
-
-#: commit-graph.c:1598
-msgid "Computing commit changed paths Bloom filters"
-msgstr ""
-
-#: commit-graph.c:1675
-msgid "Collecting referenced commits"
-msgstr ""
-
-#: commit-graph.c:1701
-#, c-format
-msgid "Finding commits for commit graph in %<PRIuMAX> pack"
-msgid_plural "Finding commits for commit graph in %<PRIuMAX> packs"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1714
-#, c-format
-msgid "error adding pack %s"
-msgstr ""
-
-#: commit-graph.c:1718
-#, c-format
-msgid "error opening index for %s"
-msgstr ""
-
-#: commit-graph.c:1756
-msgid "Finding commits for commit graph among packed objects"
-msgstr ""
-
-#: commit-graph.c:1774
-msgid "Finding extra edges in commit graph"
-msgstr ""
-
-#: commit-graph.c:1823
-msgid "failed to write correct number of base graph ids"
-msgstr ""
-
-#: commit-graph.c:1854 midx.c:1168 builtin/sparse-checkout.c:475
-#, c-format
-msgid "unable to create leading directories of %s"
-msgstr ""
-
-#: commit-graph.c:1868
-msgid "unable to create temporary graph layer"
-msgstr ""
-
-#: commit-graph.c:1873
-#, c-format
-msgid "unable to adjust shared permissions for '%s'"
-msgstr ""
-
-#: commit-graph.c:1930
-#, c-format
-msgid "Writing out commit graph in %d pass"
-msgid_plural "Writing out commit graph in %d passes"
-msgstr[0] ""
-msgstr[1] ""
-
-#: commit-graph.c:1967
-msgid "unable to open commit-graph chain file"
-msgstr ""
-
-#: commit-graph.c:1983
-msgid "failed to rename base commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2004
-msgid "failed to rename temporary commit-graph file"
-msgstr ""
-
-#: commit-graph.c:2137
-msgid "Scanning merged commits"
-msgstr ""
-
-#: commit-graph.c:2181
-msgid "Merging commit-graph"
-msgstr ""
-
-#: commit-graph.c:2289
-msgid "attempting to write a commit-graph, but 'core.commitGraph' is disabled"
-msgstr ""
-
-#: commit-graph.c:2396
-msgid "too many commits to write graph"
-msgstr ""
-
-#: commit-graph.c:2494
-msgid "the commit-graph file has incorrect checksum and is likely corrupt"
-msgstr ""
-
-#: commit-graph.c:2504
-#, c-format
-msgid "commit-graph has incorrect OID order: %s then %s"
-msgstr ""
-
-#: commit-graph.c:2514 commit-graph.c:2529
-#, c-format
-msgid "commit-graph has incorrect fanout value: fanout[%d] = %u != %u"
-msgstr ""
-
-#: commit-graph.c:2521
-#, c-format
-msgid "failed to parse commit %s from commit-graph"
-msgstr ""
-
-#: commit-graph.c:2539
-msgid "Verifying commits in commit graph"
-msgstr ""
-
-#: commit-graph.c:2554
-#, c-format
-msgid "failed to parse commit %s from object database for commit-graph"
-msgstr ""
-
-#: commit-graph.c:2561
-#, c-format
-msgid "root tree OID for commit %s in commit-graph is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2571
-#, c-format
-msgid "commit-graph parent list for commit %s is too long"
-msgstr ""
-
-#: commit-graph.c:2580
-#, c-format
-msgid "commit-graph parent for %s is %s != %s"
-msgstr ""
-
-#: commit-graph.c:2594
-#, c-format
-msgid "commit-graph parent list for commit %s terminates early"
-msgstr ""
-
-#: commit-graph.c:2599
-#, c-format
-msgid ""
-"commit-graph has generation number zero for commit %s, but non-zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2603
-#, c-format
-msgid ""
-"commit-graph has non-zero generation number for commit %s, but zero elsewhere"
-msgstr ""
-
-#: commit-graph.c:2620
-#, c-format
-msgid "commit-graph generation for commit %s is %<PRIuMAX> < %<PRIuMAX>"
-msgstr ""
-
-#: commit-graph.c:2626
-#, c-format
-msgid "commit date for commit %s in commit-graph is %<PRIuMAX> != %<PRIuMAX>"
-msgstr ""
-
-#: commit.c:54 sequencer.c:3105 builtin/am.c:400 builtin/am.c:445
-#: builtin/am.c:450 builtin/am.c:1449 builtin/am.c:2124 builtin/replace.c:456
-#, c-format
-msgid "could not parse %s"
-msgstr ""
-
-#: commit.c:56
-#, c-format
-msgid "%s %s is not a commit!"
-msgstr ""
-
-#: commit.c:197
-msgid ""
-"Support for <GIT_DIR>/info/grafts is deprecated\n"
-"and will be removed in a future Git version.\n"
-"\n"
-"Please use \"git replace --convert-graft-file\"\n"
-"to convert the grafts into replace refs.\n"
-"\n"
-"Turn this message off by running\n"
-"\"git config advice.graftFileDeprecated false\""
-msgstr ""
-
-#: commit.c:1252
-#, c-format
-msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
-msgstr ""
-
-#: commit.c:1256
-#, c-format
-msgid "Commit %s has a bad GPG signature allegedly by %s."
-msgstr ""
-
-#: commit.c:1259
-#, c-format
-msgid "Commit %s does not have a GPG signature."
-msgstr ""
-
-#: commit.c:1262
-#, c-format
-msgid "Commit %s has a good GPG signature by %s\n"
-msgstr ""
-
-#: commit.c:1516
-msgid ""
-"Warning: commit message did not conform to UTF-8.\n"
-"You may want to amend it after fixing the message, or set the config\n"
-"variable i18n.commitencoding to the encoding your project uses.\n"
-msgstr ""
-
-#: compat/obstack.c:406 compat/obstack.c:408
-msgid "memory exhausted"
-msgstr ""
-
-#: compat/terminal.c:167
-msgid "cannot resume in the background, please use 'fg' to resume"
-msgstr ""
-
-#: compat/terminal.c:168
-msgid "cannot restore terminal settings"
-msgstr ""
-
-#: config.c:143
-#, c-format
-msgid ""
-"exceeded maximum include depth (%d) while including\n"
-"\t%s\n"
-"from\n"
-"\t%s\n"
-"This might be due to circular includes."
-msgstr ""
-
-#: config.c:159
-#, c-format
-msgid "could not expand include path '%s'"
-msgstr ""
-
-#: config.c:170
-msgid "relative config includes must come from files"
-msgstr ""
-
-#: config.c:219
-msgid "relative config include conditionals must come from files"
-msgstr ""
-
-#: config.c:364
-msgid ""
-"remote URLs cannot be configured in file directly or indirectly included by "
-"includeIf.hasconfig:remote.*.url"
-msgstr ""
-
-#: config.c:508
-#, c-format
-msgid "invalid config format: %s"
-msgstr ""
-
-#: config.c:512
-#, c-format
-msgid "missing environment variable name for configuration '%.*s'"
-msgstr ""
-
-#: config.c:517
-#, c-format
-msgid "missing environment variable '%s' for configuration '%.*s'"
-msgstr ""
-
-#: config.c:553
-#, c-format
-msgid "key does not contain a section: %s"
-msgstr ""
-
-#: config.c:558
-#, c-format
-msgid "key does not contain variable name: %s"
-msgstr ""
-
-#: config.c:580 sequencer.c:2802
-#, c-format
-msgid "invalid key: %s"
-msgstr ""
-
-#: config.c:585
-#, c-format
-msgid "invalid key (newline): %s"
-msgstr ""
-
-#: config.c:605
-msgid "empty config key"
-msgstr ""
-
-#: config.c:623 config.c:635
-#, c-format
-msgid "bogus config parameter: %s"
-msgstr ""
-
-#: config.c:649 config.c:666 config.c:673 config.c:682
-#, c-format
-msgid "bogus format in %s"
-msgstr ""
-
-#: config.c:716
-#, c-format
-msgid "bogus count in %s"
-msgstr ""
-
-#: config.c:720
-#, c-format
-msgid "too many entries in %s"
-msgstr ""
-
-#: config.c:730
-#, c-format
-msgid "missing config key %s"
-msgstr ""
-
-#: config.c:738
-#, c-format
-msgid "missing config value %s"
-msgstr ""
-
-#: config.c:1089
-#, c-format
-msgid "bad config line %d in blob %s"
-msgstr ""
-
-#: config.c:1093
-#, c-format
-msgid "bad config line %d in file %s"
-msgstr ""
-
-#: config.c:1097
-#, c-format
-msgid "bad config line %d in standard input"
-msgstr ""
-
-#: config.c:1101
-#, c-format
-msgid "bad config line %d in submodule-blob %s"
-msgstr ""
-
-#: config.c:1105
-#, c-format
-msgid "bad config line %d in command line %s"
-msgstr ""
-
-#: config.c:1109
-#, c-format
-msgid "bad config line %d in %s"
-msgstr ""
-
-#: config.c:1246
-msgid "out of range"
-msgstr ""
-
-#: config.c:1246
-msgid "invalid unit"
-msgstr ""
-
-#: config.c:1247
-#, c-format
-msgid "bad numeric config value '%s' for '%s': %s"
-msgstr ""
-
-#: config.c:1257
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr ""
-
-#: config.c:1260
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr ""
-
-#: config.c:1263
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr ""
-
-#: config.c:1266
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr ""
-
-#: config.c:1269
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr ""
-
-#: config.c:1272
-#, c-format
-msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr ""
-
-#: config.c:1368
-#, c-format
-msgid "invalid value for variable %s"
-msgstr ""
-
-#: config.c:1389
-#, c-format
-msgid "ignoring unknown core.fsync component '%s'"
-msgstr ""
-
-#: config.c:1425
-#, c-format
-msgid "bad boolean config value '%s' for '%s'"
-msgstr ""
-
-#: config.c:1443
-#, c-format
-msgid "failed to expand user dir in: '%s'"
-msgstr ""
-
-#: config.c:1452
-#, c-format
-msgid "'%s' for '%s' is not a valid timestamp"
-msgstr ""
-
-#: config.c:1545
-#, c-format
-msgid "abbrev length out of range: %d"
-msgstr ""
-
-#: config.c:1559 config.c:1570
-#, c-format
-msgid "bad zlib compression level %d"
-msgstr ""
-
-#: config.c:1660
-msgid "core.commentChar should only be one character"
-msgstr ""
-
-#: config.c:1692
-#, c-format
-msgid "ignoring unknown core.fsyncMethod value '%s'"
-msgstr ""
-
-#: config.c:1698
-msgid "core.fsyncObjectFiles is deprecated; use core.fsync instead"
-msgstr ""
-
-#: config.c:1714
-#, c-format
-msgid "invalid mode for object creation: %s"
-msgstr ""
-
-#: config.c:1800
-#, c-format
-msgid "malformed value for %s"
-msgstr ""
-
-#: config.c:1826
-#, c-format
-msgid "malformed value for %s: %s"
-msgstr ""
-
-#: config.c:1827
-msgid "must be one of nothing, matching, simple, upstream or current"
-msgstr ""
-
-#: config.c:1888 builtin/pack-objects.c:4078
-#, c-format
-msgid "bad pack compression level %d"
-msgstr ""
-
-#: config.c:2014
-#, c-format
-msgid "unable to load config blob object '%s'"
-msgstr ""
-
-#: config.c:2017
-#, c-format
-msgid "reference '%s' does not point to a blob"
-msgstr ""
-
-#: config.c:2035
-#, c-format
-msgid "unable to resolve config blob '%s'"
-msgstr ""
-
-#: config.c:2080
-#, c-format
-msgid "failed to parse %s"
-msgstr ""
-
-#: config.c:2136
-msgid "unable to parse command-line config"
-msgstr ""
-
-#: config.c:2512
-msgid "unknown error occurred while reading the configuration files"
-msgstr ""
-
-#: config.c:2686
-#, c-format
-msgid "Invalid %s: '%s'"
-msgstr ""
-
-#: config.c:2731
-#, c-format
-msgid "splitIndex.maxPercentChange value '%d' should be between 0 and 100"
-msgstr ""
-
-#: config.c:2763
-#, c-format
-msgid "unable to parse '%s' from command-line config"
-msgstr ""
-
-#: config.c:2765
-#, c-format
-msgid "bad config variable '%s' in file '%s' at line %d"
-msgstr ""
-
-#: config.c:2850
-#, c-format
-msgid "invalid section name '%s'"
-msgstr ""
-
-#: config.c:2882
-#, c-format
-msgid "%s has multiple values"
-msgstr ""
-
-#: config.c:2911
-#, c-format
-msgid "failed to write new configuration file %s"
-msgstr ""
-
-#: config.c:3177 config.c:3518
-#, c-format
-msgid "could not lock config file %s"
-msgstr ""
-
-#: config.c:3188
-#, c-format
-msgid "opening %s"
-msgstr ""
-
-#: config.c:3225 builtin/config.c:361
-#, c-format
-msgid "invalid pattern: %s"
-msgstr ""
-
-#: config.c:3250
-#, c-format
-msgid "invalid config file %s"
-msgstr ""
-
-#: config.c:3263 config.c:3531
-#, c-format
-msgid "fstat on %s failed"
-msgstr ""
-
-#: config.c:3274
-#, c-format
-msgid "unable to mmap '%s'%s"
-msgstr ""
-
-#: config.c:3284 config.c:3536
-#, c-format
-msgid "chmod on %s failed"
-msgstr ""
-
-#: config.c:3369 config.c:3633
-#, c-format
-msgid "could not write config file %s"
-msgstr ""
-
-#: config.c:3403
-#, c-format
-msgid "could not set '%s' to '%s'"
-msgstr ""
-
-#: config.c:3405 builtin/remote.c:666 builtin/remote.c:885 builtin/remote.c:893
-#, c-format
-msgid "could not unset '%s'"
-msgstr ""
-
-#: config.c:3509
-#, c-format
-msgid "invalid section name: %s"
-msgstr ""
-
-#: config.c:3676
-#, c-format
-msgid "missing value for '%s'"
-msgstr ""
-
-#: connect.c:61
-msgid "the remote end hung up upon initial contact"
-msgstr ""
-
-#: connect.c:63
-msgid ""
-"Could not read from remote repository.\n"
-"\n"
-"Please make sure you have the correct access rights\n"
-"and the repository exists."
-msgstr ""
-
-#: connect.c:81
-#, c-format
-msgid "server doesn't support '%s'"
-msgstr ""
-
-#: connect.c:118
-#, c-format
-msgid "server doesn't support feature '%s'"
-msgstr ""
-
-#: connect.c:129
-msgid "expected flush after capabilities"
-msgstr ""
-
-#: connect.c:265
-#, c-format
-msgid "ignoring capabilities after first line '%s'"
-msgstr ""
-
-#: connect.c:286
-msgid "protocol error: unexpected capabilities^{}"
-msgstr ""
-
-#: connect.c:308
-#, c-format
-msgid "protocol error: expected shallow sha-1, got '%s'"
-msgstr ""
-
-#: connect.c:310
-msgid "repository on the other end cannot be shallow"
-msgstr ""
-
-#: connect.c:349
-msgid "invalid packet"
-msgstr ""
-
-#: connect.c:369
-#, c-format
-msgid "protocol error: unexpected '%s'"
-msgstr ""
-
-#: connect.c:499
-#, c-format
-msgid "unknown object format '%s' specified by server"
-msgstr ""
-
-#: connect.c:528
-#, c-format
-msgid "invalid ls-refs response: %s"
-msgstr ""
-
-#: connect.c:532
-msgid "expected flush after ref listing"
-msgstr ""
-
-#: connect.c:535
-msgid "expected response end packet after ref listing"
-msgstr ""
-
-#: connect.c:670
-#, c-format
-msgid "protocol '%s' is not supported"
-msgstr ""
-
-#: connect.c:721
-msgid "unable to set SO_KEEPALIVE on socket"
-msgstr ""
-
-#: connect.c:761 connect.c:824
-#, c-format
-msgid "Looking up %s ... "
-msgstr ""
-
-#: connect.c:765
-#, c-format
-msgid "unable to look up %s (port %s) (%s)"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Looking up %s ... "
-#: connect.c:769 connect.c:840
-#, c-format
-msgid ""
-"done.\n"
-"Connecting to %s (port %s) ... "
-msgstr ""
-
-#: connect.c:791 connect.c:868
-#, c-format
-msgid ""
-"unable to connect to %s:\n"
-"%s"
-msgstr ""
-
-#. TRANSLATORS: this is the end of "Connecting to %s (port %s) ... "
-#: connect.c:797 connect.c:874
-msgid "done."
-msgstr ""
-
-#: connect.c:828
-#, c-format
-msgid "unable to look up %s (%s)"
-msgstr ""
-
-#: connect.c:834
-#, c-format
-msgid "unknown port %s"
-msgstr ""
-
-#: connect.c:971 connect.c:1303
-#, c-format
-msgid "strange hostname '%s' blocked"
-msgstr ""
-
-#: connect.c:973
-#, c-format
-msgid "strange port '%s' blocked"
-msgstr ""
-
-#: connect.c:983
-#, c-format
-msgid "cannot start proxy %s"
-msgstr ""
-
-#: connect.c:1054
-msgid "no path specified; see 'git help pull' for valid url syntax"
-msgstr ""
-
-#: connect.c:1194
-msgid "newline is forbidden in git:// hosts and repo paths"
-msgstr ""
-
-#: connect.c:1251
-msgid "ssh variant 'simple' does not support -4"
-msgstr ""
-
-#: connect.c:1263
-msgid "ssh variant 'simple' does not support -6"
-msgstr ""
-
-#: connect.c:1280
-msgid "ssh variant 'simple' does not support setting port"
-msgstr ""
-
-#: connect.c:1392
-#, c-format
-msgid "strange pathname '%s' blocked"
-msgstr ""
-
-#: connect.c:1440
-msgid "unable to fork"
-msgstr ""
-
-#: connected.c:109 builtin/fsck.c:189 builtin/prune.c:57
-msgid "Checking connectivity"
-msgstr ""
-
-#: connected.c:122
-msgid "Could not run 'git rev-list'"
-msgstr ""
-
-#: connected.c:146
-msgid "failed write to rev-list"
-msgstr ""
-
-#: connected.c:151
-msgid "failed to close rev-list's stdin"
-msgstr ""
-
-#: convert.c:183
-#, c-format
-msgid "illegal crlf_action %d"
-msgstr ""
-
-#: convert.c:196
-#, c-format
-msgid "CRLF would be replaced by LF in %s"
-msgstr ""
-
-#: convert.c:198
-#, c-format
-msgid ""
-"CRLF will be replaced by LF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:206
-#, c-format
-msgid "LF would be replaced by CRLF in %s"
-msgstr ""
-
-#: convert.c:208
-#, c-format
-msgid ""
-"LF will be replaced by CRLF in %s.\n"
-"The file will have its original line endings in your working directory"
-msgstr ""
-
-#: convert.c:273
-#, c-format
-msgid "BOM is prohibited in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:280
-#, c-format
-msgid ""
-"The file '%s' contains a byte order mark (BOM). Please use UTF-%.*s as "
-"working-tree-encoding."
-msgstr ""
-
-#: convert.c:293
-#, c-format
-msgid "BOM is required in '%s' if encoded as %s"
-msgstr ""
-
-#: convert.c:295
-#, c-format
-msgid ""
-"The file '%s' is missing a byte order mark (BOM). Please use UTF-%sBE or UTF-"
-"%sLE (depending on the byte order) as working-tree-encoding."
-msgstr ""
-
-#: convert.c:408 convert.c:479
-#, c-format
-msgid "failed to encode '%s' from %s to %s"
-msgstr ""
-
-#: convert.c:451
-#, c-format
-msgid "encoding '%s' from %s to %s and back is not the same"
-msgstr ""
-
-#: convert.c:654
-#, c-format
-msgid "cannot fork to run external filter '%s'"
-msgstr ""
-
-#: convert.c:674
-#, c-format
-msgid "cannot feed the input to external filter '%s'"
-msgstr ""
-
-#: convert.c:681
-#, c-format
-msgid "external filter '%s' failed %d"
-msgstr ""
-
-#: convert.c:716 convert.c:719
-#, c-format
-msgid "read from external filter '%s' failed"
-msgstr ""
-
-#: convert.c:722 convert.c:777
-#, c-format
-msgid "external filter '%s' failed"
-msgstr ""
-
-#: convert.c:826
-msgid "unexpected filter type"
-msgstr ""
-
-#: convert.c:837
-msgid "path name too long for external filter"
-msgstr ""
-
-#: convert.c:935
-#, c-format
-msgid ""
-"external filter '%s' is not available anymore although not all paths have "
-"been filtered"
-msgstr ""
-
-#: convert.c:1236
-msgid "true/false are no valid working-tree-encodings"
-msgstr ""
-
-#: convert.c:1416 convert.c:1449
-#, c-format
-msgid "%s: clean filter '%s' failed"
-msgstr ""
-
-#: convert.c:1492
-#, c-format
-msgid "%s: smudge filter %s failed"
-msgstr ""
-
-#: credential.c:96
-#, c-format
-msgid "skipping credential lookup for key: credential.%s"
-msgstr ""
-
-#: credential.c:112
-msgid "refusing to work with credential missing host field"
-msgstr ""
-
-#: credential.c:114
-msgid "refusing to work with credential missing protocol field"
-msgstr ""
-
-#: credential.c:396
-#, c-format
-msgid "url contains a newline in its %s component: %s"
-msgstr ""
-
-#: credential.c:440
-#, c-format
-msgid "url has no scheme: %s"
-msgstr ""
-
-#: credential.c:513
-#, c-format
-msgid "credential url cannot be parsed: %s"
-msgstr ""
-
-#: date.c:139
-msgid "in the future"
-msgstr ""
-
-#: date.c:145
-#, c-format
-msgid "%<PRIuMAX> second ago"
-msgid_plural "%<PRIuMAX> seconds ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:152
-#, c-format
-msgid "%<PRIuMAX> minute ago"
-msgid_plural "%<PRIuMAX> minutes ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:159
-#, c-format
-msgid "%<PRIuMAX> hour ago"
-msgid_plural "%<PRIuMAX> hours ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:166
-#, c-format
-msgid "%<PRIuMAX> day ago"
-msgid_plural "%<PRIuMAX> days ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:172
-#, c-format
-msgid "%<PRIuMAX> week ago"
-msgid_plural "%<PRIuMAX> weeks ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:179
-#, c-format
-msgid "%<PRIuMAX> month ago"
-msgid_plural "%<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:190
-#, c-format
-msgid "%<PRIuMAX> year"
-msgid_plural "%<PRIuMAX> years"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: "%s" is "<n> years"
-#: date.c:193
-#, c-format
-msgid "%s, %<PRIuMAX> month ago"
-msgid_plural "%s, %<PRIuMAX> months ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: date.c:198 date.c:203
-#, c-format
-msgid "%<PRIuMAX> year ago"
-msgid_plural "%<PRIuMAX> years ago"
-msgstr[0] ""
-msgstr[1] ""
-
-#: delta-islands.c:272
-msgid "Propagating island marks"
-msgstr ""
-
-#: delta-islands.c:290
-#, c-format
-msgid "bad tree object %s"
-msgstr ""
-
-#: delta-islands.c:334
-#, c-format
-msgid "failed to load island regex for '%s': %s"
-msgstr ""
-
-#: delta-islands.c:390
-#, c-format
-msgid "island regex from config has too many capture groups (max=%d)"
-msgstr ""
-
-#: delta-islands.c:467
-#, c-format
-msgid "Marked %d islands, done.\n"
-msgstr ""
-
-#: diff-merges.c:81 gpg-interface.c:719 gpg-interface.c:734 ls-refs.c:37
-#: parallel-checkout.c:42 sequencer.c:2805 setup.c:563 builtin/am.c:203
-#: builtin/am.c:2243 builtin/am.c:2287 builtin/blame.c:724 builtin/blame.c:742
-#: builtin/fetch.c:792 builtin/pack-objects.c:3515 builtin/pull.c:45
-#: builtin/pull.c:47 builtin/pull.c:321
-#, c-format
-msgid "invalid value for '%s': '%s'"
-msgstr ""
-
-#: diff-lib.c:561
-msgid "--merge-base does not work with ranges"
-msgstr ""
-
-#: diff-lib.c:563
-msgid "--merge-base only works with commits"
-msgstr ""
-
-#: diff-lib.c:580
-msgid "unable to get HEAD"
-msgstr ""
-
-#: diff-lib.c:587
-msgid "no merge base found"
-msgstr ""
-
-#: diff-lib.c:589
-msgid "multiple merge bases found"
-msgstr ""
-
-#: diff-no-index.c:237
-msgid "git diff --no-index [<options>] <path> <path>"
-msgstr ""
-
-#: diff-no-index.c:262
-msgid ""
-"Not a git repository. Use --no-index to compare two paths outside a working "
-"tree"
-msgstr ""
-
-#: diff.c:159
-#, c-format
-msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
-msgstr ""
-
-#: diff.c:164
-#, c-format
-msgid "  Unknown dirstat parameter '%s'\n"
-msgstr ""
-
-#: diff.c:300
-msgid ""
-"color moved setting must be one of 'no', 'default', 'blocks', 'zebra', "
-"'dimmed-zebra', 'plain'"
-msgstr ""
-
-#: diff.c:328
-#, c-format
-msgid ""
-"unknown color-moved-ws mode '%s', possible values are 'ignore-space-change', "
-"'ignore-space-at-eol', 'ignore-all-space', 'allow-indentation-change'"
-msgstr ""
-
-#: diff.c:336
-msgid ""
-"color-moved-ws: allow-indentation-change cannot be combined with other "
-"whitespace modes"
-msgstr ""
-
-#: diff.c:413
-#, c-format
-msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
-
-#: diff.c:473
-#, c-format
-msgid ""
-"Found errors in 'diff.dirstat' config variable:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4282
-#, c-format
-msgid "external diff died, stopping at %s"
-msgstr ""
-
-#: diff.c:4677 parse-options.c:1114
-#, c-format
-msgid "options '%s', '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4681 parse-options.c:1118 builtin/worktree.c:578
-#, c-format
-msgid "options '%s', '%s', and '%s' cannot be used together"
-msgstr ""
-
-#: diff.c:4685
-#, c-format
-msgid "options '%s' and '%s' cannot be used together, use '%s' with '%s'"
-msgstr ""
-
-#: diff.c:4689
-#, c-format
-msgid ""
-"options '%s' and '%s' cannot be used together, use '%s' with '%s' and '%s'"
-msgstr ""
-
-#: diff.c:4769
-msgid "--follow requires exactly one pathspec"
-msgstr ""
-
-#: diff.c:4823
-#, c-format
-msgid "invalid --stat value: %s"
-msgstr ""
-
-#: diff.c:4828 diff.c:4833 diff.c:4838 diff.c:4843 diff.c:5319
-#: parse-options.c:217 parse-options.c:221
-#, c-format
-msgid "%s expects a numerical value"
-msgstr ""
-
-#: diff.c:4860
-#, c-format
-msgid ""
-"Failed to parse --dirstat/-X option parameter:\n"
-"%s"
-msgstr ""
-
-#: diff.c:4893
-#, c-format
-msgid "unknown change class '%c' in --diff-filter=%s"
-msgstr ""
-
-#: diff.c:4917
-#, c-format
-msgid "unknown value after ws-error-highlight=%.*s"
-msgstr ""
-
-#: diff.c:4931
-#, c-format
-msgid "unable to resolve '%s'"
-msgstr ""
-
-#: diff.c:4981 diff.c:4987
-#, c-format
-msgid "%s expects <n>/<m> form"
-msgstr ""
-
-#: diff.c:4999
-#, c-format
-msgid "%s expects a character, got '%s'"
-msgstr ""
-
-#: diff.c:5020
-#, c-format
-msgid "bad --color-moved argument: %s"
-msgstr ""
-
-#: diff.c:5039
-#, c-format
-msgid "invalid mode '%s' in --color-moved-ws"
-msgstr ""
-
-#: diff.c:5079
-msgid ""
-"option diff-algorithm accepts \"myers\", \"minimal\", \"patience\" and "
-"\"histogram\""
-msgstr ""
-
-#: diff.c:5115 diff.c:5135
-#, c-format
-msgid "invalid argument to %s"
-msgstr ""
-
-#: diff.c:5239
-#, c-format
-msgid "invalid regex given to -I: '%s'"
-msgstr ""
-
-#: diff.c:5288
-#, c-format
-msgid "failed to parse --submodule option parameter: '%s'"
-msgstr ""
-
-#: diff.c:5344
-#, c-format
-msgid "bad --word-diff argument: %s"
-msgstr ""
-
-#: diff.c:5380
-msgid "Diff output format options"
-msgstr ""
-
-#: diff.c:5382 diff.c:5388
-msgid "generate patch"
-msgstr ""
-
-#: diff.c:5385 builtin/log.c:180
-msgid "suppress diff output"
-msgstr ""
-
-#: diff.c:5390 diff.c:5504 diff.c:5511
-msgid "<n>"
-msgstr ""
-
-#: diff.c:5391 diff.c:5394
-msgid "generate diffs with <n> lines context"
-msgstr ""
-
-#: diff.c:5396
-msgid "generate the diff in raw format"
-msgstr ""
-
-#: diff.c:5399
-msgid "synonym for '-p --raw'"
-msgstr ""
-
-#: diff.c:5403
-msgid "synonym for '-p --stat'"
-msgstr ""
-
-#: diff.c:5407
-msgid "machine friendly --stat"
-msgstr ""
-
-#: diff.c:5410
-msgid "output only the last line of --stat"
-msgstr ""
-
-#: diff.c:5412 diff.c:5420
-msgid "<param1,param2>..."
-msgstr ""
-
-#: diff.c:5413
-msgid ""
-"output the distribution of relative amount of changes for each sub-directory"
-msgstr ""
-
-#: diff.c:5417
-msgid "synonym for --dirstat=cumulative"
-msgstr ""
-
-#: diff.c:5421
-msgid "synonym for --dirstat=files,param1,param2..."
-msgstr ""
-
-#: diff.c:5425
-msgid "warn if changes introduce conflict markers or whitespace errors"
-msgstr ""
-
-#: diff.c:5428
-msgid "condensed summary such as creations, renames and mode changes"
-msgstr ""
-
-#: diff.c:5431
-msgid "show only names of changed files"
-msgstr ""
-
-#: diff.c:5434
-msgid "show only names and status of changed files"
-msgstr ""
-
-#: diff.c:5436
-msgid "<width>[,<name-width>[,<count>]]"
-msgstr ""
-
-#: diff.c:5437
-msgid "generate diffstat"
-msgstr ""
-
-#: diff.c:5439 diff.c:5442 diff.c:5445
-msgid "<width>"
-msgstr ""
-
-#: diff.c:5440
-msgid "generate diffstat with a given width"
-msgstr ""
-
-#: diff.c:5443
-msgid "generate diffstat with a given name width"
-msgstr ""
-
-#: diff.c:5446
-msgid "generate diffstat with a given graph width"
-msgstr ""
-
-#: diff.c:5448
-msgid "<count>"
-msgstr ""
-
-#: diff.c:5449
-msgid "generate diffstat with limited lines"
-msgstr ""
-
-#: diff.c:5452
-msgid "generate compact summary in diffstat"
-msgstr ""
-
-#: diff.c:5455
-msgid "output a binary diff that can be applied"
-msgstr ""
-
-#: diff.c:5458
-msgid "show full pre- and post-image object names on the \"index\" lines"
-msgstr ""
-
-#: diff.c:5460
-msgid "show colored diff"
-msgstr ""
-
-#: diff.c:5461
-msgid "<kind>"
-msgstr ""
-
-#: diff.c:5462
-msgid ""
-"highlight whitespace errors in the 'context', 'old' or 'new' lines in the "
-"diff"
-msgstr ""
-
-#: diff.c:5465
-msgid ""
-"do not munge pathnames and use NULs as output field terminators in --raw or "
-"--numstat"
-msgstr ""
-
-#: diff.c:5468 diff.c:5471 diff.c:5474 diff.c:5583
-msgid "<prefix>"
-msgstr ""
-
-#: diff.c:5469
-msgid "show the given source prefix instead of \"a/\""
-msgstr ""
-
-#: diff.c:5472
-msgid "show the given destination prefix instead of \"b/\""
-msgstr ""
-
-#: diff.c:5475
-msgid "prepend an additional prefix to every line of output"
-msgstr ""
-
-#: diff.c:5478
-msgid "do not show any source or destination prefix"
-msgstr ""
-
-#: diff.c:5481
-msgid "show context between diff hunks up to the specified number of lines"
-msgstr ""
-
-#: diff.c:5485 diff.c:5490 diff.c:5495
-msgid "<char>"
-msgstr ""
-
-#: diff.c:5486
-msgid "specify the character to indicate a new line instead of '+'"
-msgstr ""
-
-#: diff.c:5491
-msgid "specify the character to indicate an old line instead of '-'"
-msgstr ""
-
-#: diff.c:5496
-msgid "specify the character to indicate a context instead of ' '"
-msgstr ""
-
-#: diff.c:5499
-msgid "Diff rename options"
-msgstr ""
-
-#: diff.c:5500
-msgid "<n>[/<m>]"
-msgstr ""
-
-#: diff.c:5501
-msgid "break complete rewrite changes into pairs of delete and create"
-msgstr ""
-
-#: diff.c:5505
-msgid "detect renames"
-msgstr ""
-
-#: diff.c:5509
-msgid "omit the preimage for deletes"
-msgstr ""
-
-#: diff.c:5512
-msgid "detect copies"
-msgstr ""
-
-#: diff.c:5516
-msgid "use unmodified files as source to find copies"
-msgstr ""
-
-#: diff.c:5518
-msgid "disable rename detection"
-msgstr ""
-
-#: diff.c:5521
-msgid "use empty blobs as rename source"
-msgstr ""
-
-#: diff.c:5523
-msgid "continue listing the history of a file beyond renames"
-msgstr ""
-
-#: diff.c:5526
-msgid ""
-"prevent rename/copy detection if the number of rename/copy targets exceeds "
-"given limit"
-msgstr ""
-
-#: diff.c:5528
-msgid "Diff algorithm options"
-msgstr ""
-
-#: diff.c:5530
-msgid "produce the smallest possible diff"
-msgstr ""
-
-#: diff.c:5533
-msgid "ignore whitespace when comparing lines"
-msgstr ""
-
-#: diff.c:5536
-msgid "ignore changes in amount of whitespace"
-msgstr ""
-
-#: diff.c:5539
-msgid "ignore changes in whitespace at EOL"
-msgstr ""
-
-#: diff.c:5542
-msgid "ignore carrier-return at the end of line"
-msgstr ""
-
-#: diff.c:5545
-msgid "ignore changes whose lines are all blank"
-msgstr ""
-
-#: diff.c:5547 diff.c:5569 diff.c:5572 diff.c:5617
-msgid "<regex>"
-msgstr ""
-
-#: diff.c:5548
-msgid "ignore changes whose all lines match <regex>"
-msgstr ""
-
-#: diff.c:5551
-msgid "heuristic to shift diff hunk boundaries for easy reading"
-msgstr ""
-
-#: diff.c:5554
-msgid "generate diff using the \"patience diff\" algorithm"
-msgstr ""
-
-#: diff.c:5558
-msgid "generate diff using the \"histogram diff\" algorithm"
-msgstr ""
-
-#: diff.c:5560
-msgid "<algorithm>"
-msgstr ""
-
-#: diff.c:5561
-msgid "choose a diff algorithm"
-msgstr ""
-
-#: diff.c:5563
-msgid "<text>"
-msgstr ""
-
-#: diff.c:5564
-msgid "generate diff using the \"anchored diff\" algorithm"
-msgstr ""
-
-#: diff.c:5566 diff.c:5575 diff.c:5578
-msgid "<mode>"
-msgstr ""
-
-#: diff.c:5567
-msgid "show word diff, using <mode> to delimit changed words"
-msgstr ""
-
-#: diff.c:5570
-msgid "use <regex> to decide what a word is"
-msgstr ""
-
-#: diff.c:5573
-msgid "equivalent to --word-diff=color --word-diff-regex=<regex>"
-msgstr ""
-
-#: diff.c:5576
-msgid "moved lines of code are colored differently"
-msgstr ""
-
-#: diff.c:5579
-msgid "how white spaces are ignored in --color-moved"
-msgstr ""
-
-#: diff.c:5582
-msgid "Other diff options"
-msgstr ""
-
-#: diff.c:5584
-msgid "when run from subdir, exclude changes outside and show relative paths"
-msgstr ""
-
-#: diff.c:5588
-msgid "treat all files as text"
-msgstr ""
-
-#: diff.c:5590
-msgid "swap two inputs, reverse the diff"
-msgstr ""
-
-#: diff.c:5592
-msgid "exit with 1 if there were differences, 0 otherwise"
-msgstr ""
-
-#: diff.c:5594
-msgid "disable all output of the program"
-msgstr ""
-
-#: diff.c:5596
-msgid "allow an external diff helper to be executed"
-msgstr ""
-
-#: diff.c:5598
-msgid "run external text conversion filters when comparing binary files"
-msgstr ""
-
-#: diff.c:5600
-msgid "<when>"
-msgstr ""
-
-#: diff.c:5601
-msgid "ignore changes to submodules in the diff generation"
-msgstr ""
-
-#: diff.c:5604
-msgid "<format>"
-msgstr ""
-
-#: diff.c:5605
-msgid "specify how differences in submodules are shown"
-msgstr ""
-
-#: diff.c:5609
-msgid "hide 'git add -N' entries from the index"
-msgstr ""
-
-#: diff.c:5612
-msgid "treat 'git add -N' entries as real in the index"
-msgstr ""
-
-#: diff.c:5614
-msgid "<string>"
-msgstr ""
-
-#: diff.c:5615
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"string"
-msgstr ""
-
-#: diff.c:5618
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"regex"
-msgstr ""
-
-#: diff.c:5621
-msgid "show all changes in the changeset with -S or -G"
-msgstr ""
-
-#: diff.c:5624
-msgid "treat <string> in -S as extended POSIX regular expression"
-msgstr ""
-
-#: diff.c:5627
-msgid "control the order in which files appear in the output"
-msgstr ""
-
-#: diff.c:5628 diff.c:5631
-msgid "<path>"
-msgstr ""
-
-#: diff.c:5629
-msgid "show the change in the specified path first"
-msgstr ""
-
-#: diff.c:5632
-msgid "skip the output to the specified path"
-msgstr ""
-
-#: diff.c:5634
-msgid "<object-id>"
-msgstr ""
-
-#: diff.c:5635
-msgid ""
-"look for differences that change the number of occurrences of the specified "
-"object"
-msgstr ""
-
-#: diff.c:5637
-msgid "[(A|C|D|M|R|T|U|X|B)...[*]]"
-msgstr ""
-
-#: diff.c:5638
-msgid "select files by diff type"
-msgstr ""
-
-#: diff.c:5640
-msgid "<file>"
-msgstr ""
-
-#: diff.c:5641
-msgid "output to a specific file"
-msgstr ""
-
-#: diff.c:6321
-msgid "exhaustive rename detection was skipped due to too many files."
-msgstr ""
-
-#: diff.c:6324
-msgid "only found copies from modified paths due to too many files."
-msgstr ""
-
-#: diff.c:6327
-#, c-format
-msgid ""
-"you may want to set your %s variable to at least %d and retry the command."
-msgstr ""
-
-#: diffcore-order.c:24
-#, c-format
-msgid "failed to read orderfile '%s'"
-msgstr ""
-
-#: diffcore-rename.c:1564
-msgid "Performing inexact rename detection"
-msgstr ""
-
-#: diffcore-rotate.c:29
-#, c-format
-msgid "No such path '%s' in the diff"
-msgstr ""
-
-#: dir.c:593
-#, c-format
-msgid "pathspec '%s' did not match any file(s) known to git"
-msgstr ""
-
-#: dir.c:733 dir.c:762 dir.c:775
-#, c-format
-msgid "unrecognized pattern: '%s'"
-msgstr ""
-
-#: dir.c:790 dir.c:804
-#, c-format
-msgid "unrecognized negative pattern: '%s'"
-msgstr ""
-
-#: dir.c:820
-#, c-format
-msgid "your sparse-checkout file may have issues: pattern '%s' is repeated"
-msgstr ""
-
-#: dir.c:828
-msgid "disabling cone pattern matching"
-msgstr ""
-
-#: dir.c:1212
-#, c-format
-msgid "cannot use %s as an exclude file"
-msgstr ""
-
-#: dir.c:2419
-#, c-format
-msgid "could not open directory '%s'"
-msgstr ""
-
-#: dir.c:2721
-msgid "failed to get kernel name and information"
-msgstr ""
-
-#: dir.c:2846
-msgid "untracked cache is disabled on this system or location"
-msgstr ""
-
-#: dir.c:3119
-msgid ""
-"No directory name could be guessed.\n"
-"Please specify a directory on the command line"
-msgstr ""
-
-#: dir.c:3807
-#, c-format
-msgid "index file corrupt in repo %s"
-msgstr ""
-
-#: dir.c:3854 dir.c:3859
-#, c-format
-msgid "could not create directories for %s"
-msgstr ""
-
-#: dir.c:3888
-#, c-format
-msgid "could not migrate git directory from '%s' to '%s'"
-msgstr ""
-
-#: editor.c:74
-#, c-format
-msgid "hint: Waiting for your editor to close the file...%c"
-msgstr ""
-
-#: entry.c:179
-msgid "Filtering content"
-msgstr ""
-
-#: entry.c:500
-#, c-format
-msgid "could not stat file '%s'"
-msgstr ""
-
-#: environment.c:147
-#, c-format
-msgid "bad git namespace path \"%s\""
-msgstr ""
-
-#: exec-cmd.c:363
-#, c-format
-msgid "too many args to run %s"
-msgstr ""
-
-#: fetch-pack.c:194
-msgid "git fetch-pack: expected shallow list"
-msgstr ""
-
-#: fetch-pack.c:197
-msgid "git fetch-pack: expected a flush packet after shallow list"
-msgstr ""
-
-#: fetch-pack.c:208
-msgid "git fetch-pack: expected ACK/NAK, got a flush packet"
-msgstr ""
-
-#: fetch-pack.c:228
-#, c-format
-msgid "git fetch-pack: expected ACK/NAK, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:239
-msgid "unable to write to remote"
-msgstr ""
-
-#: fetch-pack.c:397 fetch-pack.c:1460
-#, c-format
-msgid "invalid shallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:403 fetch-pack.c:1466
-#, c-format
-msgid "invalid unshallow line: %s"
-msgstr ""
-
-#: fetch-pack.c:405 fetch-pack.c:1468
-#, c-format
-msgid "object not found: %s"
-msgstr ""
-
-#: fetch-pack.c:408 fetch-pack.c:1471
-#, c-format
-msgid "error in object: %s"
-msgstr ""
-
-#: fetch-pack.c:410 fetch-pack.c:1473
-#, c-format
-msgid "no shallow found: %s"
-msgstr ""
-
-#: fetch-pack.c:413 fetch-pack.c:1477
-#, c-format
-msgid "expected shallow/unshallow, got %s"
-msgstr ""
-
-#: fetch-pack.c:453
-#, c-format
-msgid "got %s %d %s"
-msgstr ""
-
-#: fetch-pack.c:470
-#, c-format
-msgid "invalid commit %s"
-msgstr ""
-
-#: fetch-pack.c:501
-msgid "giving up"
-msgstr ""
-
-#: fetch-pack.c:514 progress.h:25
-msgid "done"
-msgstr ""
-
-#: fetch-pack.c:526
-#, c-format
-msgid "got %s (%d) %s"
-msgstr ""
-
-#: fetch-pack.c:562
-#, c-format
-msgid "Marking %s as complete"
-msgstr ""
-
-#: fetch-pack.c:784
-#, c-format
-msgid "already have %s (%s)"
-msgstr ""
-
-#: fetch-pack.c:870
-msgid "fetch-pack: unable to fork off sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:878
-msgid "protocol error: bad pack header"
-msgstr ""
-
-#: fetch-pack.c:974
-#, c-format
-msgid "fetch-pack: unable to fork off %s"
-msgstr ""
-
-#: fetch-pack.c:980
-msgid "fetch-pack: invalid index-pack output"
-msgstr ""
-
-#: fetch-pack.c:997
-#, c-format
-msgid "%s failed"
-msgstr ""
-
-#: fetch-pack.c:999
-msgid "error in sideband demultiplexer"
-msgstr ""
-
-#: fetch-pack.c:1048
-#, c-format
-msgid "Server version is %.*s"
-msgstr ""
-
-#: fetch-pack.c:1056 fetch-pack.c:1062 fetch-pack.c:1065 fetch-pack.c:1071
-#: fetch-pack.c:1075 fetch-pack.c:1079 fetch-pack.c:1083 fetch-pack.c:1087
-#: fetch-pack.c:1091 fetch-pack.c:1095 fetch-pack.c:1099 fetch-pack.c:1103
-#: fetch-pack.c:1109 fetch-pack.c:1115 fetch-pack.c:1120 fetch-pack.c:1125
-#, c-format
-msgid "Server supports %s"
-msgstr ""
-
-#: fetch-pack.c:1058
-msgid "Server does not support shallow clients"
-msgstr ""
-
-#: fetch-pack.c:1118
-msgid "Server does not support --shallow-since"
-msgstr ""
-
-#: fetch-pack.c:1123
-msgid "Server does not support --shallow-exclude"
-msgstr ""
-
-#: fetch-pack.c:1127
-msgid "Server does not support --deepen"
-msgstr ""
-
-#: fetch-pack.c:1129
-msgid "Server does not support this repository's object format"
-msgstr ""
-
-#: fetch-pack.c:1142
-msgid "no common commits"
-msgstr ""
-
-#: fetch-pack.c:1151 fetch-pack.c:1506 builtin/clone.c:1166
-msgid "source repository is shallow, reject to clone."
-msgstr ""
-
-#: fetch-pack.c:1157 fetch-pack.c:1705
-msgid "git fetch-pack: fetch failed."
-msgstr ""
-
-#: fetch-pack.c:1271
-#, c-format
-msgid "mismatched algorithms: client %s; server %s"
-msgstr ""
-
-#: fetch-pack.c:1275
-#, c-format
-msgid "the server does not support algorithm '%s'"
-msgstr ""
-
-#: fetch-pack.c:1308
-msgid "Server does not support shallow requests"
-msgstr ""
-
-#: fetch-pack.c:1315
-msgid "Server supports filter"
-msgstr ""
-
-#: fetch-pack.c:1358 fetch-pack.c:2087
-msgid "unable to write request to remote"
-msgstr ""
-
-#: fetch-pack.c:1376
-#, c-format
-msgid "error reading section header '%s'"
-msgstr ""
-
-#: fetch-pack.c:1382
-#, c-format
-msgid "expected '%s', received '%s'"
-msgstr ""
-
-#: fetch-pack.c:1416
-#, c-format
-msgid "unexpected acknowledgment line: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1421
-#, c-format
-msgid "error processing acks: %d"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1435
-#, c-format
-msgid "expected packfile to be sent after '%s'"
-msgstr ""
-
-#. TRANSLATORS: The parameter will be 'ready', a protocol
-#. keyword.
-#.
-#: fetch-pack.c:1441
-#, c-format
-msgid "expected no other sections to be sent after no '%s'"
-msgstr ""
-
-#: fetch-pack.c:1482
-#, c-format
-msgid "error processing shallow info: %d"
-msgstr ""
-
-#: fetch-pack.c:1531
-#, c-format
-msgid "expected wanted-ref, got '%s'"
-msgstr ""
-
-#: fetch-pack.c:1536
-#, c-format
-msgid "unexpected wanted-ref: '%s'"
-msgstr ""
-
-#: fetch-pack.c:1541
-#, c-format
-msgid "error processing wanted refs: %d"
-msgstr ""
-
-#: fetch-pack.c:1571
-msgid "git fetch-pack: expected response end packet"
-msgstr ""
-
-#: fetch-pack.c:1983
-msgid "no matching remote head"
-msgstr ""
-
-#: fetch-pack.c:2006 builtin/clone.c:587
-msgid "remote did not send all necessary objects"
-msgstr ""
-
-#: fetch-pack.c:2109
-msgid "unexpected 'ready' from remote"
-msgstr ""
-
-#: fetch-pack.c:2132
-#, c-format
-msgid "no such remote ref %s"
-msgstr ""
-
-#: fetch-pack.c:2135
-#, c-format
-msgid "Server does not allow request for unadvertised object %s"
-msgstr ""
-
-#: fsmonitor-ipc.c:119
-#, c-format
-msgid "fsmonitor_ipc__send_query: invalid path '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:125
-#, c-format
-msgid "fsmonitor_ipc__send_query: unspecified error on '%s'"
-msgstr ""
-
-#: fsmonitor-ipc.c:155
-msgid "fsmonitor--daemon is not running"
-msgstr ""
-
-#: fsmonitor-ipc.c:164
-#, c-format
-msgid "could not send '%s' command to fsmonitor--daemon"
-msgstr ""
-
-#: gpg-interface.c:329 gpg-interface.c:456 gpg-interface.c:995
-#: gpg-interface.c:1011
-msgid "could not create temporary file"
-msgstr ""
-
-#: gpg-interface.c:332 gpg-interface.c:459
-#, c-format
-msgid "failed writing detached signature to '%s'"
-msgstr ""
-
-#: gpg-interface.c:450
-msgid ""
-"gpg.ssh.allowedSignersFile needs to be configured and exist for ssh "
-"signature verification"
-msgstr ""
-
-#: gpg-interface.c:479
-msgid ""
-"ssh-keygen -Y find-principals/verify is needed for ssh signature "
-"verification (available in openssh version 8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:550
-#, c-format
-msgid "ssh signing revocation file configured but not found: %s"
-msgstr ""
-
-#: gpg-interface.c:638
-#, c-format
-msgid "bad/incompatible signature '%s'"
-msgstr ""
-
-#: gpg-interface.c:815 gpg-interface.c:820
-#, c-format
-msgid "failed to get the ssh fingerprint for key '%s'"
-msgstr ""
-
-#: gpg-interface.c:843
-msgid ""
-"either user.signingkey or gpg.ssh.defaultKeyCommand needs to be configured"
-msgstr ""
-
-#: gpg-interface.c:865
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand succeeded but returned no keys: %s %s"
-msgstr ""
-
-#: gpg-interface.c:871
-#, c-format
-msgid "gpg.ssh.defaultKeyCommand failed: %s %s"
-msgstr ""
-
-#: gpg-interface.c:966
-msgid "gpg failed to sign the data"
-msgstr ""
-
-#: gpg-interface.c:988
-msgid "user.signingkey needs to be set for ssh signing"
-msgstr ""
-
-#: gpg-interface.c:999
-#, c-format
-msgid "failed writing ssh signing key to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1017
-#, c-format
-msgid "failed writing ssh signing key buffer to '%s'"
-msgstr ""
-
-#: gpg-interface.c:1035
-msgid ""
-"ssh-keygen -Y sign is needed for ssh signing (available in openssh version "
-"8.2p1+)"
-msgstr ""
-
-#: gpg-interface.c:1047
-#, c-format
-msgid "failed reading ssh signing data buffer from '%s'"
-msgstr ""
-
-#: graph.c:98
-#, c-format
-msgid "ignored invalid color '%.*s' in log.graphColors"
-msgstr ""
-
-#: grep.c:446
-msgid ""
-"given pattern contains NULL byte (via -f <file>). This is only supported "
-"with -P under PCRE v2"
-msgstr ""
-
-#: grep.c:1859
-#, c-format
-msgid "'%s': unable to read %s"
-msgstr ""
-
-#: grep.c:1876 setup.c:178 builtin/clone.c:308 builtin/diff.c:90
-#: builtin/rm.c:136
-#, c-format
-msgid "failed to stat '%s'"
-msgstr ""
-
-#: grep.c:1887
-#, c-format
-msgid "'%s': short read"
-msgstr ""
-
-#: help.c:25
-msgid "start a working area (see also: git help tutorial)"
-msgstr ""
-
-#: help.c:26
-msgid "work on the current change (see also: git help everyday)"
-msgstr ""
-
-#: help.c:27
-msgid "examine the history and state (see also: git help revisions)"
-msgstr ""
-
-#: help.c:28
-msgid "grow, mark and tweak your common history"
-msgstr ""
-
-#: help.c:29
-msgid "collaborate (see also: git help workflows)"
-msgstr ""
-
-#: help.c:33
-msgid "Main Porcelain Commands"
-msgstr ""
-
-#: help.c:34
-msgid "Ancillary Commands / Manipulators"
-msgstr ""
-
-#: help.c:35
-msgid "Ancillary Commands / Interrogators"
-msgstr ""
-
-#: help.c:36
-msgid "Interacting with Others"
-msgstr ""
-
-#: help.c:37
-msgid "Low-level Commands / Manipulators"
-msgstr ""
-
-#: help.c:38
-msgid "Low-level Commands / Interrogators"
-msgstr ""
-
-#: help.c:39
-msgid "Low-level Commands / Syncing Repositories"
-msgstr ""
-
-#: help.c:40
-msgid "Low-level Commands / Internal Helpers"
-msgstr ""
-
-#: help.c:316
-#, c-format
-msgid "available git commands in '%s'"
-msgstr ""
-
-#: help.c:323
-msgid "git commands available from elsewhere on your $PATH"
-msgstr ""
-
-#: help.c:332
-msgid "These are common Git commands used in various situations:"
-msgstr ""
-
-#: help.c:382 git.c:100
-#, c-format
-msgid "unsupported command listing type '%s'"
-msgstr ""
-
-#: help.c:422
-msgid "The Git concept guides are:"
-msgstr ""
-
-#: help.c:446
-msgid "External commands"
-msgstr ""
-
-#: help.c:468
-msgid "Command aliases"
-msgstr ""
-
-#: help.c:486
-msgid "See 'git help <command>' to read about a specific subcommand"
-msgstr ""
-
-#: help.c:563
-#, c-format
-msgid ""
-"'%s' appears to be a git command, but we were not\n"
-"able to execute it. Maybe git-%s is broken?"
-msgstr ""
-
-#: help.c:585 help.c:682
-#, c-format
-msgid "git: '%s' is not a git command. See 'git --help'."
-msgstr ""
-
-#: help.c:633
-msgid "Uh oh. Your system reports no Git commands at all."
-msgstr ""
-
-#: help.c:655
-#, c-format
-msgid "WARNING: You called a Git command named '%s', which does not exist."
-msgstr ""
-
-#: help.c:660
-#, c-format
-msgid "Continuing under the assumption that you meant '%s'."
-msgstr ""
-
-#: help.c:666
-#, c-format
-msgid "Run '%s' instead [y/N]? "
-msgstr ""
-
-#: help.c:674
-#, c-format
-msgid "Continuing in %0.1f seconds, assuming that you meant '%s'."
-msgstr ""
-
-#: help.c:686
-msgid ""
-"\n"
-"The most similar command is"
-msgid_plural ""
-"\n"
-"The most similar commands are"
-msgstr[0] ""
-msgstr[1] ""
-
-#: help.c:729
-msgid "git version [<options>]"
-msgstr ""
-
-#: help.c:784
-#, c-format
-msgid "%s: %s - %s"
-msgstr ""
-
-#: help.c:788
-msgid ""
-"\n"
-"Did you mean this?"
-msgid_plural ""
-"\n"
-"Did you mean one of these?"
-msgstr[0] ""
-msgstr[1] ""
-
-#: hook.c:28
-#, c-format
-msgid ""
-"The '%s' hook was ignored because it's not set as executable.\n"
-"You can disable this warning with `git config advice.ignoredHook false`."
-msgstr ""
-
-#: hook.c:87
-#, c-format
-msgid "Couldn't start hook '%s'\n"
-msgstr ""
-
-#: ident.c:354
-msgid "Author identity unknown\n"
-msgstr ""
-
-#: ident.c:357
-msgid "Committer identity unknown\n"
-msgstr ""
-
-#: ident.c:363
-msgid ""
-"\n"
-"*** Please tell me who you are.\n"
-"\n"
-"Run\n"
-"\n"
-"  git config --global user.email \"you@example.com\"\n"
-"  git config --global user.name \"Your Name\"\n"
-"\n"
-"to set your account's default identity.\n"
-"Omit --global to set the identity only in this repository.\n"
-"\n"
-msgstr ""
-
-#: ident.c:398
-msgid "no email was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:403
-#, c-format
-msgid "unable to auto-detect email address (got '%s')"
-msgstr ""
-
-#: ident.c:420
-msgid "no name was given and auto-detection is disabled"
-msgstr ""
-
-#: ident.c:426
-#, c-format
-msgid "unable to auto-detect name (got '%s')"
-msgstr ""
-
-#: ident.c:434
-#, c-format
-msgid "empty ident name (for <%s>) not allowed"
-msgstr ""
-
-#: ident.c:440
-#, c-format
-msgid "name consists only of disallowed characters: %s"
-msgstr ""
-
-#: ident.c:455 builtin/commit.c:649
-#, c-format
-msgid "invalid date format: %s"
-msgstr ""
-
-#: list-objects-filter-options.c:68
-msgid "expected 'tree:<depth>'"
-msgstr ""
-
-#: list-objects-filter-options.c:83
-msgid "sparse:path filters support has been dropped"
-msgstr ""
-
-#: list-objects-filter-options.c:90
-#, c-format
-msgid "'%s' for 'object:type=<type>' is not a valid object type"
-msgstr ""
-
-#: list-objects-filter-options.c:109
-#, c-format
-msgid "invalid filter-spec '%s'"
-msgstr ""
-
-#: list-objects-filter-options.c:125
-#, c-format
-msgid "must escape char in sub-filter-spec: '%c'"
-msgstr ""
-
-#: list-objects-filter-options.c:167
-msgid "expected something after combine:"
-msgstr ""
-
-#: list-objects-filter-options.c:249
-msgid "multiple filter-specs cannot be combined"
-msgstr ""
-
-#: list-objects-filter-options.c:365
-msgid "unable to upgrade repository format to support partial clone"
-msgstr ""
-
-#: list-objects-filter.c:532
-#, c-format
-msgid "unable to access sparse blob in '%s'"
-msgstr ""
-
-#: list-objects-filter.c:535
-#, c-format
-msgid "unable to parse sparse filter data in %s"
-msgstr ""
-
-#: list-objects.c:144
-#, c-format
-msgid "entry '%s' in tree %s has tree mode, but is not a tree"
-msgstr ""
-
-#: list-objects.c:157
-#, c-format
-msgid "entry '%s' in tree %s has blob mode, but is not a blob"
-msgstr ""
-
-#: list-objects.c:415
-#, c-format
-msgid "unable to load root tree for commit %s"
-msgstr ""
-
-#: lockfile.c:152
-#, c-format
-msgid ""
-"Unable to create '%s.lock': %s.\n"
-"\n"
-"Another git process seems to be running in this repository, e.g.\n"
-"an editor opened by 'git commit'. Please make sure all processes\n"
-"are terminated then try again. If it still fails, a git process\n"
-"may have crashed in this repository earlier:\n"
-"remove the file manually to continue."
-msgstr ""
-
-#: lockfile.c:160
-#, c-format
-msgid "Unable to create '%s.lock': %s"
-msgstr ""
-
-#: ls-refs.c:175
-#, c-format
-msgid "unexpected line: '%s'"
-msgstr ""
-
-#: ls-refs.c:179
-msgid "expected flush after ls-refs arguments"
-msgstr ""
-
-#: mailinfo.c:1050
-msgid "quoted CRLF detected"
-msgstr ""
-
-#: mailinfo.c:1254 builtin/am.c:185 builtin/mailinfo.c:46
-#, c-format
-msgid "bad action '%s' for '%s'"
-msgstr ""
-
-#: merge-ort.c:1630 merge-recursive.c:1214
-#, c-format
-msgid "Failed to merge submodule %s (not checked out)"
-msgstr ""
-
-#: merge-ort.c:1639 merge-recursive.c:1221
-#, c-format
-msgid "Failed to merge submodule %s (commits not present)"
-msgstr ""
-
-#: merge-ort.c:1648 merge-recursive.c:1228
-#, c-format
-msgid "Failed to merge submodule %s (commits don't follow merge-base)"
-msgstr ""
-
-#: merge-ort.c:1658 merge-ort.c:1666
-#, c-format
-msgid "Note: Fast-forwarding submodule %s to %s"
-msgstr ""
-
-#: merge-ort.c:1688
-#, c-format
-msgid "Failed to merge submodule %s"
-msgstr ""
-
-#: merge-ort.c:1695
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but a possible merge resolution exists:\n"
-"%s\n"
-msgstr ""
-
-#: merge-ort.c:1699 merge-recursive.c:1284
-#, c-format
-msgid ""
-"If this is correct simply add it to the index for example\n"
-"by using:\n"
-"\n"
-"  git update-index --cacheinfo 160000 %s \"%s\"\n"
-"\n"
-"which will accept this suggestion.\n"
-msgstr ""
-
-#: merge-ort.c:1712
-#, c-format
-msgid ""
-"Failed to merge submodule %s, but multiple possible merges exist:\n"
-"%s"
-msgstr ""
-
-#: merge-ort.c:1937 merge-recursive.c:1375
-msgid "Failed to execute internal merge"
-msgstr ""
-
-#: merge-ort.c:1942 merge-recursive.c:1380
-#, c-format
-msgid "Unable to add %s to database"
-msgstr ""
-
-#: merge-ort.c:1949 merge-recursive.c:1413
-#, c-format
-msgid "Auto-merging %s"
-msgstr ""
-
-#: merge-ort.c:2088 merge-recursive.c:2135
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Existing file/dir at %s in the way of "
-"implicit directory rename(s) putting the following path(s) there: %s."
-msgstr ""
-
-#: merge-ort.c:2098 merge-recursive.c:2145
-#, c-format
-msgid ""
-"CONFLICT (implicit dir rename): Cannot map more than one path to %s; "
-"implicit directory renames tried to put these paths there: %s"
-msgstr ""
-
-#: merge-ort.c:2156
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to rename %s to; it was "
-"renamed to multiple other directories, with no destination getting a "
-"majority of the files."
-msgstr ""
-
-#: merge-ort.c:2310 merge-recursive.c:2481
-#, c-format
-msgid ""
-"WARNING: Avoiding applying %s -> %s rename to %s, because %s itself was "
-"renamed."
-msgstr ""
-
-#: merge-ort.c:2450 merge-recursive.c:3264
-#, c-format
-msgid ""
-"Path updated: %s added in %s inside a directory that was renamed in %s; "
-"moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2457 merge-recursive.c:3271
-#, c-format
-msgid ""
-"Path updated: %s renamed to %s in %s, inside a directory that was renamed in "
-"%s; moving it to %s."
-msgstr ""
-
-#: merge-ort.c:2470 merge-recursive.c:3267
-#, c-format
-msgid ""
-"CONFLICT (file location): %s added in %s inside a directory that was renamed "
-"in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2478 merge-recursive.c:3274
-#, c-format
-msgid ""
-"CONFLICT (file location): %s renamed to %s in %s, inside a directory that "
-"was renamed in %s, suggesting it should perhaps be moved to %s."
-msgstr ""
-
-#: merge-ort.c:2634
-#, c-format
-msgid "CONFLICT (rename/rename): %s renamed to %s in %s and to %s in %s."
-msgstr ""
-
-#: merge-ort.c:2729
-#, c-format
-msgid ""
-"CONFLICT (rename involved in collision): rename of %s -> %s has content "
-"conflicts AND collides with another path; this may result in nested conflict "
-"markers."
-msgstr ""
-
-#: merge-ort.c:2748 merge-ort.c:2772
-#, c-format
-msgid "CONFLICT (rename/delete): %s renamed to %s in %s, but deleted in %s."
-msgstr ""
-
-#: merge-ort.c:3261 merge-recursive.c:3025
-#, c-format
-msgid "cannot read object %s"
-msgstr ""
-
-#: merge-ort.c:3264 merge-recursive.c:3028
-#, c-format
-msgid "object %s is not a blob"
-msgstr ""
-
-#: merge-ort.c:3693
-#, c-format
-msgid ""
-"CONFLICT (file/directory): directory in the way of %s from %s; moving it to "
-"%s instead."
-msgstr ""
-
-#: merge-ort.c:3770
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed both "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3777
-#, c-format
-msgid ""
-"CONFLICT (distinct types): %s had different types on each side; renamed one "
-"of them so each can be recorded somewhere."
-msgstr ""
-
-#: merge-ort.c:3866 merge-recursive.c:3104
-msgid "content"
-msgstr ""
-
-#: merge-ort.c:3868 merge-recursive.c:3108
-msgid "add/add"
-msgstr ""
-
-#: merge-ort.c:3870 merge-recursive.c:3153
-msgid "submodule"
-msgstr ""
-
-#: merge-ort.c:3872 merge-recursive.c:3154
-#, c-format
-msgid "CONFLICT (%s): Merge conflict in %s"
-msgstr ""
-
-#: merge-ort.c:3916
-#, c-format
-msgid ""
-"CONFLICT (modify/delete): %s deleted in %s and modified in %s.  Version %s "
-"of %s left in tree."
-msgstr ""
-
-#: merge-ort.c:4212
-#, c-format
-msgid ""
-"Note: %s not up to date and in way of checking out conflicted version; old "
-"copy renamed to %s"
-msgstr ""
-
-#. TRANSLATORS: The %s arguments are: 1) tree hash of a merge
-#. base, and 2-3) the trees for the two trees we're merging.
-#.
-#: merge-ort.c:4586
-#, c-format
-msgid "collecting merge info failed for trees %s, %s, %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:13 merge-recursive.c:3723
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"  %s"
-msgstr ""
-
-#: merge-ort-wrappers.c:33 merge-recursive.c:3485 builtin/merge.c:405
-msgid "Already up to date."
-msgstr ""
-
-#: merge-recursive.c:353
-msgid "(bad commit)\n"
-msgstr ""
-
-#: merge-recursive.c:381
-#, c-format
-msgid "add_cacheinfo failed for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:390
-#, c-format
-msgid "add_cacheinfo failed to refresh for path '%s'; merge aborting."
-msgstr ""
-
-#: merge-recursive.c:881
-#, c-format
-msgid "failed to create path '%s'%s"
-msgstr ""
-
-#: merge-recursive.c:892
-#, c-format
-msgid "Removing %s to make room for subdirectory\n"
-msgstr ""
-
-#: merge-recursive.c:906 merge-recursive.c:925
-msgid ": perhaps a D/F conflict?"
-msgstr ""
-
-#: merge-recursive.c:915
-#, c-format
-msgid "refusing to lose untracked file at '%s'"
-msgstr ""
-
-#: merge-recursive.c:956 builtin/cat-file.c:47
-#, c-format
-msgid "cannot read object %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:961
-#, c-format
-msgid "blob expected for %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:986
-#, c-format
-msgid "failed to open '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:997
-#, c-format
-msgid "failed to symlink '%s': %s"
-msgstr ""
-
-#: merge-recursive.c:1002
-#, c-format
-msgid "do not know what to do with %06o %s '%s'"
-msgstr ""
-
-#: merge-recursive.c:1236 merge-recursive.c:1249
-#, c-format
-msgid "Fast-forwarding submodule %s to the following commit:"
-msgstr ""
-
-#: merge-recursive.c:1239 merge-recursive.c:1252
-#, c-format
-msgid "Fast-forwarding submodule %s"
-msgstr ""
-
-#: merge-recursive.c:1276
-#, c-format
-msgid "Failed to merge submodule %s (merge following commits not found)"
-msgstr ""
-
-#: merge-recursive.c:1280
-#, c-format
-msgid "Failed to merge submodule %s (not fast-forward)"
-msgstr ""
-
-#: merge-recursive.c:1281
-msgid "Found a possible merge resolution for the submodule:\n"
-msgstr ""
-
-#: merge-recursive.c:1293
-#, c-format
-msgid "Failed to merge submodule %s (multiple merges found)"
-msgstr ""
-
-#: merge-recursive.c:1437
-#, c-format
-msgid "Error: Refusing to lose untracked file at %s; writing to %s instead."
-msgstr ""
-
-#: merge-recursive.c:1509
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree."
-msgstr ""
-
-#: merge-recursive.c:1514
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree."
-msgstr ""
-
-#: merge-recursive.c:1521
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
-"in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1526
-#, c-format
-msgid ""
-"CONFLICT (%s/delete): %s deleted in %s and %s to %s in %s. Version %s of %s "
-"left in tree at %s."
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "rename"
-msgstr ""
-
-#: merge-recursive.c:1561
-msgid "renamed"
-msgstr ""
-
-#: merge-recursive.c:1612 merge-recursive.c:2518 merge-recursive.c:3181
-#, c-format
-msgid "Refusing to lose dirty file at %s"
-msgstr ""
-
-#: merge-recursive.c:1622
-#, c-format
-msgid "Refusing to lose untracked file at %s, even though it's in the way."
-msgstr ""
-
-#: merge-recursive.c:1680
-#, c-format
-msgid "CONFLICT (rename/add): Rename %s->%s in %s.  Added %s in %s"
-msgstr ""
-
-#: merge-recursive.c:1711
-#, c-format
-msgid "%s is a directory in %s adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1716
-#, c-format
-msgid "Refusing to lose untracked file at %s; adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:1743
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
-"\"->\"%s\" in \"%s\"%s"
-msgstr ""
-
-#: merge-recursive.c:1748
-msgid " (left unresolved)"
-msgstr ""
-
-#: merge-recursive.c:1840
-#, c-format
-msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
-msgstr ""
-
-#: merge-recursive.c:2103
-#, c-format
-msgid ""
-"CONFLICT (directory rename split): Unclear where to place %s because "
-"directory %s was renamed to multiple other directories, with no destination "
-"getting a majority of the files."
-msgstr ""
-
-#: merge-recursive.c:2237
-#, c-format
-msgid ""
-"CONFLICT (rename/rename): Rename directory %s->%s in %s. Rename directory %s-"
-">%s in %s"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modify"
-msgstr ""
-
-#: merge-recursive.c:3092
-msgid "modified"
-msgstr ""
-
-#: merge-recursive.c:3131
-#, c-format
-msgid "Skipped %s (merged same as existing)"
-msgstr ""
-
-#: merge-recursive.c:3184
-#, c-format
-msgid "Adding as %s instead"
-msgstr ""
-
-#: merge-recursive.c:3388
-#, c-format
-msgid "Removing %s"
-msgstr ""
-
-#: merge-recursive.c:3411
-msgid "file/directory"
-msgstr ""
-
-#: merge-recursive.c:3416
-msgid "directory/file"
-msgstr ""
-
-#: merge-recursive.c:3423
-#, c-format
-msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
-msgstr ""
-
-#: merge-recursive.c:3432
-#, c-format
-msgid "Adding %s"
-msgstr ""
-
-#: merge-recursive.c:3441
-#, c-format
-msgid "CONFLICT (add/add): Merge conflict in %s"
-msgstr ""
-
-#: merge-recursive.c:3494
-#, c-format
-msgid "merging of trees %s and %s failed"
-msgstr ""
-
-#: merge-recursive.c:3588
-msgid "Merging:"
-msgstr ""
-
-#: merge-recursive.c:3601
-#, c-format
-msgid "found %u common ancestor:"
-msgid_plural "found %u common ancestors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: merge-recursive.c:3651
-msgid "merge returned no commit"
-msgstr ""
-
-#: merge-recursive.c:3823
-#, c-format
-msgid "Could not parse object '%s'"
-msgstr ""
-
-#: merge-recursive.c:3841 builtin/merge.c:720 builtin/merge.c:912
-#: builtin/stash.c:489
-msgid "Unable to write index."
-msgstr ""
-
-#: merge.c:41
-msgid "failed to read the cache"
-msgstr ""
-
-#: merge.c:102 rerere.c:705 builtin/am.c:1989 builtin/am.c:2023
-#: builtin/checkout.c:603 builtin/checkout.c:865 builtin/clone.c:714
-#: builtin/stash.c:269
-msgid "unable to write new index file"
-msgstr ""
-
-#: midx.c:79
-msgid "multi-pack-index OID fanout is of the wrong size"
-msgstr ""
-
-#: midx.c:112
-#, c-format
-msgid "multi-pack-index file %s is too small"
-msgstr ""
-
-#: midx.c:128
-#, c-format
-msgid "multi-pack-index signature 0x%08x does not match signature 0x%08x"
-msgstr ""
-
-#: midx.c:133
-#, c-format
-msgid "multi-pack-index version %d not recognized"
-msgstr ""
-
-#: midx.c:138
-#, c-format
-msgid "multi-pack-index hash version %u does not match version %u"
-msgstr ""
-
-#: midx.c:155
-msgid "multi-pack-index missing required pack-name chunk"
-msgstr ""
-
-#: midx.c:157
-msgid "multi-pack-index missing required OID fanout chunk"
-msgstr ""
-
-#: midx.c:159
-msgid "multi-pack-index missing required OID lookup chunk"
-msgstr ""
-
-#: midx.c:161
-msgid "multi-pack-index missing required object offsets chunk"
-msgstr ""
-
-#: midx.c:180
-#, c-format
-msgid "multi-pack-index pack names out of order: '%s' before '%s'"
-msgstr ""
-
-#: midx.c:228
-#, c-format
-msgid "bad pack-int-id: %u (%u total packs)"
-msgstr ""
-
-#: midx.c:278
-msgid "multi-pack-index stores a 64-bit offset, but off_t is too small"
-msgstr ""
-
-#: midx.c:509
-#, c-format
-msgid "failed to add packfile '%s'"
-msgstr ""
-
-#: midx.c:515
-#, c-format
-msgid "failed to open pack-index '%s'"
-msgstr ""
-
-#: midx.c:583
-#, c-format
-msgid "failed to locate object %d in packfile"
-msgstr ""
-
-#: midx.c:911
-msgid "cannot store reverse index file"
-msgstr ""
-
-#: midx.c:1009
-#, c-format
-msgid "could not parse line: %s"
-msgstr ""
-
-#: midx.c:1011
-#, c-format
-msgid "malformed line: %s"
-msgstr ""
-
-#: midx.c:1181
-msgid "ignoring existing multi-pack-index; checksum mismatch"
-msgstr ""
-
-#: midx.c:1206
-msgid "could not load pack"
-msgstr ""
-
-#: midx.c:1212
-#, c-format
-msgid "could not open index for %s"
-msgstr ""
-
-#: midx.c:1223
-msgid "Adding packfiles to multi-pack-index"
-msgstr ""
-
-#: midx.c:1266
-#, c-format
-msgid "unknown preferred pack: '%s'"
-msgstr ""
-
-#: midx.c:1311
-#, c-format
-msgid "cannot select preferred pack %s with no objects"
-msgstr ""
-
-#: midx.c:1343
-#, c-format
-msgid "did not see pack-file %s to drop"
-msgstr ""
-
-#: midx.c:1389
-#, c-format
-msgid "preferred pack '%s' is expired"
-msgstr ""
-
-#: midx.c:1402
-msgid "no pack files to index."
-msgstr ""
-
-#: midx.c:1409
-msgid "refusing to write multi-pack .bitmap without any objects"
-msgstr ""
-
-#: midx.c:1451
-msgid "could not write multi-pack bitmap"
-msgstr ""
-
-#: midx.c:1461
-msgid "could not write multi-pack-index"
-msgstr ""
-
-#: midx.c:1520 builtin/clean.c:37
-#, c-format
-msgid "failed to remove %s"
-msgstr ""
-
-#: midx.c:1553
-#, c-format
-msgid "failed to clear multi-pack-index at %s"
-msgstr ""
-
-#: midx.c:1616
-msgid "multi-pack-index file exists, but failed to parse"
-msgstr ""
-
-#: midx.c:1624
-msgid "incorrect checksum"
-msgstr ""
-
-#: midx.c:1627
-msgid "Looking for referenced packfiles"
-msgstr ""
-
-#: midx.c:1642
-#, c-format
-msgid ""
-"oid fanout out of order: fanout[%d] = %<PRIx32> > %<PRIx32> = fanout[%d]"
-msgstr ""
-
-#: midx.c:1647
-msgid "the midx contains no oid"
-msgstr ""
-
-#: midx.c:1656
-msgid "Verifying OID order in multi-pack-index"
-msgstr ""
-
-#: midx.c:1665
-#, c-format
-msgid "oid lookup out of order: oid[%d] = %s >= %s = oid[%d]"
-msgstr ""
-
-#: midx.c:1685
-msgid "Sorting objects by packfile"
-msgstr ""
-
-#: midx.c:1692
-msgid "Verifying object offsets"
-msgstr ""
-
-#: midx.c:1708
-#, c-format
-msgid "failed to load pack entry for oid[%d] = %s"
-msgstr ""
-
-#: midx.c:1714
-#, c-format
-msgid "failed to load pack-index for packfile %s"
-msgstr ""
-
-#: midx.c:1723
-#, c-format
-msgid "incorrect object offset for oid[%d] = %s: %<PRIx64> != %<PRIx64>"
-msgstr ""
-
-#: midx.c:1750
-msgid "Counting referenced objects"
-msgstr ""
-
-#: midx.c:1760
-msgid "Finding and deleting unreferenced packfiles"
-msgstr ""
-
-#: midx.c:1952
-msgid "could not start pack-objects"
-msgstr ""
-
-#: midx.c:1972
-msgid "could not finish pack-objects"
-msgstr ""
-
-#: name-hash.c:542
-#, c-format
-msgid "unable to create lazy_dir thread: %s"
-msgstr ""
-
-#: name-hash.c:564
-#, c-format
-msgid "unable to create lazy_name thread: %s"
-msgstr ""
-
-#: name-hash.c:570
-#, c-format
-msgid "unable to join lazy_name thread: %s"
-msgstr ""
-
-#: notes-merge.c:276
-#, c-format
-msgid ""
-"You have not concluded your previous notes merge (%s exists).\n"
-"Please, use 'git notes merge --commit' or 'git notes merge --abort' to "
-"commit/abort the previous merge before you start a new notes merge."
-msgstr ""
-
-#: notes-merge.c:283
-#, c-format
-msgid "You have not concluded your notes merge (%s exists)."
-msgstr ""
-
-#: notes-utils.c:46
-msgid "Cannot commit uninitialized/unreferenced notes tree"
-msgstr ""
-
-#: notes-utils.c:105
-#, c-format
-msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
-
-#: notes-utils.c:115
-#, c-format
-msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
-msgstr ""
-
-#. TRANSLATORS: The first %s is the name of
-#. the environment variable, the second %s is
-#. its value.
-#.
-#: notes-utils.c:145
-#, c-format
-msgid "Bad %s value: '%s'"
-msgstr ""
-
-#: object-file.c:457
-#, c-format
-msgid "object directory %s does not exist; check .git/objects/info/alternates"
-msgstr ""
-
-#: object-file.c:515
-#, c-format
-msgid "unable to normalize alternate object path: %s"
-msgstr ""
-
-#: object-file.c:589
-#, c-format
-msgid "%s: ignoring alternate object stores, nesting too deep"
-msgstr ""
-
-#: object-file.c:596
-#, c-format
-msgid "unable to normalize object directory: %s"
-msgstr ""
-
-#: object-file.c:639
-msgid "unable to fdopen alternates lockfile"
-msgstr ""
-
-#: object-file.c:657
-msgid "unable to read alternates file"
-msgstr ""
-
-#: object-file.c:664
-msgid "unable to move new alternates file into place"
-msgstr ""
-
-#: object-file.c:742
-#, c-format
-msgid "path '%s' does not exist"
-msgstr ""
-
-#: object-file.c:763
-#, c-format
-msgid "reference repository '%s' as a linked checkout is not supported yet."
-msgstr ""
-
-#: object-file.c:769
-#, c-format
-msgid "reference repository '%s' is not a local repository."
-msgstr ""
-
-#: object-file.c:775
-#, c-format
-msgid "reference repository '%s' is shallow"
-msgstr ""
-
-#: object-file.c:783
-#, c-format
-msgid "reference repository '%s' is grafted"
-msgstr ""
-
-#: object-file.c:814
-#, c-format
-msgid "could not find object directory matching %s"
-msgstr ""
-
-#: object-file.c:864
-#, c-format
-msgid "invalid line while parsing alternate refs: %s"
-msgstr ""
-
-#: object-file.c:1014
-#, c-format
-msgid "attempting to mmap %<PRIuMAX> over limit %<PRIuMAX>"
-msgstr ""
-
-#: object-file.c:1049
-#, c-format
-msgid "mmap failed%s"
-msgstr ""
-
-#: object-file.c:1230
-#, c-format
-msgid "object file %s is empty"
-msgstr ""
-
-#: object-file.c:1349 object-file.c:2588
-#, c-format
-msgid "corrupt loose object '%s'"
-msgstr ""
-
-#: object-file.c:1351 object-file.c:2592
-#, c-format
-msgid "garbage at end of loose object '%s'"
-msgstr ""
-
-#: object-file.c:1473
-#, c-format
-msgid "unable to parse %s header"
-msgstr ""
-
-#: object-file.c:1475
-msgid "invalid object type"
-msgstr ""
-
-#: object-file.c:1486
-#, c-format
-msgid "unable to unpack %s header"
-msgstr ""
-
-#: object-file.c:1490
-#, c-format
-msgid "header for %s too long, exceeds %d bytes"
-msgstr ""
-
-#: object-file.c:1720
-#, c-format
-msgid "failed to read object %s"
-msgstr ""
-
-#: object-file.c:1724
-#, c-format
-msgid "replacement %s not found for %s"
-msgstr ""
-
-#: object-file.c:1728
-#, c-format
-msgid "loose object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1732
-#, c-format
-msgid "packed object %s (stored in %s) is corrupt"
-msgstr ""
-
-#: object-file.c:1855
-#, c-format
-msgid "unable to write file %s"
-msgstr ""
-
-#: object-file.c:1862
-#, c-format
-msgid "unable to set permission to '%s'"
-msgstr ""
-
-#: object-file.c:1869
-msgid "file write error"
-msgstr ""
-
-#: object-file.c:1904
-msgid "error when closing loose object file"
-msgstr ""
-
-#: object-file.c:1971
-#, c-format
-msgid "insufficient permission for adding an object to repository database %s"
-msgstr ""
-
-#: object-file.c:1973
-msgid "unable to create temporary file"
-msgstr ""
-
-#: object-file.c:1997
-msgid "unable to write loose object file"
-msgstr ""
-
-#: object-file.c:2003
-#, c-format
-msgid "unable to deflate new object %s (%d)"
-msgstr ""
-
-#: object-file.c:2007
-#, c-format
-msgid "deflateEnd on object %s failed (%d)"
-msgstr ""
-
-#: object-file.c:2011
-#, c-format
-msgid "confused by unstable object source data for %s"
-msgstr ""
-
-#: object-file.c:2022 builtin/pack-objects.c:1251
-#, c-format
-msgid "failed utime() on %s"
-msgstr ""
-
-#: object-file.c:2100
-#, c-format
-msgid "cannot read object for %s"
-msgstr ""
-
-#: object-file.c:2151
-msgid "corrupt commit"
-msgstr ""
-
-#: object-file.c:2159
-msgid "corrupt tag"
-msgstr ""
-
-#: object-file.c:2259
-#, c-format
-msgid "read error while indexing %s"
-msgstr ""
-
-#: object-file.c:2262
-#, c-format
-msgid "short read while indexing %s"
-msgstr ""
-
-#: object-file.c:2335 object-file.c:2345
-#, c-format
-msgid "%s: failed to insert into database"
-msgstr ""
-
-#: object-file.c:2351
-#, c-format
-msgid "%s: unsupported file type"
-msgstr ""
-
-#: object-file.c:2375 builtin/fetch.c:1494
-#, c-format
-msgid "%s is not a valid object"
-msgstr ""
-
-#: object-file.c:2377
-#, c-format
-msgid "%s is not a valid '%s' object"
-msgstr ""
-
-#: object-file.c:2404
-#, c-format
-msgid "unable to open %s"
-msgstr ""
-
-#: object-file.c:2599
-#, c-format
-msgid "hash mismatch for %s (expected %s)"
-msgstr ""
-
-#: object-file.c:2622
-#, c-format
-msgid "unable to mmap %s"
-msgstr ""
-
-#: object-file.c:2628
-#, c-format
-msgid "unable to unpack header of %s"
-msgstr ""
-
-#: object-file.c:2633
-#, c-format
-msgid "unable to parse header of %s"
-msgstr ""
-
-#: object-file.c:2644
-#, c-format
-msgid "unable to unpack contents of %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous object
-#. output shown when we cannot look up or parse the
-#. object in question. E.g. "deadbeef [bad object]".
-#.
-#: object-name.c:382
-#, c-format
-msgid "%s [bad object]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous commit
-#. object output. E.g.:
-#. *
-#.    "deadbeef commit 2021-01-01 - Some Commit Message"
-#.
-#: object-name.c:407
-#, c-format
-msgid "%s commit %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output. E.g.:
-#. *
-#.    "deadbeef tag 2022-01-01 - Some Tag Message"
-#. *
-#. The second argument is the YYYY-MM-DD found
-#. in the tag.
-#. *
-#. The third argument is the "tag" string
-#. from object.c.
-#.
-#: object-name.c:428
-#, c-format
-msgid "%s tag %s - %s"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous
-#. tag object output where we couldn't parse
-#. the tag itself. E.g.:
-#. *
-#.    "deadbeef [bad tag, could not parse it]"
-#.
-#: object-name.c:439
-#, c-format
-msgid "%s [bad tag, could not parse it]"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef tree".
-#.
-#: object-name.c:447
-#, c-format
-msgid "%s tree"
-msgstr ""
-
-#. TRANSLATORS: This is a line of ambiguous <type>
-#. object output. E.g. "deadbeef blob".
-#.
-#: object-name.c:453
-#, c-format
-msgid "%s blob"
-msgstr ""
-
-#: object-name.c:569
-#, c-format
-msgid "short object ID %s is ambiguous"
-msgstr ""
-
-#. TRANSLATORS: The argument is the list of ambiguous
-#. objects composed in show_ambiguous_object(). See
-#. its "TRANSLATORS" comments for details.
-#.
-#: object-name.c:591
-#, c-format
-msgid ""
-"The candidates are:\n"
-"%s"
-msgstr ""
-
-#: object-name.c:888
-msgid ""
-"Git normally never creates a ref that ends with 40 hex characters\n"
-"because it will be ignored when you just specify 40-hex. These refs\n"
-"may be created by mistake. For example,\n"
-"\n"
-"  git switch -c $br $(git rev-parse ...)\n"
-"\n"
-"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
-"examine these refs and maybe delete them. Turn this message off by\n"
-"running \"git config advice.objectNameWarning false\""
-msgstr ""
-
-#: object-name.c:1008
-#, c-format
-msgid "log for '%.*s' only goes back to %s"
-msgstr ""
-
-#: object-name.c:1016
-#, c-format
-msgid "log for '%.*s' only has %d entries"
-msgstr ""
-
-#: object-name.c:1794
-#, c-format
-msgid "path '%s' exists on disk, but not in '%.*s'"
-msgstr ""
-
-#: object-name.c:1800
-#, c-format
-msgid ""
-"path '%s' exists, but not '%s'\n"
-"hint: Did you mean '%.*s:%s' aka '%.*s:./%s'?"
-msgstr ""
-
-#: object-name.c:1809
-#, c-format
-msgid "path '%s' does not exist in '%.*s'"
-msgstr ""
-
-#: object-name.c:1837
-#, c-format
-msgid ""
-"path '%s' is in the index, but not at stage %d\n"
-"hint: Did you mean ':%d:%s'?"
-msgstr ""
-
-#: object-name.c:1853
-#, c-format
-msgid ""
-"path '%s' is in the index, but not '%s'\n"
-"hint: Did you mean ':%d:%s' aka ':%d:./%s'?"
-msgstr ""
-
-#: object-name.c:1861
-#, c-format
-msgid "path '%s' exists on disk, but not in the index"
-msgstr ""
-
-#: object-name.c:1863
-#, c-format
-msgid "path '%s' does not exist (neither on disk nor in the index)"
-msgstr ""
-
-#: object-name.c:1876
-msgid "relative path syntax can't be used outside working tree"
-msgstr ""
-
-#: object-name.c:1901
-#, c-format
-msgid "<object>:<path> required, only <object> '%s' given"
-msgstr ""
-
-#: object-name.c:2014
-#, c-format
-msgid "invalid object name '%.*s'."
-msgstr ""
-
-#: object.c:53
-#, c-format
-msgid "invalid object type \"%s\""
-msgstr ""
-
-#: object.c:173
-#, c-format
-msgid "object %s is a %s, not a %s"
-msgstr ""
-
-#: object.c:250
-#, c-format
-msgid "object %s has unknown type id %d"
-msgstr ""
-
-#: object.c:263
-#, c-format
-msgid "unable to parse object: %s"
-msgstr ""
-
-#: object.c:283 object.c:294
-#, c-format
-msgid "hash mismatch %s"
-msgstr ""
-
-#: pack-bitmap.c:353
-msgid "multi-pack bitmap is missing required reverse index"
-msgstr ""
-
-#: pack-bitmap.c:433
-msgid "load_reverse_index: could not open pack"
-msgstr ""
-
-#: pack-bitmap.c:1072 pack-bitmap.c:1078 builtin/pack-objects.c:2432
-#, c-format
-msgid "unable to get size of %s"
-msgstr ""
-
-#: pack-bitmap.c:1937
-#, c-format
-msgid "could not find %s in pack %s at offset %<PRIuMAX>"
-msgstr ""
-
-#: pack-bitmap.c:1973 builtin/rev-list.c:91
-#, c-format
-msgid "unable to get disk usage of %s"
-msgstr ""
-
-#: pack-revindex.c:221
-#, c-format
-msgid "reverse-index file %s is too small"
-msgstr ""
-
-#: pack-revindex.c:226
-#, c-format
-msgid "reverse-index file %s is corrupt"
-msgstr ""
-
-#: pack-revindex.c:234
-#, c-format
-msgid "reverse-index file %s has unknown signature"
-msgstr ""
-
-#: pack-revindex.c:238
-#, c-format
-msgid "reverse-index file %s has unsupported version %<PRIu32>"
-msgstr ""
-
-#: pack-revindex.c:243
-#, c-format
-msgid "reverse-index file %s has unsupported hash id %<PRIu32>"
-msgstr ""
-
-#: pack-write.c:251
-msgid "cannot both write and verify reverse index"
-msgstr ""
-
-#: pack-write.c:270
-#, c-format
-msgid "could not stat: %s"
-msgstr ""
-
-#: pack-write.c:282
-#, c-format
-msgid "failed to make %s readable"
-msgstr ""
-
-#: pack-write.c:521
-#, c-format
-msgid "could not write '%s' promisor file"
-msgstr ""
-
-#: packfile.c:627
-msgid "offset before end of packfile (broken .idx?)"
-msgstr ""
-
-#: packfile.c:657
-#, c-format
-msgid "packfile %s cannot be mapped%s"
-msgstr ""
-
-#: packfile.c:1924
-#, c-format
-msgid "offset before start of pack index for %s (corrupt index?)"
-msgstr ""
-
-#: packfile.c:1928
-#, c-format
-msgid "offset beyond end of pack index for %s (truncated index?)"
-msgstr ""
-
-#: parse-options-cb.c:21 parse-options-cb.c:25 builtin/commit-graph.c:175
-#, c-format
-msgid "option `%s' expects a numerical value"
-msgstr ""
-
-#: parse-options-cb.c:42
-#, c-format
-msgid "malformed expiration date '%s'"
-msgstr ""
-
-#: parse-options-cb.c:55
-#, c-format
-msgid "option `%s' expects \"always\", \"auto\", or \"never\""
-msgstr ""
-
-#: parse-options-cb.c:133 parse-options-cb.c:150
-#, c-format
-msgid "malformed object name '%s'"
-msgstr ""
-
-#: parse-options-cb.c:307
-#, c-format
-msgid "option `%s' expects \"%s\" or \"%s\""
-msgstr ""
-
-#: parse-options.c:58
-#, c-format
-msgid "%s requires a value"
-msgstr ""
-
-#: parse-options.c:93
-#, c-format
-msgid "%s is incompatible with %s"
-msgstr ""
-
-#: parse-options.c:98
-#, c-format
-msgid "%s : incompatible with something else"
-msgstr ""
-
-#: parse-options.c:112 parse-options.c:116
-#, c-format
-msgid "%s takes no value"
-msgstr ""
-
-#: parse-options.c:114
-#, c-format
-msgid "%s isn't available"
-msgstr ""
-
-#: parse-options.c:237
-#, c-format
-msgid "%s expects a non-negative integer value with an optional k/m/g suffix"
-msgstr ""
-
-#: parse-options.c:393
-#, c-format
-msgid "ambiguous option: %s (could be --%s%s or --%s%s)"
-msgstr ""
-
-#: parse-options.c:428 parse-options.c:436
-#, c-format
-msgid "did you mean `--%s` (with two dashes)?"
-msgstr ""
-
-#: parse-options.c:678 parse-options.c:1054
-#, c-format
-msgid "alias of --%s"
-msgstr ""
-
-#: parse-options.c:892
-#, c-format
-msgid "unknown option `%s'"
-msgstr ""
-
-#: parse-options.c:894
-#, c-format
-msgid "unknown switch `%c'"
-msgstr ""
-
-#: parse-options.c:896
-#, c-format
-msgid "unknown non-ascii option in string: `%s'"
-msgstr ""
-
-#: parse-options.c:920
-msgid "..."
-msgstr ""
-
-#: parse-options.c:934
-#, c-format
-msgid "usage: %s"
-msgstr ""
-
-#. TRANSLATORS: the colon here should align with the
-#. one in "usage: %s" translation.
-#.
-#: parse-options.c:949
-#, c-format
-msgid "   or: %s"
-msgstr ""
-
-#. TRANSLATORS: You should only need to translate this format
-#. string if your language is a RTL language (e.g. Arabic,
-#. Hebrew etc.), not if it's a LTR language (e.g. German,
-#. Russian, Chinese etc.).
-#. *
-#. When a translated usage string has an embedded "\n" it's
-#. because options have wrapped to the next line. The line
-#. after the "\n" will then be padded to align with the
-#. command name, such as N_("git cmd [opt]\n<8
-#. spaces>[opt2]"), where the 8 spaces are the same length as
-#. "git cmd ".
-#. *
-#. This format string prints out that already-translated
-#. line. The "%*s" is whitespace padding to account for the
-#. padding at the start of the line that we add in this
-#. function. The "%s" is a line in the (hopefully already
-#. translated) N_() usage string, which contained embedded
-#. newlines before we split it up.
-#.
-#: parse-options.c:970
-#, c-format
-msgid "%*s%s"
-msgstr ""
-
-#: parse-options.c:993
-#, c-format
-msgid "    %s"
-msgstr ""
-
-#: parse-options.c:1040
-msgid "-NUM"
-msgstr ""
-
-#: path.c:922
-#, c-format
-msgid "Could not make %s writable by group"
-msgstr ""
-
-#: pathspec.c:150
-msgid "Escape character '\\' not allowed as last character in attr value"
-msgstr ""
-
-#: pathspec.c:168
-msgid "Only one 'attr:' specification is allowed."
-msgstr ""
-
-#: pathspec.c:171
-msgid "attr spec must not be empty"
-msgstr ""
-
-#: pathspec.c:214
-#, c-format
-msgid "invalid attribute name %s"
-msgstr ""
-
-#: pathspec.c:279
-msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
-msgstr ""
-
-#: pathspec.c:286
-msgid ""
-"global 'literal' pathspec setting is incompatible with all other global "
-"pathspec settings"
-msgstr ""
-
-#: pathspec.c:326
-msgid "invalid parameter for pathspec magic 'prefix'"
-msgstr ""
-
-#: pathspec.c:347
-#, c-format
-msgid "Invalid pathspec magic '%.*s' in '%s'"
-msgstr ""
-
-#: pathspec.c:352
-#, c-format
-msgid "Missing ')' at the end of pathspec magic in '%s'"
-msgstr ""
-
-#: pathspec.c:390
-#, c-format
-msgid "Unimplemented pathspec magic '%c' in '%s'"
-msgstr ""
-
-#: pathspec.c:449
-#, c-format
-msgid "%s: 'literal' and 'glob' are incompatible"
-msgstr ""
-
-#: pathspec.c:465
-#, c-format
-msgid "%s: '%s' is outside repository at '%s'"
-msgstr ""
-
-#: pathspec.c:541
-#, c-format
-msgid "'%s' (mnemonic: '%c')"
-msgstr ""
-
-#: pathspec.c:551
-#, c-format
-msgid "%s: pathspec magic not supported by this command: %s"
-msgstr ""
-
-#: pathspec.c:618
-#, c-format
-msgid "pathspec '%s' is beyond a symbolic link"
-msgstr ""
-
-#: pathspec.c:663
-#, c-format
-msgid "line is badly quoted: %s"
-msgstr ""
-
-#: pkt-line.c:92
-msgid "unable to write flush packet"
-msgstr ""
-
-#: pkt-line.c:99
-msgid "unable to write delim packet"
-msgstr ""
-
-#: pkt-line.c:106
-msgid "unable to write response end packet"
-msgstr ""
-
-#: pkt-line.c:113
-msgid "flush packet write failed"
-msgstr ""
-
-#: pkt-line.c:153
-msgid "protocol error: impossibly long line"
-msgstr ""
-
-#: pkt-line.c:169 pkt-line.c:171
-msgid "packet write with format failed"
-msgstr ""
-
-#: pkt-line.c:204 pkt-line.c:252
-msgid "packet write failed - data exceeds max packet size"
-msgstr ""
-
-#: pkt-line.c:222
-#, c-format
-msgid "packet write failed: %s"
-msgstr ""
-
-#: pkt-line.c:349 pkt-line.c:350
-msgid "read error"
-msgstr ""
-
-#: pkt-line.c:360 pkt-line.c:361
-msgid "the remote end hung up unexpectedly"
-msgstr ""
-
-#: pkt-line.c:417 pkt-line.c:419
-#, c-format
-msgid "protocol error: bad line length character: %.4s"
-msgstr ""
-
-#: pkt-line.c:434 pkt-line.c:436 pkt-line.c:442 pkt-line.c:444
-#, c-format
-msgid "protocol error: bad line length %d"
-msgstr ""
-
-#: pkt-line.c:472 sideband.c:165
-#, c-format
-msgid "remote error: %s"
-msgstr ""
-
-#: preload-index.c:125
-msgid "Refreshing index"
-msgstr ""
-
-#: preload-index.c:144
-#, c-format
-msgid "unable to create threaded lstat: %s"
-msgstr ""
-
-#: pretty.c:1051
-msgid "unable to parse --pretty format"
-msgstr ""
-
-#: promisor-remote.c:31
-msgid "promisor-remote: unable to fork off fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:38 promisor-remote.c:40
-msgid "promisor-remote: could not write to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:44
-msgid "promisor-remote: could not close stdin to fetch subprocess"
-msgstr ""
-
-#: promisor-remote.c:54
-#, c-format
-msgid "promisor remote name cannot begin with '/': %s"
-msgstr ""
-
-#: protocol-caps.c:103
-msgid "object-info: expected flush after arguments"
-msgstr ""
-
-#: prune-packed.c:35
-msgid "Removing duplicate objects"
-msgstr ""
-
-#: range-diff.c:68
-msgid "could not start `log`"
-msgstr ""
-
-#: range-diff.c:70
-msgid "could not read `log` output"
-msgstr ""
-
-#: range-diff.c:98 sequencer.c:5575
-#, c-format
-msgid "could not parse commit '%s'"
-msgstr ""
-
-#: range-diff.c:109
-#, c-format
-msgid ""
-"could not parse first line of `log` output: did not start with 'commit ': "
-"'%s'"
-msgstr ""
-
-#: range-diff.c:132
-#, c-format
-msgid "could not parse git header '%.*s'"
-msgstr ""
-
-#: range-diff.c:300
-msgid "failed to generate diff"
-msgstr ""
-
-#: range-diff.c:558 range-diff.c:560
-#, c-format
-msgid "could not parse log for '%s'"
-msgstr ""
-
-#: read-cache.c:737
-#, c-format
-msgid "will not add file alias '%s' ('%s' already exists in index)"
-msgstr ""
-
-#: read-cache.c:753
-msgid "cannot create an empty blob in the object database"
-msgstr ""
-
-#: read-cache.c:775
-#, c-format
-msgid "%s: can only add regular files, symbolic links or git-directories"
-msgstr ""
-
-#: read-cache.c:780 builtin/submodule--helper.c:3359
-#, c-format
-msgid "'%s' does not have a commit checked out"
-msgstr ""
-
-#: read-cache.c:832
-#, c-format
-msgid "unable to index file '%s'"
-msgstr ""
-
-#: read-cache.c:851
-#, c-format
-msgid "unable to add '%s' to index"
-msgstr ""
-
-#: read-cache.c:862
-#, c-format
-msgid "unable to stat '%s'"
-msgstr ""
-
-#: read-cache.c:1404
-#, c-format
-msgid "'%s' appears as both a file and as a directory"
-msgstr ""
-
-#: read-cache.c:1619
-msgid "Refresh index"
-msgstr ""
-
-#: read-cache.c:1751
-#, c-format
-msgid ""
-"index.version set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1761
-#, c-format
-msgid ""
-"GIT_INDEX_VERSION set, but the value is invalid.\n"
-"Using version %i"
-msgstr ""
-
-#: read-cache.c:1817
-#, c-format
-msgid "bad signature 0x%08x"
-msgstr ""
-
-#: read-cache.c:1820
-#, c-format
-msgid "bad index version %d"
-msgstr ""
-
-#: read-cache.c:1829
-msgid "bad index file sha1 signature"
-msgstr ""
-
-#: read-cache.c:1863
-#, c-format
-msgid "index uses %.4s extension, which we do not understand"
-msgstr ""
-
-#: read-cache.c:1865
-#, c-format
-msgid "ignoring %.4s extension"
-msgstr ""
-
-#: read-cache.c:1902
-#, c-format
-msgid "unknown index entry format 0x%08x"
-msgstr ""
-
-#: read-cache.c:1918
-#, c-format
-msgid "malformed name field in the index, near path '%s'"
-msgstr ""
-
-#: read-cache.c:1975
-msgid "unordered stage entries in index"
-msgstr ""
-
-#: read-cache.c:1978
-#, c-format
-msgid "multiple stage entries for merged file '%s'"
-msgstr ""
-
-#: read-cache.c:1981
-#, c-format
-msgid "unordered stage entries for '%s'"
-msgstr ""
-
-#: read-cache.c:2096 read-cache.c:2402 rerere.c:549 rerere.c:583 rerere.c:1096
-#: submodule.c:1831 builtin/add.c:586 builtin/check-ignore.c:183
-#: builtin/checkout.c:532 builtin/checkout.c:724 builtin/clean.c:1016
-#: builtin/commit.c:379 builtin/diff-tree.c:122 builtin/grep.c:521
-#: builtin/mv.c:148 builtin/reset.c:506 builtin/rm.c:293
-#: builtin/submodule--helper.c:335 builtin/submodule--helper.c:3319
-msgid "index file corrupt"
-msgstr ""
-
-#: read-cache.c:2240
-#, c-format
-msgid "unable to create load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2253
-#, c-format
-msgid "unable to join load_cache_entries thread: %s"
-msgstr ""
-
-#: read-cache.c:2286
-#, c-format
-msgid "%s: index file open failed"
-msgstr ""
-
-#: read-cache.c:2290
-#, c-format
-msgid "%s: cannot stat the open index"
-msgstr ""
-
-#: read-cache.c:2294
-#, c-format
-msgid "%s: index file smaller than expected"
-msgstr ""
-
-#: read-cache.c:2298
-#, c-format
-msgid "%s: unable to map index file%s"
-msgstr ""
-
-#: read-cache.c:2341
-#, c-format
-msgid "unable to create load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2368
-#, c-format
-msgid "unable to join load_index_extensions thread: %s"
-msgstr ""
-
-#: read-cache.c:2414
-#, c-format
-msgid "could not freshen shared index '%s'"
-msgstr ""
-
-#: read-cache.c:2473
-#, c-format
-msgid "broken index, expect %s in %s, got %s"
-msgstr ""
-
-#: read-cache.c:3032
-msgid "cannot write split index for a sparse index"
-msgstr ""
-
-#: read-cache.c:3114 strbuf.c:1192 wrapper.c:717 builtin/merge.c:1156
-#, c-format
-msgid "could not close '%s'"
-msgstr ""
-
-#: read-cache.c:3157
-msgid "failed to convert to a sparse-index"
-msgstr ""
-
-#: read-cache.c:3228
-#, c-format
-msgid "could not stat '%s'"
-msgstr ""
-
-#: read-cache.c:3241
-#, c-format
-msgid "unable to open git dir: %s"
-msgstr ""
-
-#: read-cache.c:3253
-#, c-format
-msgid "unable to unlink: %s"
-msgstr ""
-
-#: read-cache.c:3282
-#, c-format
-msgid "cannot fix permission bits on '%s'"
-msgstr ""
-
-#: read-cache.c:3439
-#, c-format
-msgid "%s: cannot drop to stage #0"
-msgstr ""
-
-#: rebase-interactive.c:11
-msgid ""
-"You can fix this with 'git rebase --edit-todo' and then run 'git rebase --"
-"continue'.\n"
-"Or you can abort the rebase with 'git rebase --abort'.\n"
-msgstr ""
-
-#: rebase-interactive.c:33
-#, c-format
-msgid ""
-"unrecognized setting %s for option rebase.missingCommitsCheck. Ignoring."
-msgstr ""
-
-#: rebase-interactive.c:42
-msgid ""
-"\n"
-"Commands:\n"
-"p, pick <commit> = use commit\n"
-"r, reword <commit> = use commit, but edit the commit message\n"
-"e, edit <commit> = use commit, but stop for amending\n"
-"s, squash <commit> = use commit, but meld into previous commit\n"
-"f, fixup [-C | -c] <commit> = like \"squash\" but keep only the previous\n"
-"                   commit's log message, unless -C is used, in which case\n"
-"                   keep only this commit's message; -c is same as -C but\n"
-"                   opens the editor\n"
-"x, exec <command> = run command (the rest of the line) using shell\n"
-"b, break = stop here (continue rebase later with 'git rebase --continue')\n"
-"d, drop <commit> = remove commit\n"
-"l, label <label> = label current HEAD with a name\n"
-"t, reset <label> = reset HEAD to a label\n"
-"m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]\n"
-".       create a merge commit using the original merge commit's\n"
-".       message (or the oneline, if no original merge commit was\n"
-".       specified); use -c <commit> to reword the commit message\n"
-"\n"
-"These lines can be re-ordered; they are executed from top to bottom.\n"
-msgstr ""
-
-#: rebase-interactive.c:66
-#, c-format
-msgid "Rebase %s onto %s (%d command)"
-msgid_plural "Rebase %s onto %s (%d commands)"
-msgstr[0] ""
-msgstr[1] ""
-
-#: rebase-interactive.c:75
-msgid ""
-"\n"
-"Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
-msgstr ""
-
-#: rebase-interactive.c:78
-msgid ""
-"\n"
-"If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
-
-#: rebase-interactive.c:84
-msgid ""
-"\n"
-"You are editing the todo file of an ongoing interactive rebase.\n"
-"To continue rebase after editing, run:\n"
-"    git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:89
-msgid ""
-"\n"
-"However, if you remove everything, the rebase will be aborted.\n"
-"\n"
-msgstr ""
-
-#: rebase-interactive.c:113 rerere.c:469 rerere.c:677 sequencer.c:3879
-#: sequencer.c:3905 sequencer.c:5681 builtin/fsck.c:328 builtin/gc.c:1791
-#: builtin/rebase.c:191
-#, c-format
-msgid "could not write '%s'"
-msgstr ""
-
-#: rebase-interactive.c:119
-#, c-format
-msgid "could not write '%s'."
-msgstr ""
-
-#: rebase-interactive.c:196
-#, c-format
-msgid ""
-"Warning: some commits may have been dropped accidentally.\n"
-"Dropped commits (newer to older):\n"
-msgstr ""
-
-#: rebase-interactive.c:203
-#, c-format
-msgid ""
-"To avoid this message, use \"drop\" to explicitly remove a commit.\n"
-"\n"
-"Use 'git config rebase.missingCommitsCheck' to change the level of "
-"warnings.\n"
-"The possible behaviours are: ignore, warn, error.\n"
-"\n"
-msgstr ""
-
-#: rebase.c:29
-#, c-format
-msgid "%s: 'preserve' superseded by 'merges'"
-msgstr ""
-
-#: ref-filter.c:42 wt-status.c:2057
-msgid "gone"
-msgstr ""
-
-#: ref-filter.c:43
-#, c-format
-msgid "ahead %d"
-msgstr ""
-
-#: ref-filter.c:44
-#, c-format
-msgid "behind %d"
-msgstr ""
-
-#: ref-filter.c:45
-#, c-format
-msgid "ahead %d, behind %d"
-msgstr ""
-
-#: ref-filter.c:235
-#, c-format
-msgid "expected format: %%(color:<color>)"
-msgstr ""
-
-#: ref-filter.c:237
-#, c-format
-msgid "unrecognized color: %%(color:%s)"
-msgstr ""
-
-#: ref-filter.c:259
-#, c-format
-msgid "Integer value expected refname:lstrip=%s"
-msgstr ""
-
-#: ref-filter.c:263
-#, c-format
-msgid "Integer value expected refname:rstrip=%s"
-msgstr ""
-
-#: ref-filter.c:265 ref-filter.c:344 ref-filter.c:377 ref-filter.c:431
-#: ref-filter.c:443 ref-filter.c:462 ref-filter.c:534 ref-filter.c:560
-#, c-format
-msgid "unrecognized %%(%s) argument: %s"
-msgstr ""
-
-#: ref-filter.c:320
-#, c-format
-msgid "%%(objecttype) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:352
-#, c-format
-msgid "%%(deltabase) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:364
-#, c-format
-msgid "%%(body) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:396
-#, c-format
-msgid "expected %%(trailers:key=<value>)"
-msgstr ""
-
-#: ref-filter.c:398
-#, c-format
-msgid "unknown %%(trailers) argument: %s"
-msgstr ""
-
-#: ref-filter.c:429
-#, c-format
-msgid "positive value expected contents:lines=%s"
-msgstr ""
-
-#: ref-filter.c:458
-#, c-format
-msgid "positive value expected '%s' in %%(%s)"
-msgstr ""
-
-#: ref-filter.c:476
-#, c-format
-msgid "unrecognized email option: %s"
-msgstr ""
-
-#: ref-filter.c:506
-#, c-format
-msgid "expected format: %%(align:<width>,<position>)"
-msgstr ""
-
-#: ref-filter.c:518
-#, c-format
-msgid "unrecognized position:%s"
-msgstr ""
-
-#: ref-filter.c:525
-#, c-format
-msgid "unrecognized width:%s"
-msgstr ""
-
-#: ref-filter.c:542
-#, c-format
-msgid "positive width expected with the %%(align) atom"
-msgstr ""
-
-#: ref-filter.c:568
-#, c-format
-msgid "%%(rest) does not take arguments"
-msgstr ""
-
-#: ref-filter.c:680
-#, c-format
-msgid "malformed field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:707
-#, c-format
-msgid "unknown field name: %.*s"
-msgstr ""
-
-#: ref-filter.c:711
-#, c-format
-msgid ""
-"not a git repository, but the field '%.*s' requires access to object data"
-msgstr ""
-
-#: ref-filter.c:844 ref-filter.c:910 ref-filter.c:946 ref-filter.c:948
-#, c-format
-msgid "format: %%(%s) atom used without a %%(%s) atom"
-msgstr ""
-
-#: ref-filter.c:912
-#, c-format
-msgid "format: %%(then) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:914
-#, c-format
-msgid "format: %%(then) atom used after %%(else)"
-msgstr ""
-
-#: ref-filter.c:950
-#, c-format
-msgid "format: %%(else) atom used more than once"
-msgstr ""
-
-#: ref-filter.c:965
-#, c-format
-msgid "format: %%(end) atom used without corresponding atom"
-msgstr ""
-
-#: ref-filter.c:1027
-#, c-format
-msgid "malformed format string %s"
-msgstr ""
-
-#: ref-filter.c:1033
-#, c-format
-msgid "this command reject atom %%(%.*s)"
-msgstr ""
-
-#: ref-filter.c:1040
-#, c-format
-msgid "--format=%.*s cannot be used with --python, --shell, --tcl"
-msgstr ""
-
-#: ref-filter.c:1707
-#, c-format
-msgid "(no branch, rebasing %s)"
-msgstr ""
-
-#: ref-filter.c:1710
-#, c-format
-msgid "(no branch, rebasing detached HEAD %s)"
-msgstr ""
-
-#: ref-filter.c:1713
-#, c-format
-msgid "(no branch, bisect started on %s)"
-msgstr ""
-
-#: ref-filter.c:1717
-#, c-format
-msgid "(HEAD detached at %s)"
-msgstr ""
-
-#: ref-filter.c:1720
-#, c-format
-msgid "(HEAD detached from %s)"
-msgstr ""
-
-#: ref-filter.c:1723
-msgid "(no branch)"
-msgstr ""
-
-#: ref-filter.c:1755 ref-filter.c:1973
-#, c-format
-msgid "missing object %s for %s"
-msgstr ""
-
-#: ref-filter.c:1765
-#, c-format
-msgid "parse_object_buffer failed on %s for %s"
-msgstr ""
-
-#: ref-filter.c:2156
-#, c-format
-msgid "malformed object at '%s'"
-msgstr ""
-
-#: ref-filter.c:2246
-#, c-format
-msgid "ignoring ref with broken name %s"
-msgstr ""
-
-#: ref-filter.c:2251 refs.c:672
-#, c-format
-msgid "ignoring broken ref %s"
-msgstr ""
-
-#: ref-filter.c:2630
-#, c-format
-msgid "format: %%(end) atom missing"
-msgstr ""
-
-#: ref-filter.c:2741
-#, c-format
-msgid "malformed object name %s"
-msgstr ""
-
-#: ref-filter.c:2746
-#, c-format
-msgid "option `%s' must point to a commit"
-msgstr ""
-
-#: reflog.c:407
-#, c-format
-msgid "not a reflog: %s"
-msgstr ""
-
-#: reflog.c:410
-#, c-format
-msgid "no reflog for '%s'"
-msgstr ""
-
-#: refs.c:262
-#, c-format
-msgid "%s does not point to a valid object!"
-msgstr ""
-
-#: refs.c:561
-#, c-format
-msgid ""
-"Using '%s' as the name for the initial branch. This default branch name\n"
-"is subject to change. To configure the initial branch name to use in all\n"
-"of your new repositories, which will suppress this warning, call:\n"
-"\n"
-"\tgit config --global init.defaultBranch <name>\n"
-"\n"
-"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
-"'development'. The just-created branch can be renamed via this command:\n"
-"\n"
-"\tgit branch -m <name>\n"
-msgstr ""
-
-#: refs.c:583
-#, c-format
-msgid "could not retrieve `%s`"
-msgstr ""
-
-#: refs.c:593
-#, c-format
-msgid "invalid branch name: %s = %s"
-msgstr ""
-
-#: refs.c:670
-#, c-format
-msgid "ignoring dangling symref %s"
-msgstr ""
-
-#: refs.c:919
-#, c-format
-msgid "log for ref %s has gap after %s"
-msgstr ""
-
-#: refs.c:926
-#, c-format
-msgid "log for ref %s unexpectedly ended on %s"
-msgstr ""
-
-#: refs.c:991
-#, c-format
-msgid "log for %s is empty"
-msgstr ""
-
-#: refs.c:1086
-#, c-format
-msgid "refusing to update ref with bad name '%s'"
-msgstr ""
-
-#: refs.c:1164
-#, c-format
-msgid "update_ref failed for ref '%s': %s"
-msgstr ""
-
-#: refs.c:2059
-#, c-format
-msgid "multiple updates for ref '%s' not allowed"
-msgstr ""
-
-#: refs.c:2145
-msgid "ref updates forbidden inside quarantine environment"
-msgstr ""
-
-#: refs.c:2156
-msgid "ref updates aborted by hook"
-msgstr ""
-
-#: refs.c:2264 refs.c:2294
-#, c-format
-msgid "'%s' exists; cannot create '%s'"
-msgstr ""
-
-#: refs.c:2270 refs.c:2305
-#, c-format
-msgid "cannot process '%s' and '%s' at the same time"
-msgstr ""
-
-#: refs/files-backend.c:1295
-#, c-format
-msgid "could not remove reference %s"
-msgstr ""
-
-#: refs/files-backend.c:1310 refs/packed-backend.c:1565
-#: refs/packed-backend.c:1575
-#, c-format
-msgid "could not delete reference %s: %s"
-msgstr ""
-
-#: refs/files-backend.c:1313 refs/packed-backend.c:1578
-#, c-format
-msgid "could not delete references: %s"
-msgstr ""
-
-#: refspec.c:170
-#, c-format
-msgid "invalid refspec '%s'"
-msgstr ""
-
-#: remote.c:402
-#, c-format
-msgid "config remote shorthand cannot begin with '/': %s"
-msgstr ""
-
-#: remote.c:450
-msgid "more than one receivepack given, using the first"
-msgstr ""
-
-#: remote.c:458
-msgid "more than one uploadpack given, using the first"
-msgstr ""
-
-#: remote.c:698
-#, c-format
-msgid "Cannot fetch both %s and %s to %s"
-msgstr ""
-
-#: remote.c:702
-#, c-format
-msgid "%s usually tracks %s, not %s"
-msgstr ""
-
-#: remote.c:706
-#, c-format
-msgid "%s tracks both %s and %s"
-msgstr ""
-
-#: remote.c:774
-#, c-format
-msgid "key '%s' of pattern had no '*'"
-msgstr ""
-
-#: remote.c:784
-#, c-format
-msgid "value '%s' of pattern has no '*'"
-msgstr ""
-
-#: remote.c:1191
-#, c-format
-msgid "src refspec %s does not match any"
-msgstr ""
-
-#: remote.c:1196
-#, c-format
-msgid "src refspec %s matches more than one"
-msgstr ""
-
-#. TRANSLATORS: "matches '%s'%" is the <dst> part of "git push
-#. <remote> <src>:<dst>" push, and "being pushed ('%s')" is
-#. the <src>.
-#.
-#: remote.c:1211
-#, c-format
-msgid ""
-"The destination you provided is not a full refname (i.e.,\n"
-"starting with \"refs/\"). We tried to guess what you meant by:\n"
-"\n"
-"- Looking for a ref that matches '%s' on the remote side.\n"
-"- Checking if the <src> being pushed ('%s')\n"
-"  is a ref in \"refs/{heads,tags}/\". If so we add a corresponding\n"
-"  refs/{heads,tags}/ prefix on the remote side.\n"
-"\n"
-"Neither worked, so we gave up. You must fully qualify the ref."
-msgstr ""
-
-#: remote.c:1231
-#, c-format
-msgid ""
-"The <src> part of the refspec is a commit object.\n"
-"Did you mean to create a new branch by pushing to\n"
-"'%s:refs/heads/%s'?"
-msgstr ""
-
-#: remote.c:1236
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tag object.\n"
-"Did you mean to create a new tag by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1241
-#, c-format
-msgid ""
-"The <src> part of the refspec is a tree object.\n"
-"Did you mean to tag a new tree by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1246
-#, c-format
-msgid ""
-"The <src> part of the refspec is a blob object.\n"
-"Did you mean to tag a new blob by pushing to\n"
-"'%s:refs/tags/%s'?"
-msgstr ""
-
-#: remote.c:1282
-#, c-format
-msgid "%s cannot be resolved to branch"
-msgstr ""
-
-#: remote.c:1293
-#, c-format
-msgid "unable to delete '%s': remote ref does not exist"
-msgstr ""
-
-#: remote.c:1305
-#, c-format
-msgid "dst refspec %s matches more than one"
-msgstr ""
-
-#: remote.c:1312
-#, c-format
-msgid "dst ref %s receives from more than one src"
-msgstr ""
-
-#: remote.c:1833 remote.c:1940
-msgid "HEAD does not point to a branch"
-msgstr ""
-
-#: remote.c:1842
-#, c-format
-msgid "no such branch: '%s'"
-msgstr ""
-
-#: remote.c:1845
-#, c-format
-msgid "no upstream configured for branch '%s'"
-msgstr ""
-
-#: remote.c:1851
-#, c-format
-msgid "upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
-
-#: remote.c:1866
-#, c-format
-msgid "push destination '%s' on remote '%s' has no local tracking branch"
-msgstr ""
-
-#: remote.c:1881
-#, c-format
-msgid "branch '%s' has no remote for pushing"
-msgstr ""
-
-#: remote.c:1891
-#, c-format
-msgid "push refspecs for '%s' do not include '%s'"
-msgstr ""
-
-#: remote.c:1904
-msgid "push has no destination (push.default is 'nothing')"
-msgstr ""
-
-#: remote.c:1926
-msgid "cannot resolve 'simple' push to a single destination"
-msgstr ""
-
-#: remote.c:2059
-#, c-format
-msgid "couldn't find remote ref %s"
-msgstr ""
-
-#: remote.c:2072
-#, c-format
-msgid "* Ignoring funny ref '%s' locally"
-msgstr ""
-
-#: remote.c:2235
-#, c-format
-msgid "Your branch is based on '%s', but the upstream is gone.\n"
-msgstr ""
-
-#: remote.c:2239
-msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr ""
-
-#: remote.c:2242
-#, c-format
-msgid "Your branch is up to date with '%s'.\n"
-msgstr ""
-
-#: remote.c:2246
-#, c-format
-msgid "Your branch and '%s' refer to different commits.\n"
-msgstr ""
-
-#: remote.c:2249
-#, c-format
-msgid "  (use \"%s\" for details)\n"
-msgstr ""
-
-#: remote.c:2253
-#, c-format
-msgid "Your branch is ahead of '%s' by %d commit.\n"
-msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2259
-msgid "  (use \"git push\" to publish your local commits)\n"
-msgstr ""
-
-#: remote.c:2262
-#, c-format
-msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
-msgid_plural ""
-"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2270
-msgid "  (use \"git pull\" to update your local branch)\n"
-msgstr ""
-
-#: remote.c:2273
-#, c-format
-msgid ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commit each, respectively.\n"
-msgid_plural ""
-"Your branch and '%s' have diverged,\n"
-"and have %d and %d different commits each, respectively.\n"
-msgstr[0] ""
-msgstr[1] ""
-
-#: remote.c:2283
-msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
-msgstr ""
-
-#: remote.c:2475
-#, c-format
-msgid "cannot parse expected object name '%s'"
-msgstr ""
-
-#: replace-object.c:21
-#, c-format
-msgid "bad replace ref name: %s"
-msgstr ""
-
-#: replace-object.c:30
-#, c-format
-msgid "duplicate replace ref: %s"
-msgstr ""
-
-#: replace-object.c:82
-#, c-format
-msgid "replace depth too high for object %s"
-msgstr ""
-
-#: rerere.c:201 rerere.c:210 rerere.c:213
-msgid "corrupt MERGE_RR"
-msgstr ""
-
-#: rerere.c:248 rerere.c:253
-msgid "unable to write rerere record"
-msgstr ""
-
-#: rerere.c:479
-#, c-format
-msgid "there were errors while writing '%s' (%s)"
-msgstr ""
-
-#: rerere.c:482 builtin/gc.c:2263 builtin/gc.c:2298
-#, c-format
-msgid "failed to flush '%s'"
-msgstr ""
-
-#: rerere.c:487 rerere.c:1024
-#, c-format
-msgid "could not parse conflict hunks in '%s'"
-msgstr ""
-
-#: rerere.c:669
-#, c-format
-msgid "failed utime() on '%s'"
-msgstr ""
-
-#: rerere.c:679
-#, c-format
-msgid "writing '%s' failed"
-msgstr ""
-
-#: rerere.c:699
-#, c-format
-msgid "Staged '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:738
-#, c-format
-msgid "Recorded resolution for '%s'."
-msgstr ""
-
-#: rerere.c:773
-#, c-format
-msgid "Resolved '%s' using previous resolution."
-msgstr ""
-
-#: rerere.c:788
-#, c-format
-msgid "cannot unlink stray '%s'"
-msgstr ""
-
-#: rerere.c:792
-#, c-format
-msgid "Recorded preimage for '%s'"
-msgstr ""
-
-#: rerere.c:866 submodule.c:2290 builtin/log.c:2042
-#: builtin/submodule--helper.c:1786 builtin/submodule--helper.c:1833
-#, c-format
-msgid "could not create directory '%s'"
-msgstr ""
-
-#: rerere.c:1042
-#, c-format
-msgid "failed to update conflicted state in '%s'"
-msgstr ""
-
-#: rerere.c:1053 rerere.c:1060
-#, c-format
-msgid "no remembered resolution for '%s'"
-msgstr ""
-
-#: rerere.c:1062
-#, c-format
-msgid "cannot unlink '%s'"
-msgstr ""
-
-#: rerere.c:1072
-#, c-format
-msgid "Updated preimage for '%s'"
-msgstr ""
-
-#: rerere.c:1081
-#, c-format
-msgid "Forgot resolution for '%s'\n"
-msgstr ""
-
-#: rerere.c:1192
-msgid "unable to open rr-cache directory"
-msgstr ""
-
-#: reset.c:112
-msgid "could not determine HEAD revision"
-msgstr ""
-
-#: reset.c:141 reset.c:147 sequencer.c:3696
-#, c-format
-msgid "failed to find tree of %s"
-msgstr ""
-
-#: revision.c:2358
-msgid "--unpacked=<packfile> no longer supported"
-msgstr ""
-
-#: revision.c:2712
-msgid "your current branch appears to be broken"
-msgstr ""
-
-#: revision.c:2715
-#, c-format
-msgid "your current branch '%s' does not have any commits yet"
-msgstr ""
-
-#: revision.c:2901
-msgid "object filtering requires --objects"
-msgstr ""
-
-#: revision.c:2918
-msgid "-L does not yet support diff formats besides -p and -s"
-msgstr ""
-
-#: run-command.c:1262
-#, c-format
-msgid "cannot create async thread: %s"
-msgstr ""
-
-#: send-pack.c:150
-msgid "unexpected flush packet while reading remote unpack status"
-msgstr ""
-
-#: send-pack.c:152
-#, c-format
-msgid "unable to parse remote unpack status: %s"
-msgstr ""
-
-#: send-pack.c:154
-#, c-format
-msgid "remote unpack failed: %s"
-msgstr ""
-
-#: send-pack.c:378
-msgid "failed to sign the push certificate"
-msgstr ""
-
-#: send-pack.c:435
-msgid "send-pack: unable to fork off fetch subprocess"
-msgstr ""
-
-#: send-pack.c:457
-msgid "push negotiation failed; proceeding anyway with push"
-msgstr ""
-
-#: send-pack.c:528
-msgid "the receiving end does not support this repository's hash algorithm"
-msgstr ""
-
-#: send-pack.c:537
-msgid "the receiving end does not support --signed push"
-msgstr ""
-
-#: send-pack.c:539
-msgid ""
-"not sending a push certificate since the receiving end does not support --"
-"signed push"
-msgstr ""
-
-#: send-pack.c:546
-msgid "the receiving end does not support --atomic push"
-msgstr ""
-
-#: send-pack.c:551
-msgid "the receiving end does not support push options"
-msgstr ""
-
-#: sequencer.c:197
-#, c-format
-msgid "invalid commit message cleanup mode '%s'"
-msgstr ""
-
-#: sequencer.c:325
-#, c-format
-msgid "could not delete '%s'"
-msgstr ""
-
-#: sequencer.c:345 sequencer.c:4724 builtin/rebase.c:564 builtin/rebase.c:1326
-#: builtin/rm.c:409
-#, c-format
-msgid "could not remove '%s'"
-msgstr ""
-
-#: sequencer.c:355
-msgid "revert"
-msgstr ""
-
-#: sequencer.c:357
-msgid "cherry-pick"
-msgstr ""
-
-#: sequencer.c:359
-msgid "rebase"
-msgstr ""
-
-#: sequencer.c:361
-#, c-format
-msgid "unknown action: %d"
-msgstr ""
-
-#: sequencer.c:420
-msgid ""
-"after resolving the conflicts, mark the corrected paths\n"
-"with 'git add <paths>' or 'git rm <paths>'"
-msgstr ""
-
-#: sequencer.c:423
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git cherry-pick --continue\".\n"
-"You can instead skip this commit with \"git cherry-pick --skip\".\n"
-"To abort and get back to the state before \"git cherry-pick\",\n"
-"run \"git cherry-pick --abort\"."
-msgstr ""
-
-#: sequencer.c:430
-msgid ""
-"After resolving the conflicts, mark them with\n"
-"\"git add/rm <pathspec>\", then run\n"
-"\"git revert --continue\".\n"
-"You can instead skip this commit with \"git revert --skip\".\n"
-"To abort and get back to the state before \"git revert\",\n"
-"run \"git revert --abort\"."
-msgstr ""
-
-#: sequencer.c:448 sequencer.c:3288
-#, c-format
-msgid "could not lock '%s'"
-msgstr ""
-
-#: sequencer.c:450 sequencer.c:3087 sequencer.c:3292 sequencer.c:3306
-#: sequencer.c:3557 sequencer.c:5591 strbuf.c:1189 wrapper.c:715
-#, c-format
-msgid "could not write to '%s'"
-msgstr ""
-
-#: sequencer.c:455
-#, c-format
-msgid "could not write eol to '%s'"
-msgstr ""
-
-#: sequencer.c:460 sequencer.c:3092 sequencer.c:3294 sequencer.c:3308
-#: sequencer.c:3565
-#, c-format
-msgid "failed to finalize '%s'"
-msgstr ""
-
-#: sequencer.c:473 sequencer.c:1930 sequencer.c:3112 sequencer.c:3547
-#: sequencer.c:3675 builtin/am.c:290 builtin/commit.c:837 builtin/merge.c:1154
-#, c-format
-msgid "could not read '%s'"
-msgstr ""
-
-#: sequencer.c:499
-#, c-format
-msgid "your local changes would be overwritten by %s."
-msgstr ""
-
-#: sequencer.c:503
-msgid "commit your changes or stash them to proceed."
-msgstr ""
-
-#: sequencer.c:535
-#, c-format
-msgid "%s: fast-forward"
-msgstr ""
-
-#: sequencer.c:574 builtin/tag.c:615
-#, c-format
-msgid "Invalid cleanup mode %s"
-msgstr ""
-
-#. TRANSLATORS: %s will be "revert", "cherry-pick" or
-#. "rebase".
-#.
-#: sequencer.c:685
-#, c-format
-msgid "%s: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:699
-msgid "unable to update cache tree"
-msgstr ""
-
-#: sequencer.c:713
-msgid "could not resolve HEAD commit"
-msgstr ""
-
-#: sequencer.c:793
-#, c-format
-msgid "no key present in '%.*s'"
-msgstr ""
-
-#: sequencer.c:804
-#, c-format
-msgid "unable to dequote value of '%s'"
-msgstr ""
-
-#: sequencer.c:841 wrapper.c:219 wrapper.c:389 builtin/am.c:757
-#: builtin/am.c:849 builtin/rebase.c:699
-#, c-format
-msgid "could not open '%s' for reading"
-msgstr ""
-
-#: sequencer.c:851
-msgid "'GIT_AUTHOR_NAME' already given"
-msgstr ""
-
-#: sequencer.c:856
-msgid "'GIT_AUTHOR_EMAIL' already given"
-msgstr ""
-
-#: sequencer.c:861
-msgid "'GIT_AUTHOR_DATE' already given"
-msgstr ""
-
-#: sequencer.c:865
-#, c-format
-msgid "unknown variable '%s'"
-msgstr ""
-
-#: sequencer.c:870
-msgid "missing 'GIT_AUTHOR_NAME'"
-msgstr ""
-
-#: sequencer.c:872
-msgid "missing 'GIT_AUTHOR_EMAIL'"
-msgstr ""
-
-#: sequencer.c:874
-msgid "missing 'GIT_AUTHOR_DATE'"
-msgstr ""
-
-#: sequencer.c:939
-#, c-format
-msgid ""
-"you have staged changes in your working tree\n"
-"If these changes are meant to be squashed into the previous commit, run:\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"If they are meant to go into a new commit, run:\n"
-"\n"
-"  git commit %s\n"
-"\n"
-"In both cases, once you're done, continue with:\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:1225
-msgid "'prepare-commit-msg' hook failed"
-msgstr ""
-
-#: sequencer.c:1231
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly. Run the\n"
-"following command and follow the instructions in your editor to edit\n"
-"your configuration file:\n"
-"\n"
-"    git config --global --edit\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1244
-msgid ""
-"Your name and email address were configured automatically based\n"
-"on your username and hostname. Please check that they are accurate.\n"
-"You can suppress this message by setting them explicitly:\n"
-"\n"
-"    git config --global user.name \"Your Name\"\n"
-"    git config --global user.email you@example.com\n"
-"\n"
-"After doing this, you may fix the identity used for this commit with:\n"
-"\n"
-"    git commit --amend --reset-author\n"
-msgstr ""
-
-#: sequencer.c:1287
-msgid "couldn't look up newly created commit"
-msgstr ""
-
-#: sequencer.c:1289
-msgid "could not parse newly created commit"
-msgstr ""
-
-#: sequencer.c:1336
-msgid "unable to resolve HEAD after creating commit"
-msgstr ""
-
-#: sequencer.c:1338
-msgid "detached HEAD"
-msgstr ""
-
-#: sequencer.c:1342
-msgid " (root-commit)"
-msgstr ""
-
-#: sequencer.c:1363
-msgid "could not parse HEAD"
-msgstr ""
-
-#: sequencer.c:1365
-#, c-format
-msgid "HEAD %s is not a commit!"
-msgstr ""
-
-#: sequencer.c:1369 sequencer.c:1447 builtin/commit.c:1707
-msgid "could not parse HEAD commit"
-msgstr ""
-
-#: sequencer.c:1425 sequencer.c:2310
-msgid "unable to parse commit author"
-msgstr ""
-
-#: sequencer.c:1436 builtin/am.c:1644 builtin/merge.c:710
-msgid "git write-tree failed to write a tree"
-msgstr ""
-
-#: sequencer.c:1469 sequencer.c:1589
-#, c-format
-msgid "unable to read commit message from '%s'"
-msgstr ""
-
-#: sequencer.c:1500 sequencer.c:1532
-#, c-format
-msgid "invalid author identity '%s'"
-msgstr ""
-
-#: sequencer.c:1506
-msgid "corrupt author: missing date information"
-msgstr ""
-
-#: sequencer.c:1545 builtin/am.c:1671 builtin/commit.c:1821 builtin/merge.c:921
-#: builtin/merge.c:946 t/helper/test-fast-rebase.c:78
-msgid "failed to write commit object"
-msgstr ""
-
-#: sequencer.c:1572 sequencer.c:4496 t/helper/test-fast-rebase.c:199
-#: t/helper/test-fast-rebase.c:217
-#, c-format
-msgid "could not update %s"
-msgstr ""
-
-#: sequencer.c:1621
-#, c-format
-msgid "could not parse commit %s"
-msgstr ""
-
-#: sequencer.c:1626
-#, c-format
-msgid "could not parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:1709 sequencer.c:1990
-#, c-format
-msgid "unknown command: %d"
-msgstr ""
-
-#: sequencer.c:1751
-msgid "This is the 1st commit message:"
-msgstr ""
-
-#: sequencer.c:1752
-#, c-format
-msgid "This is the commit message #%d:"
-msgstr ""
-
-#: sequencer.c:1753
-msgid "The 1st commit message will be skipped:"
-msgstr ""
-
-#: sequencer.c:1754
-#, c-format
-msgid "The commit message #%d will be skipped:"
-msgstr ""
-
-#: sequencer.c:1755
-#, c-format
-msgid "This is a combination of %d commits."
-msgstr ""
-
-#: sequencer.c:1902 sequencer.c:1959
-#, c-format
-msgid "cannot write '%s'"
-msgstr ""
-
-#: sequencer.c:1949
-msgid "need a HEAD to fixup"
-msgstr ""
-
-#: sequencer.c:1951 sequencer.c:3592
-msgid "could not read HEAD"
-msgstr ""
-
-#: sequencer.c:1953
-msgid "could not read HEAD's commit message"
-msgstr ""
-
-#: sequencer.c:1977
-#, c-format
-msgid "could not read commit message of %s"
-msgstr ""
-
-#: sequencer.c:2087
-msgid "your index file is unmerged."
-msgstr ""
-
-#: sequencer.c:2094
-msgid "cannot fixup root commit"
-msgstr ""
-
-#: sequencer.c:2113
-#, c-format
-msgid "commit %s is a merge but no -m option was given."
-msgstr ""
-
-#: sequencer.c:2121 sequencer.c:2129
-#, c-format
-msgid "commit %s does not have parent %d"
-msgstr ""
-
-#: sequencer.c:2135
-#, c-format
-msgid "cannot get commit message for %s"
-msgstr ""
-
-#. TRANSLATORS: The first %s will be a "todo" command like
-#. "revert" or "pick", the second %s a SHA1.
-#: sequencer.c:2154
-#, c-format
-msgid "%s: cannot parse parent commit %s"
-msgstr ""
-
-#: sequencer.c:2220
-#, c-format
-msgid "could not rename '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:2280
-#, c-format
-msgid "could not revert %s... %s"
-msgstr ""
-
-#: sequencer.c:2281
-#, c-format
-msgid "could not apply %s... %s"
-msgstr ""
-
-#: sequencer.c:2302
-#, c-format
-msgid "dropping %s %s -- patch contents already upstream\n"
-msgstr ""
-
-#: sequencer.c:2360
-#, c-format
-msgid "git %s: failed to read the index"
-msgstr ""
-
-#: sequencer.c:2368
-#, c-format
-msgid "git %s: failed to refresh the index"
-msgstr ""
-
-#: sequencer.c:2448
-#, c-format
-msgid "%s does not accept arguments: '%s'"
-msgstr ""
-
-#: sequencer.c:2457
-#, c-format
-msgid "missing arguments for %s"
-msgstr ""
-
-#: sequencer.c:2500
-#, c-format
-msgid "could not parse '%s'"
-msgstr ""
-
-#: sequencer.c:2561
-#, c-format
-msgid "invalid line %d: %.*s"
-msgstr ""
-
-#: sequencer.c:2572
-#, c-format
-msgid "cannot '%s' without a previous commit"
-msgstr ""
-
-#: sequencer.c:2620 builtin/rebase.c:185
-#, c-format
-msgid "could not read '%s'."
-msgstr ""
-
-#: sequencer.c:2658
-msgid "cancelling a cherry picking in progress"
-msgstr ""
-
-#: sequencer.c:2667
-msgid "cancelling a revert in progress"
-msgstr ""
-
-#: sequencer.c:2707
-msgid "please fix this using 'git rebase --edit-todo'."
-msgstr ""
-
-#: sequencer.c:2709
-#, c-format
-msgid "unusable instruction sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:2714
-msgid "no commits parsed."
-msgstr ""
-
-#: sequencer.c:2725
-msgid "cannot cherry-pick during a revert."
-msgstr ""
-
-#: sequencer.c:2727
-msgid "cannot revert during a cherry-pick."
-msgstr ""
-
-#: sequencer.c:2914
-msgid "unusable squash-onto"
-msgstr ""
-
-#: sequencer.c:2934
-#, c-format
-msgid "malformed options sheet: '%s'"
-msgstr ""
-
-#: sequencer.c:3029 sequencer.c:4875
-msgid "empty commit set passed"
-msgstr ""
-
-#: sequencer.c:3046
-msgid "revert is already in progress"
-msgstr ""
-
-#: sequencer.c:3048
-#, c-format
-msgid "try \"git revert (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3051
-msgid "cherry-pick is already in progress"
-msgstr ""
-
-#: sequencer.c:3053
-#, c-format
-msgid "try \"git cherry-pick (--continue | %s--abort | --quit)\""
-msgstr ""
-
-#: sequencer.c:3067
-#, c-format
-msgid "could not create sequencer directory '%s'"
-msgstr ""
-
-#: sequencer.c:3082
-msgid "could not lock HEAD"
-msgstr ""
-
-#: sequencer.c:3142 sequencer.c:4585
-msgid "no cherry-pick or revert in progress"
-msgstr ""
-
-#: sequencer.c:3144 sequencer.c:3155
-msgid "cannot resolve HEAD"
-msgstr ""
-
-#: sequencer.c:3146 sequencer.c:3190
-msgid "cannot abort from a branch yet to be born"
-msgstr ""
-
-#: sequencer.c:3176 builtin/fetch.c:1030 builtin/fetch.c:1457
-#: builtin/grep.c:774
-#, c-format
-msgid "cannot open '%s'"
-msgstr ""
-
-#: sequencer.c:3178
-#, c-format
-msgid "cannot read '%s': %s"
-msgstr ""
-
-#: sequencer.c:3179
-msgid "unexpected end of file"
-msgstr ""
-
-#: sequencer.c:3185
-#, c-format
-msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
-msgstr ""
-
-#: sequencer.c:3196
-msgid "You seem to have moved HEAD. Not rewinding, check your HEAD!"
-msgstr ""
-
-#: sequencer.c:3237
-msgid "no revert in progress"
-msgstr ""
-
-#: sequencer.c:3246
-msgid "no cherry-pick in progress"
-msgstr ""
-
-#: sequencer.c:3256
-msgid "failed to skip the commit"
-msgstr ""
-
-#: sequencer.c:3263
-msgid "there is nothing to skip"
-msgstr ""
-
-#: sequencer.c:3266
-#, c-format
-msgid ""
-"have you committed already?\n"
-"try \"git %s --continue\""
-msgstr ""
-
-#: sequencer.c:3428 sequencer.c:4476
-msgid "cannot read HEAD"
-msgstr ""
-
-#: sequencer.c:3445
-#, c-format
-msgid "unable to copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3453
-#, c-format
-msgid ""
-"You can amend the commit now, with\n"
-"\n"
-"  git commit --amend %s\n"
-"\n"
-"Once you are satisfied with your changes, run\n"
-"\n"
-"  git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:3463
-#, c-format
-msgid "Could not apply %s... %.*s"
-msgstr ""
-
-#: sequencer.c:3470
-#, c-format
-msgid "Could not merge %.*s"
-msgstr ""
-
-#: sequencer.c:3484 sequencer.c:3488 builtin/difftool.c:633
-#, c-format
-msgid "could not copy '%s' to '%s'"
-msgstr ""
-
-#: sequencer.c:3499
-#, c-format
-msgid "Executing: %s\n"
-msgstr ""
-
-#: sequencer.c:3510
-#, c-format
-msgid ""
-"execution failed: %s\n"
-"%sYou can fix the problem, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3516
-msgid "and made changes to the index and/or the working tree\n"
-msgstr ""
-
-#: sequencer.c:3522
-#, c-format
-msgid ""
-"execution succeeded: %s\n"
-"but left changes to the index and/or the working tree\n"
-"Commit or stash your changes, and then run\n"
-"\n"
-"  git rebase --continue\n"
-"\n"
-msgstr ""
-
-#: sequencer.c:3582
-#, c-format
-msgid "illegal label name: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3655
-msgid "writing fake root commit"
-msgstr ""
-
-#: sequencer.c:3660
-msgid "writing squash-onto"
-msgstr ""
-
-#: sequencer.c:3739
-#, c-format
-msgid "could not resolve '%s'"
-msgstr ""
-
-#: sequencer.c:3771
-msgid "cannot merge without a current revision"
-msgstr ""
-
-#: sequencer.c:3793
-#, c-format
-msgid "unable to parse '%.*s'"
-msgstr ""
-
-#: sequencer.c:3802
-#, c-format
-msgid "nothing to merge: '%.*s'"
-msgstr ""
-
-#: sequencer.c:3814
-msgid "octopus merge cannot be executed on top of a [new root]"
-msgstr ""
-
-#: sequencer.c:3869
-#, c-format
-msgid "could not get commit message of '%s'"
-msgstr ""
-
-#: sequencer.c:4013
-#, c-format
-msgid "could not even attempt to merge '%.*s'"
-msgstr ""
-
-#: sequencer.c:4029
-msgid "merge: Unable to write new index file"
-msgstr ""
-
-#: sequencer.c:4110
-msgid "Cannot autostash"
-msgstr ""
-
-#: sequencer.c:4113
-#, c-format
-msgid "Unexpected stash response: '%s'"
-msgstr ""
-
-#: sequencer.c:4119
-#, c-format
-msgid "Could not create directory for '%s'"
-msgstr ""
-
-#: sequencer.c:4122
-#, c-format
-msgid "Created autostash: %s\n"
-msgstr ""
-
-#: sequencer.c:4124
-msgid "could not reset --hard"
-msgstr ""
-
-#: sequencer.c:4148
-#, c-format
-msgid "Applied autostash.\n"
-msgstr ""
-
-#: sequencer.c:4160
-#, c-format
-msgid "cannot store %s"
-msgstr ""
-
-#: sequencer.c:4163
-#, c-format
-msgid ""
-"%s\n"
-"Your changes are safe in the stash.\n"
-"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
-msgstr ""
-
-#: sequencer.c:4168
-msgid "Applying autostash resulted in conflicts."
-msgstr ""
-
-#: sequencer.c:4169
-msgid "Autostash exists; creating a new stash entry."
-msgstr ""
-
-#: sequencer.c:4225
-msgid "could not detach HEAD"
-msgstr ""
-
-#: sequencer.c:4240
-#, c-format
-msgid "Stopped at HEAD\n"
-msgstr ""
-
-#: sequencer.c:4242
-#, c-format
-msgid "Stopped at %s\n"
-msgstr ""
-
-#: sequencer.c:4274
-#, c-format
-msgid ""
-"Could not execute the todo command\n"
-"\n"
-"    %.*s\n"
-"It has been rescheduled; To edit the command before continuing, please\n"
-"edit the todo list first:\n"
-"\n"
-"    git rebase --edit-todo\n"
-"    git rebase --continue\n"
-msgstr ""
-
-#: sequencer.c:4320
-#, c-format
-msgid "Rebasing (%d/%d)%s"
-msgstr ""
-
-#: sequencer.c:4366
-#, c-format
-msgid "Stopped at %s...  %.*s\n"
-msgstr ""
-
-#: sequencer.c:4436
-#, c-format
-msgid "unknown command %d"
-msgstr ""
-
-#: sequencer.c:4484
-msgid "could not read orig-head"
-msgstr ""
-
-#: sequencer.c:4489
-msgid "could not read 'onto'"
-msgstr ""
-
-#: sequencer.c:4503
-#, c-format
-msgid "could not update HEAD to %s"
-msgstr ""
-
-#: sequencer.c:4563
-#, c-format
-msgid "Successfully rebased and updated %s.\n"
-msgstr ""
-
-#: sequencer.c:4615
-msgid "cannot rebase: You have unstaged changes."
-msgstr ""
-
-#: sequencer.c:4624
-msgid "cannot amend non-existing commit"
-msgstr ""
-
-#: sequencer.c:4626
-#, c-format
-msgid "invalid file: '%s'"
-msgstr ""
-
-#: sequencer.c:4628
-#, c-format
-msgid "invalid contents: '%s'"
-msgstr ""
-
-#: sequencer.c:4631
-msgid ""
-"\n"
-"You have uncommitted changes in your working tree. Please, commit them\n"
-"first and then run 'git rebase --continue' again."
-msgstr ""
-
-#: sequencer.c:4667 sequencer.c:4706
-#, c-format
-msgid "could not write file: '%s'"
-msgstr ""
-
-#: sequencer.c:4722
-msgid "could not remove CHERRY_PICK_HEAD"
-msgstr ""
-
-#: sequencer.c:4732
-msgid "could not commit staged changes."
-msgstr ""
-
-#: sequencer.c:4852
-#, c-format
-msgid "%s: can't cherry-pick a %s"
-msgstr ""
-
-#: sequencer.c:4856
-#, c-format
-msgid "%s: bad revision"
-msgstr ""
-
-#: sequencer.c:4891
-msgid "can't revert as initial commit"
-msgstr ""
-
-#: sequencer.c:5162 sequencer.c:5391
-#, c-format
-msgid "skipped previously applied commit %s"
-msgstr ""
-
-#: sequencer.c:5232 sequencer.c:5407
-msgid "use --reapply-cherry-picks to include skipped commits"
-msgstr ""
-
-#: sequencer.c:5378
-msgid "make_script: unhandled options"
-msgstr ""
-
-#: sequencer.c:5381
-msgid "make_script: error preparing revisions"
-msgstr ""
-
-#: sequencer.c:5639 sequencer.c:5656
-msgid "nothing to do"
-msgstr ""
-
-#: sequencer.c:5675
-msgid "could not skip unnecessary pick commands"
-msgstr ""
-
-#: sequencer.c:5775
-msgid "the script was already rearranged."
-msgstr ""
-
-#: setup.c:135
-#, c-format
-msgid "'%s' is outside repository at '%s'"
-msgstr ""
-
-#: setup.c:187
-#, c-format
-msgid ""
-"%s: no such path in the working tree.\n"
-"Use 'git <command> -- <path>...' to specify paths that do not exist locally."
-msgstr ""
-
-#: setup.c:200
-#, c-format
-msgid ""
-"ambiguous argument '%s': unknown revision or path not in the working tree.\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:266
-#, c-format
-msgid "option '%s' must come before non-option arguments"
-msgstr ""
-
-#: setup.c:285
-#, c-format
-msgid ""
-"ambiguous argument '%s': both revision and filename\n"
-"Use '--' to separate paths from revisions, like this:\n"
-"'git <command> [<revision>...] -- [<file>...]'"
-msgstr ""
-
-#: setup.c:421
-msgid "unable to set up work tree using invalid config"
-msgstr ""
-
-#: setup.c:425 builtin/rev-parse.c:895
-msgid "this operation must be run in a work tree"
-msgstr ""
-
-#: setup.c:724
-#, c-format
-msgid "Expected git repo version <= %d, found %d"
-msgstr ""
-
-#: setup.c:732
-msgid "unknown repository extension found:"
-msgid_plural "unknown repository extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:746
-msgid "repo version is 0, but v1-only extension found:"
-msgid_plural "repo version is 0, but v1-only extensions found:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: setup.c:767
-#, c-format
-msgid "error opening '%s'"
-msgstr ""
-
-#: setup.c:769
-#, c-format
-msgid "too large to be a .git file: '%s'"
-msgstr ""
-
-#: setup.c:771
-#, c-format
-msgid "error reading %s"
-msgstr ""
-
-#: setup.c:773
-#, c-format
-msgid "invalid gitfile format: %s"
-msgstr ""
-
-#: setup.c:775
-#, c-format
-msgid "no path in gitfile: %s"
-msgstr ""
-
-#: setup.c:777
-#, c-format
-msgid "not a git repository: %s"
-msgstr ""
-
-#: setup.c:879
-#, c-format
-msgid "'$%s' too big"
-msgstr ""
-
-#: setup.c:893
-#, c-format
-msgid "not a git repository: '%s'"
-msgstr ""
-
-#: setup.c:922 setup.c:924 setup.c:955
-#, c-format
-msgid "cannot chdir to '%s'"
-msgstr ""
-
-#: setup.c:927 setup.c:983 setup.c:993 setup.c:1032 setup.c:1040
-msgid "cannot come back to cwd"
-msgstr ""
-
-#: setup.c:1054
-#, c-format
-msgid "failed to stat '%*s%s%s'"
-msgstr ""
-
-#: setup.c:1338
-msgid "Unable to read current working directory"
-msgstr ""
-
-#: setup.c:1347 setup.c:1353
-#, c-format
-msgid "cannot change to '%s'"
-msgstr ""
-
-#: setup.c:1358
-#, c-format
-msgid "not a git repository (or any of the parent directories): %s"
-msgstr ""
-
-#: setup.c:1364
-#, c-format
-msgid ""
-"not a git repository (or any parent up to mount point %s)\n"
-"Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
-msgstr ""
-
-#: setup.c:1374
-#, c-format
-msgid ""
-"unsafe repository ('%s' is owned by someone else)\n"
-"To add an exception for this directory, call:\n"
-"\n"
-"\tgit config --global --add safe.directory %s"
-msgstr ""
-
-#: setup.c:1502
-#, c-format
-msgid ""
-"problem with core.sharedRepository filemode value (0%.3o).\n"
-"The owner of files must always have read and write permissions."
-msgstr ""
-
-#: setup.c:1564
-msgid "fork failed"
-msgstr ""
-
-#: setup.c:1569
-msgid "setsid failed"
-msgstr ""
-
-#: sparse-index.c:285
-#, c-format
-msgid "index entry is a directory, but not sparse (%08x)"
-msgstr ""
-
-#: split-index.c:9
-msgid "cannot use split index with a sparse index"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte
-#: strbuf.c:851
-#, c-format
-msgid "%u.%2.2u GiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 gibibyte/second
-#: strbuf.c:853
-#, c-format
-msgid "%u.%2.2u GiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte
-#: strbuf.c:861
-#, c-format
-msgid "%u.%2.2u MiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 mebibyte/second
-#: strbuf.c:863
-#, c-format
-msgid "%u.%2.2u MiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte
-#: strbuf.c:870
-#, c-format
-msgid "%u.%2.2u KiB"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 kibibyte/second
-#: strbuf.c:872
-#, c-format
-msgid "%u.%2.2u KiB/s"
-msgstr ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte
-#: strbuf.c:878
-#, c-format
-msgid "%u byte"
-msgid_plural "%u bytes"
-msgstr[0] ""
-msgstr[1] ""
-
-#. TRANSLATORS: IEC 80000-13:2008 byte/second
-#: strbuf.c:880
-#, c-format
-msgid "%u byte/s"
-msgid_plural "%u bytes/s"
-msgstr[0] ""
-msgstr[1] ""
-
-#: strbuf.c:1187 wrapper.c:217 wrapper.c:387 builtin/am.c:766
-#: builtin/rebase.c:653
-#, c-format
-msgid "could not open '%s' for writing"
-msgstr ""
-
-#: strbuf.c:1196
-#, c-format
-msgid "could not edit '%s'"
-msgstr ""
-
-#: submodule-config.c:238
-#, c-format
-msgid "ignoring suspicious submodule name: %s"
-msgstr ""
-
-#: submodule-config.c:305
-msgid "negative values not allowed for submodule.fetchjobs"
-msgstr ""
-
-#: submodule-config.c:403
-#, c-format
-msgid "ignoring '%s' which may be interpreted as a command-line option: %s"
-msgstr ""
-
-#: submodule-config.c:500 builtin/push.c:489 builtin/send-pack.c:148
-#, c-format
-msgid "invalid value for '%s'"
-msgstr ""
-
-#: submodule-config.c:828
-#, c-format
-msgid "Could not update .gitmodules entry %s"
-msgstr ""
-
-#: submodule.c:115 submodule.c:144
-msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
-msgstr ""
-
-#: submodule.c:119 submodule.c:148
-#, c-format
-msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
-
-#: submodule.c:155
-#, c-format
-msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:166
-msgid "staging updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:346
-#, c-format
-msgid "in unpopulated submodule '%s'"
-msgstr ""
-
-#: submodule.c:377
-#, c-format
-msgid "Pathspec '%s' is in submodule '%.*s'"
-msgstr ""
-
-#: submodule.c:454
-#, c-format
-msgid "bad --ignore-submodules argument: %s"
-msgstr ""
-
-#: submodule.c:866
-#, c-format
-msgid ""
-"Submodule in commit %s at path: '%s' collides with a submodule named the "
-"same. Skipping it."
-msgstr ""
-
-#: submodule.c:987
-#, c-format
-msgid "submodule entry '%s' (%s) is a %s, not a commit"
-msgstr ""
-
-#: submodule.c:1069
-#, c-format
-msgid ""
-"Could not run 'git rev-list <commits> --not --remotes -n 1' command in "
-"submodule %s"
-msgstr ""
-
-#: submodule.c:1192
-#, c-format
-msgid "process for submodule '%s' failed"
-msgstr ""
-
-#: submodule.c:1221 builtin/branch.c:714 builtin/submodule--helper.c:2827
-msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
-
-#: submodule.c:1232
-#, c-format
-msgid "Pushing submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1235
-#, c-format
-msgid "Unable to push submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1567
-#, c-format
-msgid "Fetching submodule %s%s\n"
-msgstr ""
-
-#: submodule.c:1589
-#, c-format
-msgid "Could not access submodule '%s'\n"
-msgstr ""
-
-#: submodule.c:1618
-#, c-format
-msgid "Could not access submodule '%s' at commit %s\n"
-msgstr ""
-
-#: submodule.c:1629
-#, c-format
-msgid "Fetching submodule %s%s at commit %s\n"
-msgstr ""
-
-#: submodule.c:1849
-#, c-format
-msgid ""
-"Errors during submodule fetch:\n"
-"%s"
-msgstr ""
-
-#: submodule.c:1874
-#, c-format
-msgid "'%s' not recognized as a git repository"
-msgstr ""
-
-#: submodule.c:1891
-#, c-format
-msgid "Could not run 'git status --porcelain=2' in submodule %s"
-msgstr ""
-
-#: submodule.c:1932
-#, c-format
-msgid "'git status --porcelain=2' failed in submodule %s"
-msgstr ""
-
-#: submodule.c:2007
-#, c-format
-msgid "could not start 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2020
-#, c-format
-msgid "could not run 'git status' in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2037
-#, c-format
-msgid "Could not unset core.worktree setting in submodule '%s'"
-msgstr ""
-
-#: submodule.c:2064 submodule.c:2379
-#, c-format
-msgid "could not recurse into submodule '%s'"
-msgstr ""
-
-#: submodule.c:2086
-msgid "could not reset submodule index"
-msgstr ""
-
-#: submodule.c:2128
-#, c-format
-msgid "submodule '%s' has dirty index"
-msgstr ""
-
-#: submodule.c:2182
-#, c-format
-msgid "Submodule '%s' could not be updated."
-msgstr ""
-
-#: submodule.c:2250
-#, c-format
-msgid "submodule git dir '%s' is inside git dir '%.*s'"
-msgstr ""
-
-#: submodule.c:2271
-#, c-format
-msgid ""
-"relocate_gitdir for submodule '%s' with more than one worktree not supported"
-msgstr ""
-
-#: submodule.c:2283 submodule.c:2343
-#, c-format
-msgid "could not lookup name for submodule '%s'"
-msgstr ""
-
-#: submodule.c:2287
-#, c-format
-msgid "refusing to move '%s' into an existing git dir"
-msgstr ""
-
-#: submodule.c:2293
-#, c-format
-msgid ""
-"Migrating git directory of '%s%s' from\n"
-"'%s' to\n"
-"'%s'\n"
-msgstr ""
-
-#: submodule.c:2424
-msgid "could not start ls-files in .."
-msgstr ""
-
-#: submodule.c:2464
-#, c-format
-msgid "ls-tree returned unexpected return code %d"
-msgstr ""
-
-#: symlinks.c:244
-#, c-format
-msgid "failed to lstat '%s'"
-msgstr ""
-
-#: trailer.c:244
-#, c-format
-msgid "running trailer command '%s' failed"
-msgstr ""
-
-#: trailer.c:493 trailer.c:498 trailer.c:503 trailer.c:562 trailer.c:566
-#: trailer.c:570
-#, c-format
-msgid "unknown value '%s' for key '%s'"
-msgstr ""
-
-#: trailer.c:547 trailer.c:552 trailer.c:557 builtin/remote.c:300
-#: builtin/remote.c:328
-#, c-format
-msgid "more than one %s"
-msgstr ""
-
-#: trailer.c:743
-#, c-format
-msgid "empty trailer token in trailer '%.*s'"
-msgstr ""
-
-#: trailer.c:763
-#, c-format
-msgid "could not read input file '%s'"
-msgstr ""
-
-#: trailer.c:766 builtin/mktag.c:88 imap-send.c:1563
-msgid "could not read from stdin"
-msgstr ""
-
-#: trailer.c:1024 wrapper.c:760
-#, c-format
-msgid "could not stat %s"
-msgstr ""
-
-#: trailer.c:1026
-#, c-format
-msgid "file %s is not a regular file"
-msgstr ""
-
-#: trailer.c:1028
-#, c-format
-msgid "file %s is not writable by user"
-msgstr ""
-
-#: trailer.c:1040
-msgid "could not open temporary file"
-msgstr ""
-
-#: trailer.c:1080
-#, c-format
-msgid "could not rename temporary file to %s"
-msgstr ""
-
-#: transport-helper.c:62 transport-helper.c:91
-msgid "full write to remote helper failed"
-msgstr ""
-
-#: transport-helper.c:145
-#, c-format
-msgid "unable to find remote helper for '%s'"
-msgstr ""
-
-#: transport-helper.c:161 transport-helper.c:575
-msgid "can't dup helper output fd"
-msgstr ""
-
-#: transport-helper.c:214
-#, c-format
-msgid ""
-"unknown mandatory capability %s; this remote helper probably needs newer "
-"version of Git"
-msgstr ""
-
-#: transport-helper.c:220
-msgid "this remote helper should implement refspec capability"
-msgstr ""
-
-#: transport-helper.c:287 transport-helper.c:429
-#, c-format
-msgid "%s unexpectedly said: '%s'"
-msgstr ""
-
-#: transport-helper.c:417
-#, c-format
-msgid "%s also locked %s"
-msgstr ""
-
-#: transport-helper.c:497
-msgid "couldn't run fast-import"
-msgstr ""
-
-#: transport-helper.c:520
-msgid "error while running fast-import"
-msgstr ""
-
-#: transport-helper.c:549 transport-helper.c:1254
-#, c-format
-msgid "could not read ref %s"
-msgstr ""
-
-#: transport-helper.c:594
-#, c-format
-msgid "unknown response to connect: %s"
-msgstr ""
-
-#: transport-helper.c:616
-msgid "setting remote service path not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:618
-msgid "invalid remote service path"
-msgstr ""
-
-#: transport-helper.c:661 transport.c:1496
-msgid "operation not supported by protocol"
-msgstr ""
-
-#: transport-helper.c:664
-#, c-format
-msgid "can't connect to subservice %s"
-msgstr ""
-
-#: transport-helper.c:693 transport.c:415
-msgid "--negotiate-only requires protocol v2"
-msgstr ""
-
-#: transport-helper.c:758
-msgid "'option' without a matching 'ok/error' directive"
-msgstr ""
-
-#: transport-helper.c:801
-#, c-format
-msgid "expected ok/error, helper said '%s'"
-msgstr ""
-
-#: transport-helper.c:862
-#, c-format
-msgid "helper reported unexpected status of %s"
-msgstr ""
-
-#: transport-helper.c:945
-#, c-format
-msgid "helper %s does not support dry-run"
-msgstr ""
-
-#: transport-helper.c:948
-#, c-format
-msgid "helper %s does not support --signed"
-msgstr ""
-
-#: transport-helper.c:951
-#, c-format
-msgid "helper %s does not support --signed=if-asked"
-msgstr ""
-
-#: transport-helper.c:956
-#, c-format
-msgid "helper %s does not support --atomic"
-msgstr ""
-
-#: transport-helper.c:960
-#, c-format
-msgid "helper %s does not support --%s"
-msgstr ""
-
-#: transport-helper.c:967
-#, c-format
-msgid "helper %s does not support 'push-option'"
-msgstr ""
-
-#: transport-helper.c:1067
-msgid "remote-helper doesn't support push; refspec needed"
-msgstr ""
-
-#: transport-helper.c:1072
-#, c-format
-msgid "helper %s does not support 'force'"
-msgstr ""
-
-#: transport-helper.c:1119
-msgid "couldn't run fast-export"
-msgstr ""
-
-#: transport-helper.c:1124
-msgid "error while running fast-export"
-msgstr ""
-
-#: transport-helper.c:1149
-#, c-format
-msgid ""
-"No refs in common and none specified; doing nothing.\n"
-"Perhaps you should specify a branch.\n"
-msgstr ""
-
-#: transport-helper.c:1231
-#, c-format
-msgid "unsupported object format '%s'"
-msgstr ""
-
-#: transport-helper.c:1240
-#, c-format
-msgid "malformed response in ref list: %s"
-msgstr ""
-
-#: transport-helper.c:1392
-#, c-format
-msgid "read(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1419
-#, c-format
-msgid "write(%s) failed"
-msgstr ""
-
-#: transport-helper.c:1468
-#, c-format
-msgid "%s thread failed"
-msgstr ""
-
-#: transport-helper.c:1472
-#, c-format
-msgid "%s thread failed to join: %s"
-msgstr ""
-
-#: transport-helper.c:1491 transport-helper.c:1495
-#, c-format
-msgid "can't start thread for copying data: %s"
-msgstr ""
-
-#: transport-helper.c:1532
-#, c-format
-msgid "%s process failed to wait"
-msgstr ""
-
-#: transport-helper.c:1536
-#, c-format
-msgid "%s process failed"
-msgstr ""
-
-#: transport-helper.c:1554 transport-helper.c:1563
-msgid "can't start thread for copying data"
-msgstr ""
-
-#: transport.c:116
-#, c-format
-msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr ""
-
-#: transport.c:138
-#, c-format
-msgid "could not read bundle '%s'"
-msgstr ""
-
-#: transport.c:234
-#, c-format
-msgid "transport: invalid depth option '%s'"
-msgstr ""
-
-#: transport.c:289
-msgid "see protocol.version in 'git help config' for more details"
-msgstr ""
-
-#: transport.c:290
-msgid "server options require protocol version 2 or later"
-msgstr ""
-
-#: transport.c:418
-msgid "server does not support wait-for-done"
-msgstr ""
-
-#: transport.c:770
-msgid "could not parse transport.color.* config"
-msgstr ""
-
-#: transport.c:845
-msgid "support for protocol v2 not implemented yet"
-msgstr ""
-
-#: transport.c:978
-#, c-format
-msgid "unknown value for config '%s': %s"
-msgstr ""
-
-#: transport.c:1044
-#, c-format
-msgid "transport '%s' not allowed"
-msgstr ""
-
-#: transport.c:1093
-msgid "git-over-rsync is no longer supported"
-msgstr ""
-
-#: transport.c:1196
-#, c-format
-msgid ""
-"The following submodule paths contain changes that can\n"
-"not be found on any remote:\n"
-msgstr ""
-
-#: transport.c:1200
-#, c-format
-msgid ""
-"\n"
-"Please try\n"
-"\n"
-"\tgit push --recurse-submodules=on-demand\n"
-"\n"
-"or cd to the path and use\n"
-"\n"
-"\tgit push\n"
-"\n"
-"to push them to a remote.\n"
-"\n"
-msgstr ""
-
-#: transport.c:1208
-msgid "Aborting."
-msgstr ""
-
-#: transport.c:1354
-msgid "failed to push all needed submodules"
-msgstr ""
-
-#: tree-walk.c:33
-msgid "too-short tree object"
-msgstr ""
-
-#: tree-walk.c:39
-msgid "malformed mode in tree entry"
-msgstr ""
-
-#: tree-walk.c:43
-msgid "empty filename in tree entry"
-msgstr ""
-
-#: tree-walk.c:118
-msgid "too-short tree file"
-msgstr ""
-
-#: unpack-trees.c:118
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%sPlease commit your changes or stash them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:120
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:123
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%sPlease commit your changes or stash them before you merge."
-msgstr ""
-
-#: unpack-trees.c:125
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:128
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%sPlease commit your changes or stash them before you %s."
-msgstr ""
-
-#: unpack-trees.c:130
-#, c-format
-msgid ""
-"Your local changes to the following files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:135
-#, c-format
-msgid ""
-"Updating the following directories would lose untracked files in them:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:138
-#, c-format
-msgid ""
-"Refusing to remove the current working directory:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:142
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:144
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:147
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:149
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:152
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:154
-#, c-format
-msgid ""
-"The following untracked working tree files would be removed by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:160
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%sPlease move or remove them before you switch branches."
-msgstr ""
-
-#: unpack-trees.c:162
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by "
-"checkout:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:165
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%sPlease move or remove them before you merge."
-msgstr ""
-
-#: unpack-trees.c:167
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by merge:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:170
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%sPlease move or remove them before you %s."
-msgstr ""
-
-#: unpack-trees.c:172
-#, c-format
-msgid ""
-"The following untracked working tree files would be overwritten by %s:\n"
-"%%s"
-msgstr ""
-
-#: unpack-trees.c:180
-#, c-format
-msgid "Entry '%s' overlaps with '%s'.  Cannot bind."
-msgstr ""
-
-#: unpack-trees.c:183
-#, c-format
-msgid ""
-"Cannot update submodule:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:186
-#, c-format
-msgid ""
-"The following paths are not up to date and were left despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:188
-#, c-format
-msgid ""
-"The following paths are unmerged and were left despite sparse patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:190
-#, c-format
-msgid ""
-"The following paths were already present and thus not updated despite sparse "
-"patterns:\n"
-"%s"
-msgstr ""
-
-#: unpack-trees.c:270
-#, c-format
-msgid "Aborting\n"
-msgstr ""
-
-#: unpack-trees.c:297
-#, c-format
-msgid ""
-"After fixing the above paths, you may want to run `git sparse-checkout "
-"reapply`.\n"
-msgstr ""
-
-#: unpack-trees.c:358
-msgid "Updating files"
-msgstr ""
-
-#: unpack-trees.c:390
-msgid ""
-"the following paths have collided (e.g. case-sensitive paths\n"
-"on a case-insensitive filesystem) and only one from the same\n"
-"colliding group is in the working tree:\n"
-msgstr ""
-
-#: unpack-trees.c:1664
-msgid "Updating index flags"
-msgstr ""
-
-#: unpack-trees.c:2925
-#, c-format
-msgid "worktree and untracked commit have duplicate entries: %s"
-msgstr ""
-
-#: upload-pack.c:1579
-msgid "expected flush after fetch arguments"
-msgstr ""
-
-#: urlmatch.c:163
-msgid "invalid URL scheme name or missing '://' suffix"
-msgstr ""
-
-#: urlmatch.c:187 urlmatch.c:346 urlmatch.c:405
-#, c-format
-msgid "invalid %XX escape sequence"
-msgstr ""
-
-#: urlmatch.c:215
-msgid "missing host and scheme is not 'file:'"
-msgstr ""
-
-#: urlmatch.c:232
-msgid "a 'file:' URL may not have a port number"
-msgstr ""
-
-#: urlmatch.c:247
-msgid "invalid characters in host name"
-msgstr ""
-
-#: urlmatch.c:292 urlmatch.c:303
-msgid "invalid port number"
-msgstr ""
-
-#: urlmatch.c:371
-msgid "invalid '..' path segment"
-msgstr ""
-
-#: walker.c:170
-msgid "Fetching objects"
-msgstr ""
-
-#: worktree.c:237 builtin/am.c:2210 builtin/bisect--helper.c:156
-#, c-format
-msgid "failed to read '%s'"
-msgstr ""
-
-#: worktree.c:304
-#, c-format
-msgid "'%s' at main working tree is not the repository directory"
-msgstr ""
-
-#: worktree.c:315
-#, c-format
-msgid "'%s' file does not contain absolute path to the working tree location"
-msgstr ""
-
-#: worktree.c:327
-#, c-format
-msgid "'%s' does not exist"
-msgstr ""
-
-#: worktree.c:333
-#, c-format
-msgid "'%s' is not a .git file, error code %d"
-msgstr ""
-
-#: worktree.c:342
-#, c-format
-msgid "'%s' does not point back to '%s'"
-msgstr ""
-
-#: worktree.c:600
-msgid "not a directory"
-msgstr ""
-
-#: worktree.c:609
-msgid ".git is not a file"
-msgstr ""
-
-#: worktree.c:611
-msgid ".git file broken"
-msgstr ""
-
-#: worktree.c:613
-msgid ".git file incorrect"
-msgstr ""
-
-#: worktree.c:719
-msgid "not a valid path"
-msgstr ""
-
-#: worktree.c:725
-msgid "unable to locate repository; .git is not a file"
-msgstr ""
-
-#: worktree.c:729
-msgid "unable to locate repository; .git file does not reference a repository"
-msgstr ""
-
-#: worktree.c:733
-msgid "unable to locate repository; .git file broken"
-msgstr ""
-
-#: worktree.c:739
-msgid "gitdir unreadable"
-msgstr ""
-
-#: worktree.c:743
-msgid "gitdir incorrect"
-msgstr ""
-
-#: worktree.c:768
-msgid "not a valid directory"
-msgstr ""
-
-#: worktree.c:774
-msgid "gitdir file does not exist"
-msgstr ""
-
-#: worktree.c:779 worktree.c:788
-#, c-format
-msgid "unable to read gitdir file (%s)"
-msgstr ""
-
-#: worktree.c:798
-#, c-format
-msgid "short read (expected %<PRIuMAX> bytes, read %<PRIuMAX>)"
-msgstr ""
-
-#: worktree.c:806
-msgid "invalid gitdir file"
-msgstr ""
-
-#: worktree.c:814
-msgid "gitdir file points to non-existent location"
-msgstr ""
-
-#: worktree.c:830
-#, c-format
-msgid "unable to set %s in '%s'"
-msgstr ""
-
-#: worktree.c:832
-#, c-format
-msgid "unable to unset %s in '%s'"
-msgstr ""
-
-#: worktree.c:852
-msgid "failed to set extensions.worktreeConfig setting"
-msgstr ""
-
-#: wrapper.c:161
-#, c-format
-msgid "could not setenv '%s'"
-msgstr ""
-
-#: wrapper.c:213
-#, c-format
-msgid "unable to create '%s'"
-msgstr ""
-
-#: wrapper.c:215 wrapper.c:385
-#, c-format
-msgid "could not open '%s' for reading and writing"
-msgstr ""
-
-#: wrapper.c:416 wrapper.c:683
-#, c-format
-msgid "unable to access '%s'"
-msgstr ""
-
-#: wrapper.c:691
-msgid "unable to get current working directory"
-msgstr ""
-
-#: wt-status.c:158
-msgid "Unmerged paths:"
-msgstr ""
-
-#: wt-status.c:187 wt-status.c:219
-msgid "  (use \"git restore --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:190 wt-status.c:222
-#, c-format
-msgid "  (use \"git restore --source=%s --staged <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:193 wt-status.c:225
-msgid "  (use \"git rm --cached <file>...\" to unstage)"
-msgstr ""
-
-#: wt-status.c:197
-msgid "  (use \"git add <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:199 wt-status.c:203
-msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
-msgstr ""
-
-#: wt-status.c:201
-msgid "  (use \"git rm <file>...\" to mark resolution)"
-msgstr ""
-
-#: wt-status.c:211 wt-status.c:1140
-msgid "Changes to be committed:"
-msgstr ""
-
-#: wt-status.c:234 wt-status.c:1149
-msgid "Changes not staged for commit:"
-msgstr ""
-
-#: wt-status.c:238
-msgid "  (use \"git add <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:240
-msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
-msgstr ""
-
-#: wt-status.c:241
-msgid ""
-"  (use \"git restore <file>...\" to discard changes in working directory)"
-msgstr ""
-
-#: wt-status.c:243
-msgid "  (commit or discard the untracked or modified content in submodules)"
-msgstr ""
-
-#: wt-status.c:254
-#, c-format
-msgid "  (use \"git %s <file>...\" to include in what will be committed)"
-msgstr ""
-
-#: wt-status.c:266
-msgid "both deleted:"
-msgstr ""
-
-#: wt-status.c:268
-msgid "added by us:"
-msgstr ""
-
-#: wt-status.c:270
-msgid "deleted by them:"
-msgstr ""
-
-#: wt-status.c:272
-msgid "added by them:"
-msgstr ""
-
-#: wt-status.c:274
-msgid "deleted by us:"
-msgstr ""
-
-#: wt-status.c:276
-msgid "both added:"
-msgstr ""
-
-#: wt-status.c:278
-msgid "both modified:"
-msgstr ""
-
-#: wt-status.c:288
-msgid "new file:"
-msgstr ""
-
-#: wt-status.c:290
-msgid "copied:"
-msgstr ""
-
-#: wt-status.c:292
-msgid "deleted:"
-msgstr ""
-
-#: wt-status.c:294
-msgid "modified:"
-msgstr ""
-
-#: wt-status.c:296
-msgid "renamed:"
-msgstr ""
-
-#: wt-status.c:298
-msgid "typechange:"
-msgstr ""
-
-#: wt-status.c:300
-msgid "unknown:"
-msgstr ""
-
-#: wt-status.c:302
-msgid "unmerged:"
-msgstr ""
-
-#: wt-status.c:382
-msgid "new commits, "
-msgstr ""
-
-#: wt-status.c:384
-msgid "modified content, "
-msgstr ""
-
-#: wt-status.c:386
-msgid "untracked content, "
-msgstr ""
-
-#: wt-status.c:973
-#, c-format
-msgid "Your stash currently has %d entry"
-msgid_plural "Your stash currently has %d entries"
-msgstr[0] ""
-msgstr[1] ""
-
-#: wt-status.c:1004
-msgid "Submodules changed but not updated:"
-msgstr ""
-
-#: wt-status.c:1006
-msgid "Submodule changes to be committed:"
-msgstr ""
-
-#: wt-status.c:1088
-msgid ""
-"Do not modify or remove the line above.\n"
-"Everything below it will be ignored."
-msgstr ""
-
-#: wt-status.c:1180
-#, c-format
-msgid ""
-"\n"
-"It took %.2f seconds to compute the b
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 7/9] Makefile: add "po-update" rule to update po/XX.po

From: Jiang Xin <zhiyou.jx@alibaba-inc.com>

Since there is no longer a "po/git.pot" file in tree, a l10n team leader has to run several commands to update their "po/XX.po" file:

    $ make pot
    $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot

To make this process easier, add a new rule so that l10n team leaders can update their "po/XX.po" with one command. E.g.:

    $ make po-update PO_FILE=po/zh_CN.po
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile   | 18 ++++++++++++++++++
 shared.mak |  1 +
 2 files changed, 19 insertions(+)
Show changes to 2 files +19 −0

Makefile, shared.mak

diff --git a/Makefile b/Makefile
index 34904b90d2..edebd44d5c 100644
--- a/Makefile
+++ b/Makefile
@@ -571,6 +571,7 @@ TCLTK_PATH = wish
 XGETTEXT = xgettext
 MSGCAT = msgcat
 MSGFMT = msgfmt
+MSGMERGE = msgmerge
 CURL_CONFIG = curl-config
 GCOV = gcov
 STRIP = strip
@@ -2716,6 +2717,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
 XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
 	--keyword=__ --keyword=N__ --keyword="__n:1,2"
 MSGCAT_FLAGS = --sort-by-file
+MSGMERGE_FLAGS = --add-location --backup=off --update
 LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
 	      $(FOUND_H_SOURCES) $(GENERATED_H)
 LOCALIZED_SH = $(SCRIPT_SH)
@@ -2787,6 +2789,22 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+define check_po_file_envvar
+	$(if $(PO_FILE), \
+		$(if $(filter po/%.po,$(PO_FILE)), , \
+			$(error PO_FILE should match pattern: "po/%.po")), \
+		$(error PO_FILE is not defined))
+endef
+
+.PHONY: po-update
+po-update: po/git.pot
+	$(check_po_file_envvar)
+	@if test ! -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) does not exist"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
+
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
diff --git a/shared.mak b/shared.mak
index 50d4596f0d..8cd170a7e7 100644
--- a/shared.mak
+++ b/shared.mak
@@ -63,6 +63,7 @@ ifndef V
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
+	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
 	QUIET_SP       = @echo '   ' SP $<;
 	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 10:07 UTC · re: Jiang Xin · lore

Re: [PATCH v2 7/9] Makefile: add "po-update" rule to update po/XX.po

On Thu, May 19 2022, Jiang Xin wrote:
Show 37 quoted lines
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> Since there is no longer a "po/git.pot" file in tree, a l10n team leader
> has to run several commands to update their "po/XX.po" file:
>
>     $ make pot
>     $ msgmerge --add-location --backup=off -U po/XX.po po/git.pot
>
> To make this process easier, add a new rule so that l10n team leaders
> can update their "po/XX.po" with one command. E.g.:
>
>     $ make po-update PO_FILE=po/zh_CN.po
>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  Makefile   | 18 ++++++++++++++++++
>  shared.mak |  1 +
>  2 files changed, 19 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index 34904b90d2..edebd44d5c 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -571,6 +571,7 @@ TCLTK_PATH = wish
>  XGETTEXT = xgettext
>  MSGCAT = msgcat
>  MSGFMT = msgfmt
> +MSGMERGE = msgmerge
>  CURL_CONFIG = curl-config
>  GCOV = gcov
>  STRIP = strip
> @@ -2716,6 +2717,7 @@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
>  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --language=Perl \
>  	--keyword=__ --keyword=N__ --keyword="__n:1,2"
>  MSGCAT_FLAGS = --sort-by-file
> +MSGMERGE_FLAGS = --add-location --backup=off --update

Ok, we'd like to have the location in the po/*.po files still. We're just getting rid of po/git.pot.

I had some patches to also do it for the po/XX.po files, thinking that we'd only check in the "meaningful" data. We'd then offer translators some targets to add the locations to the file for working on them, and then flip back before they did a "git commit" etc. etc.

But none of that needs to happen now, and this series is already quite large, so just leaving things here seems like a good stopping point.

I also tested with --no-location (updated all to have no location), and a subsequent --add-location run repairs it. It also fixes a manually edited nonsense location for a valid msgid. So this all seems OK to me.

Show 22 quoted lines
>  LOCALIZED_C = $(FOUND_C_SOURCES) $(SCALAR_SOURCES) \
>  	      $(FOUND_H_SOURCES) $(GENERATED_H)
>  LOCALIZED_SH = $(SCRIPT_SH)
> @@ -2787,6 +2789,22 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
>  .PHONY: pot
>  pot: po/git.pot
>  
> +define check_po_file_envvar
> +	$(if $(PO_FILE), \
> +		$(if $(filter po/%.po,$(PO_FILE)), , \
> +			$(error PO_FILE should match pattern: "po/%.po")), \
> +		$(error PO_FILE is not defined))
> +endef
> +
> +.PHONY: po-update
> +po-update: po/git.pot
> +	$(check_po_file_envvar)
> +	@if test ! -e $(PO_FILE); then \
> +		echo >&2 "error: $(PO_FILE) does not exist"; \
> +		exit 1; \
> +	fi
> +	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
Nit: better to put the $(QUIET_MSGMERGE) in place of that @, i.e. V=1
will give you the full debug dump.

This is fine too I suppose, but we tend to use $(QUIET_*) like that elsewhere...

Show 15 quoted lines
>  .PHONY: check-pot
>  check-pot: $(LOCALIZED_ALL_GEN_PO)
>  
> diff --git a/shared.mak b/shared.mak
> index 50d4596f0d..8cd170a7e7 100644
> --- a/shared.mak
> +++ b/shared.mak
> @@ -63,6 +63,7 @@ ifndef V
>  	QUIET_LNCP     = @echo '   ' LN/CP $@;
>  	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
>  	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
> +	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
>  	QUIET_GCOV     = @echo '   ' GCOV $@;
>  	QUIET_SP       = @echo '   ' SP $<;
>  	QUIET_HDR      = @echo '   ' HDR $(<:hcc=h);
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 6/9] po/git.pot: don't check in result of "make pot"

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Remove the "po/git.pot" file from being tracked, which started with dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13).

The reason the po/git.pot started being checked in was because the po/*.po files were changed a schema where we'd generate them from a known-good snapshot of po/git.pot, instead of each translator running "make pot" themselves.

This makes sense, but we don't need to carry this file in-tree just to achieve that aim, and doing so has resulted in a significant amount of "diff churn" since this method of doing it was introduced:

    $ git log -p --oneline -- po/git.pot|wc -l
    553743

We can instead let l10n contributors to generate "po/git.pot" in runtime to update their own "po/XX.po", and the l10n coordinator can check pull requests using CI pipeline.

This reverts to the schema introduced initially in cd5513a7168 (i18n:
Makefile: "pot" target to extract messages marked for translation,
2011-02-22).

The actual "git rm" of po/git.pot was in preceding commit to make this change easier to review, and to preempt the mailing list from blocking it due to it being too large.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile      | 1 +
 po/.gitignore | 1 +
 2 files changed, 2 insertions(+)
Show changes to 2 files +2 −0

Makefile, po/.gitignore

diff --git a/Makefile b/Makefile
index 304cd03276..34904b90d2 100644
--- a/Makefile
+++ b/Makefile
@@ -3312,6 +3312,7 @@ dist-doc: git$X
 
 distclean: clean
 	$(RM) configure
+	$(RM) po/git.pot
 	$(RM) config.log config.status config.cache
 	$(RM) config.mak.autogen config.mak.append
 	$(RM) -r autom4te.cache
diff --git a/po/.gitignore b/po/.gitignore
index 796b96d1c4..37d1301b32 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1 +1,2 @@
 /build
+/git.pot
-- 
2.36.0.1.g15c4090757
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 8/9] Makefile: add "po-init" rule to initialize po/XX.po

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

The core translation is the minimum set of work that must be done for a new language translation.

There are over 5000 messages in the template message file "po/git.pot" that need to be translated. It is not a piece of cake for such a huge workload. So we used to define a small set of messages called "core translation" that a new l10n contributor must complete before sending pull request to the l10n coordinator.

By pulling in some parts of the git-po-helper[^1] logic, we add rule "core-pot" to create this core translation message "po/git-core.pot":

    make core-pot

To help new l10n contributors to initialized their "po/XX.pot" from "po/git-core.pot", we also add new rules "po-init":

    make po-init POT_FILE=po/XX.po
[^1]: https://github.com/git-l10n/git-po-helper/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile      | 44 ++++++++++++++++++++++++++++++++++++++++++++
 po/.gitignore |  1 +
 shared.mak    |  1 +
 3 files changed, 46 insertions(+)
Show changes to 3 files +46 −0

Makefile, po/.gitignore, shared.mak

diff --git a/Makefile b/Makefile
index edebd44d5c..0a687a6eb2 100644
--- a/Makefile
+++ b/Makefile
@@ -2801,6 +2801,7 @@ po-update: po/git.pot
 	$(check_po_file_envvar)
 	@if test ! -e $(PO_FILE); then \
 		echo >&2 "error: $(PO_FILE) does not exist"; \
+		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
 		exit 1; \
 	fi
 	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
@@ -2808,6 +2809,49 @@ po-update: po/git.pot
 .PHONY: check-pot
 check-pot: $(LOCALIZED_ALL_GEN_PO)
 
+### TODO FIXME: Translating everything in these files is a bad
+### heuristic for "core", as we'll translate obscure error() messages
+### along with commonly seen i18n messages. A better heuristic would
+### be to e.g. use spatch to first remove error/die/warning
+### etc. messages.
+LOCALIZED_C_CORE =
+LOCALIZED_C_CORE += builtin/checkout.c
+LOCALIZED_C_CORE += builtin/clone.c
+LOCALIZED_C_CORE += builtin/index-pack.c
+LOCALIZED_C_CORE += builtin/push.c
+LOCALIZED_C_CORE += builtin/reset.c
+LOCALIZED_C_CORE += remote.c
+LOCALIZED_C_CORE += wt-status.c
+
+LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
+
+.PHONY: core-pot
+core-pot: po/git-core.pot
+
+.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
+	$(call mkdir_p_parent_template)
+	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
+		-o - /dev/null | \
+	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
+	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
+
+po/git-core.pot: .build/pot/git-core.header $(LOCALIZED_C_CORE_GEN_PO)
+	$(QUIET_GEN)$(MSGCAT) $(MSGCAT_FLAGS) $^ >$@
+
+.PHONY: po-init
+po-init: po/git-core.pot
+	$(check_po_file_envvar)
+	@if test -e $(PO_FILE); then \
+		echo >&2 "error: $(PO_FILE) exists already"; \
+		exit 1; \
+	fi
+	$(QUIET_MSGINIT)msginit \
+		--input=$< \
+		--output=$(PO_FILE) \
+		--no-translator \
+		--locale=$(PO_FILE:po/%.po=%)
+
+## po/*.po files & their rules
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/po/.gitignore b/po/.gitignore
index 37d1301b32..ff0e5176a6 100644
--- a/po/.gitignore
+++ b/po/.gitignore
@@ -1,2 +1,3 @@
 /build
 /git.pot
+/git-core.pot
diff --git a/shared.mak b/shared.mak
index 8cd170a7e7..4330192e9c 100644
--- a/shared.mak
+++ b/shared.mak
@@ -62,6 +62,7 @@ ifndef V
 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
 	QUIET_LNCP     = @echo '   ' LN/CP $@;
 	QUIET_XGETTEXT = @echo '   ' XGETTEXT $@;
+	QUIET_MSGINIT  = @echo '   ' MSGINIT $@;
 	QUIET_MSGFMT   = @echo '   ' MSGFMT $@;
 	QUIET_MSGMERGE = @echo '   ' MSGMERGE $@;
 	QUIET_GCOV     = @echo '   ' GCOV $@;
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 10:22 UTC · re: Jiang Xin · lore

Re: [PATCH v2 8/9] Makefile: add "po-init" rule to initialize po/XX.po

On Thu, May 19 2022, Jiang Xin wrote:
Show 20 quoted lines
> From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> The core translation is the minimum set of work that must be done for a
> new language translation.
>
> There are over 5000 messages in the template message file "po/git.pot"
> that need to be translated. It is not a piece of cake for such a huge
> workload. So we used to define a small set of messages called "core
> translation" that a new l10n contributor must complete before sending
> pull request to the l10n coordinator.
>
> By pulling in some parts of the git-po-helper[^1] logic, we add rule
> "core-pot" to create this core translation message "po/git-core.pot":
>
>     make core-pot
>
> To help new l10n contributors to initialized their "po/XX.pot" from
> "po/git-core.pot", we also add new rules "po-init":
>
>     make po-init POT_FILE=po/XX.po
This is a typo, you mean PO_FILE, not POT_FILE.
Show 14 quoted lines
>  Makefile      | 44 ++++++++++++++++++++++++++++++++++++++++++++
>  po/.gitignore |  1 +
>  shared.mak    |  1 +
>  3 files changed, 46 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index edebd44d5c..0a687a6eb2 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2801,6 +2801,7 @@ po-update: po/git.pot
>  	$(check_po_file_envvar)
>  	@if test ! -e $(PO_FILE); then \
>  		echo >&2 "error: $(PO_FILE) does not exist"; \
> +		echo >&2 'To create an initial po file, use: "make po-init PO_FILE=po/XX.po"'; \
Correct here.
Show 33 quoted lines
>  		exit 1; \
>  	fi
>  	$(QUIET_MSGMERGE)$(MSGMERGE) $(MSGMERGE_FLAGS) $(PO_FILE) po/git.pot
> @@ -2808,6 +2809,49 @@ po-update: po/git.pot
>  .PHONY: check-pot
>  check-pot: $(LOCALIZED_ALL_GEN_PO)
>  
> +### TODO FIXME: Translating everything in these files is a bad
> +### heuristic for "core", as we'll translate obscure error() messages
> +### along with commonly seen i18n messages. A better heuristic would
> +### be to e.g. use spatch to first remove error/die/warning
> +### etc. messages.
> +LOCALIZED_C_CORE =
> +LOCALIZED_C_CORE += builtin/checkout.c
> +LOCALIZED_C_CORE += builtin/clone.c
> +LOCALIZED_C_CORE += builtin/index-pack.c
> +LOCALIZED_C_CORE += builtin/push.c
> +LOCALIZED_C_CORE += builtin/reset.c
> +LOCALIZED_C_CORE += remote.c
> +LOCALIZED_C_CORE += wt-status.c
> +
> +LOCALIZED_C_CORE_GEN_PO = $(LOCALIZED_C_CORE:%=.build/pot/po/%.po)
> +
> +.PHONY: core-pot
> +core-pot: po/git-core.pot
> +
> +.build/pot/git-core.header: $(LOCALIZED_C_CORE_GEN_PO)
> +	$(call mkdir_p_parent_template)
> +	$(QUIET_XGETTEXT)$(XGETTEXT) $(XGETTEXT_FLAGS_C) \
> +		-o - /dev/null | \
> +	sed -e 's|charset=CHARSET|charset=UTF-8|g' >$@ && \
> +	echo '"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"' >>$@
> +
This looks OK to me, FWIW in the version I have on my branch I tried to
munge some of this a bit more. So the diff between my (-)/yours (+) is:
	
	--- po/fo.po    2022-05-19 12:23:02.548459230 +0200
	+++ po/fo.po.jx 2022-05-19 12:22:50.608563768 +0200
	@@ -1,19454 +1,1224 @@
	+# Faroese translations for Git package.
	+# Copyright (C) 2022 THE Git'S COPYRIGHT HOLDER
	 # This file is distributed under the same license as the Git package.
	+# Automatically generated, 2022.
	+#
	 msgid ""
	 msgstr ""
	 "Project-Id-Version: Git\n"
	-"Last-Translator: make by the Makefile\n"
	-"Language-Team: Git Mailing List <git@vger.kernel.org>\n"
	+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
	+"POT-Creation-Date: 2022-05-19 12:22+0200\n"
	+"PO-Revision-Date: 2022-05-19 12:22+0200\n"
	+"Last-Translator: Automatically generated\n"
	+"Language-Team: none\n"
	 "Language: fo\n"
	 "MIME-Version: 1.0\n"
	 "Content-Type: text/plain; charset=UTF-8\n"
	 "Content-Transfer-Encoding: 8bit\n"
	 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
	-"PO-Revision-Date: 2022-04-11 11:05+0200\n"

So yours has the "Faroese translations for Git package" (good), but I also omitted/corrected some of the headers. See 72ed0c8b2e6 (i18n: migrate to line-number-less i18n workflow, 2022-04-03) in my fork.

This version is also fine, but just in case you wanted to steal something from it...

Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 9/9] l10n: Document the new l10n workflow

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

Change the "flow" of how translators interact with the l10n repository at [1] to adjust it for a new workflow of not having a po/git.pot file in-tree at all, and to not commit line numbers to the po/*.po files that we do track in tree.

The current workflow was added in a combination of dce37b66fb0 (l10n: initial git.pot for 1.7.10 upcoming release, 2012-02-13) and 271ce198cd0 (Update l10n guide, 2012-02-29).

As noted in preceding commits I think that it came about due to technical debt I'd left behind in how the "po/git.pot" file was created, and a mis-impression that the file:line comments were needed as anything more than a transitory translation aid.

As the updated po/README.md shows the new workflow is substantially the same, the difference is that translators no longer need to initially pull from the l10n coordinator for a new po/git.pot, they can simply use git.git's canonical source repository.

The l10n coordinator is still expected to announce a release to translate, which presumably would always be Junio's latest release tag. I'm not certain if this part of the process is actually important. I.e. the delta translation-wise between that tag and "master" is usually pretty small, so perhaps translators can just work on "master" instead.

1. https://github.com/git-l10n/git-po/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 po/README.md | 191 ++++++++++++++++++++++++---------------------------
 1 file changed, 88 insertions(+), 103 deletions(-)
Show changes to po/README.md +88 −103
diff --git a/po/README.md b/po/README.md
index 19fabb4acf..00c090e7c0 100644
--- a/po/README.md
+++ b/po/README.md
@@ -46,65 +46,67 @@ for a new language translation. Because there are more than 5000 messages
 in the template message file "po/git.pot" that need to be translated,
 this is not a piece of cake for the contributor for a new language.
 
-The core template message file which contains a small set of messages
-will be generated in "po-core/core.pot" automatically by running a helper
-program named "git-po-helper" (described later).
+The "core" set of messages can be generated at "po/git-core.pot" by
+running:
 
 ```shell
-git-po-helper init --core XX.po
+make core-pot
 ```
 
-After translating the generated "po-core/XX.po", you can merge it to
-"po/XX.po" using the following commands:
-
-```shell
-msgcat po-core/XX.po po/XX.po -s -o /tmp/XX.po
-mv /tmp/XX.po po/XX.po
-git-po-helper update XX.po
-```
-
-Edit "po/XX.po" by hand to fix "fuzzy" messages, which may have misplaced
-translated messages and duplicate messages.
+And then proceeding with the rest of these instructions on the new
+generated "po/git-core.pot" file.
 
 
 ## Translation Process Flow
 
 The overall data-flow looks like this:
 
-    +-------------------+            +------------------+
-    | Git source code   | ---(1)---> | L10n coordinator |
-    | repository        | <---(4)--- | repository       |
-    +-------------------+            +------------------+
-                                          |      ^
-                                         (2)    (3)
-                                          V      |
-                                     +------------------+
-                                     | Language Team XX |
-                                     +------------------+
+    +-------------------+             +------------------+
+    | Git source code   | ----(2)---> | L10n coordinator |
+    | repository        | <---(5)---- | repository       |
+    +-------------------+             +------------------+
+                    |                     |    ^
+                   (1)                   (3)  (4)
+                    V                     v    |
+               +----------------------------------+
+               |        Language Team XX          |
+               +----------------------------------+
 
 - Translatable strings are marked in the source file.
-- L10n coordinator pulls from the source (1)
-- L10n coordinator updates the message template "po/git.pot"
-- Language team pulls from L10n coordinator (2)
-- Language team updates the message file "po/XX.po"
-- L10n coordinator pulls from Language team (3)
-- L10n coordinator asks the result to be pulled (4).
+- Language teams can start translation iterations at any time, even
+  before the l10n window opens:
+
+  + Pull from the source (1)
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
 
+- The L10n coordinator pulls from source and announces the l10n window
+  open (2)
+- Language team pulls from the l10n coordinator, starts another
+  translation iteration against the l10n coordinator's tree (3)
 
-## Maintaining the "po/git.pot" file
+  + Run "git pull --rebase" from the l10n coordinator
+  + Update the message file by running "make po-update PO\_FILE=po/XX.po"
+  + Translate the message file "po/XX.po"
+  + Squash trivial l10n git commits using "git rebase -i"
 
-(This is done by the l10n coordinator).
+- Language team sends pull request to the l10n coordinator (4)
+- L10n coordinator checks and merges
+- L10n coordinator asks the result to be pulled (5).
 
-The "po/git.pot" file contains a message catalog extracted from Git's
-sources. The l10n coordinator maintains it by adding new translations with
-msginit(1), or update existing ones with msgmerge(1).  In order to update
-the Git sources to extract the messages from, the l10n coordinator is
-expected to pull from the main git repository at strategic point in
-history (e.g. when a major release and release candidates are tagged),
-and then run "make pot" at the top-level directory.
 
-Language contributors use this file to prepare translations for their
-language, but they are not expected to modify it.
+## Creating the "po/git.pot" file
+
+The "po/git.pot" file, once generated by the the l10n coordinator had
+been removed from the tree. L10n contributors can generated it at
+runtime using command:
+
+```shell
+make pot
+```
+
+Then language contributors use this file to prepare translations for
+their language, but they are not expected to modify it.
 
 
 ## Initializing a "XX.po" file
@@ -115,32 +117,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
 you add a translation for the first time by running:
 
 ```shell
-msginit --locale=XX
-```
-
-in the "po/" directory, where XX is the locale, e.g. "de", "is", "pt\_BR",
-"zh\_CN", etc.
-
-Then edit the automatically generated copyright info in your new "XX.po"
-to be correct, e.g. for Icelandic:
-
-```diff
-@@ -1,6 +1,6 @@
--# Icelandic translations for PACKAGE package.
--# Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER
--# This file is distributed under the same license as the PACKAGE package.
-+# Icelandic translations for Git.
-+# Copyright (C) 2010 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-+# This file is distributed under the same license as the Git package.
- # Ævar Arnfjörð Bjarmason <avarab@gmail.com>, 2010.
+make po-init PO_FILE=po/XX.po
 ```
 
-And change references to PACKAGE VERSION in the PO Header Entry to
-just "Git":
+Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
 
-```shell
-perl -pi -e 's/(?<="Project-Id-Version: )PACKAGE VERSION/Git/' XX.po
-```
+The newly generated message file "po/XX.po" is based on the core pot
+file "po/git-core.pot", so it contains only a minimal set of messages
+and it's a good start for a new language contribution.
 
 Once you are done testing the translation (see below), commit the result
 and ask the l10n coordinator to pull from you.
@@ -153,19 +137,40 @@ and ask the l10n coordinator to pull from you.
 If you are replacing translation strings in an existing "XX.po" file to
 improve the translation, just edit the file.
 
-If there's an existing "XX.po" file for your language, but the repository
-of the l10n coordinator has newer "po/git.pot" file, you would need to first
-pull from the l10n coordinator (see the beginning of this document for its
-URL), and then update the existing translation by running:
+If you want to find new translatable strings in source files of upstream
+repository and propagate them to your "po/XX.po", run command:
 
 ```shell
-msgmerge --add-location --backup=off -U XX.po git.pot
+make po-update PO_FILE=po/XX.po
 ```
 
-in the "po/" directory, where "XX.po" is the file you want to update.
+It will:
 
-Once you are done testing the translation (see below), commit the result
-and ask the l10n coordinator to pull from you.
+- Call "make pot" at runtime to generate new "po/git.pot" file
+- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
+  to update your "po/XX.po"
+- The "--add-location" option for msgmerge will add location lines,
+  and these location lines will help translation tools to location
+  translation context easily.
+
+Once you are done testing the translation (see below), it's better
+to commit a location-less "po/XX.po" file to save repository space
+and make a user-friendly patch for review.
+
+To save a location-less "po/XX.po" automatically in repository, you
+can:
+
+- Define new attribute for "po/XX.po" by adding new line in
+  ".git/info/attributes":
+
+        /po/XX.po filter=gettext-no-location
+
+- Define driver for "gettext-no-location" filter:
+
+        $ git config --global filter.gettext-no-location.clean \
+              "msgcat --no-location -"
+
+You're now ready to ask the l10n coordinator to pull from you.
 
 
 ## Fuzzy translation
@@ -196,6 +201,14 @@ common errors, e.g. missing printf format strings, or translated
 messages that deviate from the originals in whether they begin/end
 with a newline or not.
 
+L10n coordinator will check your contributions using a helper program
+(see "PO helper" section below):
+
+```shell
+git-po-helper check-po po/XX.po
+git-po-helper check-commits <rev-list-opts>
+```
+
 
 ## Marking strings for translation
 
@@ -370,29 +383,6 @@ l10n workflow.
 To build and install the helper program from source, see
 [git-po-helper/README][].
 
-Usage for git-po-helper:
-
-- To start a new language translation:
-
-  ```shell
-  git-po-helper init XX.po
-  ```
-
-- To update your "XX.po" file:
-
-  ```shell
-  git-po-helper update XX.po
-  ```
-
-- To check commit log and syntax of "XX.po":
-
-  ```shell
-  git-po-helper check-po XX.po
-  git-po-helper check-commits
-  ```
-
-Run "git-po-helper" without arguments to show usage.
-
 
 ## Conventions
 
@@ -436,13 +426,8 @@ additional conventions:
 - Initialize proper filename of the "XX.po" file conforming to
   iso-639 and iso-3166.
 
-- Must complete a minimal translation based on the "po-core/core.pot"
-  template. Using the following command to initialize the minimal
-  "po-core/XX.po" file:
-
-  ```shell
-  git-po-helper init --core <your-language>
-  ```
+- Must complete a minimal translation based on the "Core
+  translation". See that section above.
 
 - Add a new entry in the "po/TEAMS" file with proper format, and check
   the syntax of "po/TEAMS" by running the following command:
-- 
2.36.0.1.g15c4090757
Junio C Hamano· May 19, 2022, 17:18 UTC · re: Jiang Xin · lore

Re: [PATCH v2 9/9] l10n: Document the new l10n workflow

Jiang Xin <worldhello.net@gmail.com> writes:
> +## Creating the "po/git.pot" file
> +
> +The "po/git.pot" file, once generated by the the l10n coordinator had
"once generated" -> "used to be generated"
> +been removed from the tree. L10n contributors can generated it at
"can generated it" -> "can generate it"
Show 5 quoted lines
> +runtime using command:
> +
> +```shell
> +make pot
> +```

Just a minor detail, but I wonder if we want "make po/git.pot" here rather than "make pot", as the text before this command talks about "creating the po/git.pot file". It used to be that the readers of this document didn't have to worry about po/git.pot and the only thing they needed to know was stuff starting from "make po-init", but now they must be more aware of po/git.pot than before, so...

> +Then language contributors use this file to prepare translations for
> +their language, but they are not expected to modify it.
Show 8 quoted lines
> @@ -115,32 +117,14 @@ If your language XX does not have translated message file "po/XX.po" yet,
> ...
> +make po-init PO_FILE=po/XX.po
>  ```
>  
> -And change references to PACKAGE VERSION in the PO Header Entry to
> -just "Git":
> +Where XX is the locale, e.g. "de", "is", "pt\_BR", "zh\_CN", etc.
"Where" -> "where".

XX was called "the two character language translation codes" (mouthful isn't it) in much earlier part of the documentation, but here it stands for more than the language part. I wonder if that is confusing and we'd better use something other than XX.

In any case, we should define "locale" and tell the readers that language "XX" can be followed by territory "_YY" that clarifies the variant of the language, probably at the same place where we explained the two-letter language code and to the same degree by explaining the two-letter country codes and where they come from (i.e. ISO 3166-1).

> +It will:
>  
> +- Call "make pot" at runtime to generate new "po/git.pot" file

What does "at runtime" mean here? Would it change the meaning if I rewrote this line to

	Call "make pot" to generate new "po/git.pot" file

at all? To put it differently, does it call "make pot" at runtime, but it does not call "msgmerge --add-location ..." at runtime?

If "at runtime" is truly a noiseword, then remove it. It is confusing.

Show 5 quoted lines
> +- Call "msgmerge --add-location --backup=off -U po/XX.po po/git.pot"
> +  to update your "po/XX.po"
> +- The "--add-location" option for msgmerge will add location lines,
> +  and these location lines will help translation tools to location
> +  translation context easily.
"help translation tools to location" -> "help translation tools to locate"
probably.
Show 9 quoted lines
> +To save a location-less "po/XX.po" automatically in repository, you
> +can:
> +
> +- Define new attribute for "po/XX.po" by adding new line in
> +  ".git/info/attributes":
> +
> +        /po/XX.po filter=gettext-no-location
> +
> +- Define driver for "gettext-no-location" filter:
"filter" -> "clean filter"?
> +        $ git config --global filter.gettext-no-location.clean \
> +              "msgcat --no-location -"
> +
> +You're now ready to ask the l10n coordinator to pull from you.

Should this part also explain what it is doing, just like we explained what happens when "make po-update" is run in an earlier section?

    The above sets up a clean filter for po/XX.po file so that the
    "msgcat --no-location" command is used to strip out the location
    information from the contents when the file is checked in.
or something, perhaps?
Jiang Xin· May 21, 2022, 15:06 UTC · re: Junio C Hamano · lore

Re: [PATCH v2 9/9] l10n: Document the new l10n workflow

On Fri, May 20, 2022 at 1:18 AM Junio C Hamano <gitster@pobox.com> wrote:
Show 11 quoted lines
> XX was called "the two character language translation codes"
> (mouthful isn't it) in much earlier part of the documentation, but
> here it stands for more than the language part.  I wonder if that
> is confusing and we'd better use something other than XX.
>
> In any case, we should define "locale" and tell the readers that
> language "XX" can be followed by territory "_YY" that clarifies the
> variant of the language, probably at the same place where we
> explained the two-letter language code and to the same degree by
> explaining the two-letter country codes and where they come from
> (i.e. ISO 3166-1).
May change like this:
-- snip --
Show changes to diff +9 −3
@@ -9,8 +9,15 @@

     https://github.com/git-l10n/git-po/

-The two character language translation codes are defined by ISO\_639-1, as
-stated in the gettext(1) full manual, appendix A.1, Usual Language Codes.
+We will use XX as an alias to refer to the language translation code in
+the following paragraphs, for example we use "po/XX.po" to refer to a
+translation file for a specific language. But this doesn't mean that
+the language code has only two letters. We should know that the language
+code can be in one of two forms: "ll" or "ll\_CC". Here "ll" is the ISO
+639 two-letter language code and "CC" is the ISO 3166 two-letter code
+for country names and subdivisions. For example, for German, the language
+code is "de", and for Chinese in mainland China, the language code is
+"zh\_CN".
-- snap --
Jiang Xin· May 19, 2022, 08:15 UTC · re: Jiang Xin · lore

[PATCH v2 4/9] i18n CI: stop allowing non-ASCII source messages in po/git.pot

From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>

In the preceding commit we moved away from using xgettext(1) to both generate the po/git.pot, and to merge the incrementally generated po/git.pot+ file as we sourced translations from C, shell and Perl.

Doing it this way, which dates back to my initial implementation[1][2][3] was conflating two things: With xgettext(1) the --from-code both controls what encoding is specified in the po/git.pot's header, and what encoding we allow in source messages.

We don't ever want to allow non-ASCII in *source messages*, and doing so has hid e.g. a buggy message introduced in a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C, 2021-08-10) from us, we'd warn about it before, but only when running "make pot", but the operation would still succeed. Now we'll error out on it when running "make pot".

Since the preceding Makefile changes made this easy: let's add a "make check-pot" target with the same prerequisites as the "po/git.pot" target, but without changing the file "po/git.pot". Running it as part of the "static-analysis" CI target will ensure that we catch any such issues in the future. E.g.:

    $ make check-pot
        XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
              Please specify the source encoding through --from-code.
    make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
   marked for translation, 2011-02-22)
2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
   2011-05-14)
3. 5e9637c6297 (i18n: add infrastructure for translating Git with
   gettext, 2011-11-18)
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile                    | 6 ++++--
 builtin/submodule--helper.c | 2 +-
 ci/run-static-analysis.sh   | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)
Show changes to 3 files +7 −3

Makefile, builtin/submodule--helper.c, ci/run-static-analysis.sh

diff --git a/Makefile b/Makefile
index c32ac4ca30..304cd03276 100644
--- a/Makefile
+++ b/Makefile
@@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
 	--add-comments=TRANSLATORS: \
 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
 	--package-name=Git \
-	--sort-by-file \
-	--from-code=UTF-8
+	--sort-by-file
 XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
 XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
@@ -2788,6 +2787,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
 .PHONY: pot
 pot: po/git.pot
 
+.PHONY: check-pot
+check-pot: $(LOCALIZED_ALL_GEN_PO)
+
 ifdef NO_GETTEXT
 POFILES :=
 MOFILES :=
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 2c87ef9364..b97f02eed5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
 			   N_("reference repository")),
 		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
 		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
-			   N_("sets the submodule’s name to the given string "
+			   N_("sets the submodule's name to the given string "
 			      "instead of defaulting to its path")),
 		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
 		OPT_END()
diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
index 65bcebda41..0d51e5ce0e 100755
--- a/ci/run-static-analysis.sh
+++ b/ci/run-static-analysis.sh
@@ -29,4 +29,6 @@ fi
 make hdr-check ||
 exit 1
 
+make check-pot
+
 save_good_tree
-- 
2.36.0.1.g15c4090757
Ævar Arnfjörð Bjarmason· May 19, 2022, 10:02 UTC · re: Jiang Xin · lore

Re: [PATCH v2 4/9] i18n CI: stop allowing non-ASCII source messages in po/git.pot

On Thu, May 19 2022, Jiang Xin wrote:
Show 94 quoted lines
> From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> In the preceding commit we moved away from using xgettext(1) to both
> generate the po/git.pot, and to merge the incrementally generated
> po/git.pot+ file as we sourced translations from C, shell and Perl.
>
> Doing it this way, which dates back to my initial
> implementation[1][2][3] was conflating two things: With xgettext(1)
> the --from-code both controls what encoding is specified in the
> po/git.pot's header, and what encoding we allow in source messages.
>
> We don't ever want to allow non-ASCII in *source messages*, and doing
> so has hid e.g. a buggy message introduced in
> a6226fd772b (submodule--helper: convert the bulk of cmd_add() to C,
> 2021-08-10) from us, we'd warn about it before, but only when running
> "make pot", but the operation would still succeed. Now we'll error out
> on it when running "make pot".
>
> Since the preceding Makefile changes made this easy: let's add a "make
> check-pot" target with the same prerequisites as the "po/git.pot"
> target, but without changing the file "po/git.pot". Running it as part
> of the "static-analysis" CI target will ensure that we catch any such
> issues in the future. E.g.:
>
>     $ make check-pot
>         XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
>     xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
>               Please specify the source encoding through --from-code.
>     make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
>
> 1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
>    marked for translation, 2011-02-22)
> 2. adc3b2b2767 (Makefile: add xgettext target for *.sh files,
>    2011-05-14)
> 3. 5e9637c6297 (i18n: add infrastructure for translating Git with
>    gettext, 2011-11-18)
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  Makefile                    | 6 ++++--
>  builtin/submodule--helper.c | 2 +-
>  ci/run-static-analysis.sh   | 2 ++
>  3 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index c32ac4ca30..304cd03276 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2708,8 +2708,7 @@ XGETTEXT_FLAGS = \
>  	--add-comments=TRANSLATORS: \
>  	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
>  	--package-name=Git \
> -	--sort-by-file \
> -	--from-code=UTF-8
> +	--sort-by-file
>  XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
>  	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
>  XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
> @@ -2788,6 +2787,9 @@ po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
>  .PHONY: pot
>  pot: po/git.pot
>  
> +.PHONY: check-pot
> +check-pot: $(LOCALIZED_ALL_GEN_PO)
> +
>  ifdef NO_GETTEXT
>  POFILES :=
>  MOFILES :=
> diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
> index 2c87ef9364..b97f02eed5 100644
> --- a/builtin/submodule--helper.c
> +++ b/builtin/submodule--helper.c
> @@ -3378,7 +3378,7 @@ static int module_add(int argc, const char **argv, const char *prefix)
>  			   N_("reference repository")),
>  		OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
>  		OPT_STRING(0, "name", &add_data.sm_name, N_("name"),
> -			   N_("sets the submodule’s name to the given string "
> +			   N_("sets the submodule's name to the given string "
>  			      "instead of defaulting to its path")),
>  		OPT_INTEGER(0, "depth", &add_data.depth, N_("depth for shallow clones")),
>  		OPT_END()
> diff --git a/ci/run-static-analysis.sh b/ci/run-static-analysis.sh
> index 65bcebda41..0d51e5ce0e 100755
> --- a/ci/run-static-analysis.sh
> +++ b/ci/run-static-analysis.sh
> @@ -29,4 +29,6 @@ fi
>  make hdr-check ||
>  exit 1
>  
> +make check-pot
> +
>  save_good_tree

In my latest version of this (range-diff below, yours is the RHS) I had this depend on the full po.git pot file, i.e. .build/pot/git.pot. You're instead making it depend on only the intermediate files we msgcat from it.

What I was going for was to detect that non-ASCII issue, which your version will also do, but out of general paranoia I thought running it thorugh the same toolchain and produce the end result made sense.

So if there's any issue that the msgcat that produces po.git would spot we'll miss it here, but I don't know of any such problem.

So maybe there's nothing to worry about here, but it's probably worth noting that we're confident that we won't have any trouble because of not checking the end result po.git in the commit message...

1:  a7f8122d43f ! 1:  e2cfb1a2408 i18n CI: stop allowing non-ASCII source messages in po/git.pot
    @@ Commit message
         on it when running "make pot".
     
         Since the preceding Makefile changes made this easy: let's add a "make
    -    check-pot" target and run it as part of the "static-analysis" CI
    -    target, this will ensure that we catch any such issues in the future.
    +    check-pot" target with the same prerequisites as the "po/git.pot"
    +    target, but without changing the file "po/git.pot". Running it as part
    +    of the "static-analysis" CI target will ensure that we catch any such
    +    issues in the future. E.g.:
    +
    +        $ make check-pot
    +            XGETTEXT .build/pot/po/builtin/submodule--helper.c.po
    +        xgettext: Non-ASCII string at builtin/submodule--helper.c:3381.
    +                  Please specify the source encoding through --from-code.
    +        make: *** [.build/pot/po/builtin/submodule--helper.c.po] Error 1
     
         1. cd5513a7168 (i18n: Makefile: "pot" target to extract messages
            marked for translation, 2011-02-22)
    @@ Commit message
            gettext, 2011-11-18)
     
         Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
    +    Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
    +    Signed-off-by: Junio C Hamano <gitster@pobox.com>
     
      ## Makefile ##
    -@@ Makefile: pdf:
    - XGETTEXT_FLAGS = \
    - 	--force-po \
    +@@ Makefile: XGETTEXT_FLAGS = \
      	--add-comments=TRANSLATORS: \
    --	--from-code=UTF-8 \
    - 	--omit-header
    - 
    + 	--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
    + 	--package-name=Git \
    +-	--sort-by-file \
    +-	--from-code=UTF-8
    ++	--sort-by-file
      XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
    -@@ Makefile: po/git.pot: .build/pot/git.pot FORCE
    + 	--keyword=_ --keyword=N_ --keyword="Q_:1,2"
    + XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell \
    +@@ Makefile: po/git.pot: .build/pot/git.header $(LOCALIZED_ALL_GEN_PO)
      .PHONY: pot
      pot: po/git.pot
      
     +.PHONY: check-pot
    -+check-pot: .build/pot/git.pot
    ++check-pot: $(LOCALIZED_ALL_GEN_PO)
     +
      ifdef NO_GETTEXT
      POFILES :=

← back to recent threads