Merge branch 'sb/submodule-module-list-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Mar 2016 19:13:45 +0000 (11:13 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Mar 2016 19:13:45 +0000 (11:13 -0800)
A helper function "git submodule" uses since v2.7.0 to list the
modules that match the pathspec argument given to its subcommands
(e.g. "submodule add <repo> <path>") has been fixed.

* sb/submodule-module-list-fix:
submodule helper list: respect correct path prefix

192 files changed:
Documentation/RelNotes/2.7.1.txt [new file with mode: 0644]
Documentation/RelNotes/2.7.2.txt [new file with mode: 0644]
Documentation/fetch-options.txt
Documentation/git-add.txt
Documentation/git-am.txt
Documentation/git-cherry-pick.txt
Documentation/git-clean.txt
Documentation/git-clone.txt
Documentation/git-commit.txt
Documentation/git-for-each-ref.txt
Documentation/git-format-patch.txt
Documentation/git-push.txt
Documentation/git-revert.txt
Documentation/git-tag.txt
Documentation/git-worktree.txt
Documentation/git.txt
Documentation/gitignore.txt
Documentation/glossary-content.txt
Documentation/technical/api-argv-array.txt
Documentation/user-manual.txt
GIT-VERSION-GEN
RelNotes
alias.c
archive.c
argv-array.c
argv-array.h
attr.c
bisect.c
branch.c
branch.h
builtin/am.c
builtin/apply.c
builtin/blame.c
builtin/branch.c
builtin/check-ref-format.c
builtin/checkout.c
builtin/clean.c
builtin/clone.c
builtin/commit.c
builtin/config.c
builtin/diff.c
builtin/fast-export.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/grep.c
builtin/help.c
builtin/index-pack.c
builtin/init-db.c
builtin/merge-base.c
builtin/merge-tree.c
builtin/merge.c
builtin/mktree.c
builtin/mv.c
builtin/pack-objects.c
builtin/pack-redundant.c
builtin/receive-pack.c
builtin/reflog.c
builtin/remote-ext.c
builtin/remote.c
builtin/rev-parse.c
builtin/rm.c
builtin/stripspace.c
builtin/tag.c
builtin/worktree.c
cache-tree.c
cache.h
column.c
combine-diff.c
commit.c
compat/basename.c
compat/bswap.h
compat/mingw.c
compat/mingw.h
compat/precompose_utf8.c
compat/qsort.c
compat/setenv.c
compat/win32/syslog.c
config.c
contrib/completion/git-completion.bash
contrib/subtree/git-subtree.sh
contrib/subtree/t/t7900-subtree.sh
daemon.c
diff-no-index.c
diff.c
diff.h
diffcore-delta.c
diffcore-order.c
diffcore-rename.c
dir.c
entry.c
environment.c
ewah/bitmap.c
ewah/ewah_bitmap.c
ewah/ewah_io.c
ewah/ewok.h
exec_cmd.c
exec_cmd.h
fast-import.c
fetch-pack.c
fsck.c
git-compat-util.h
git-cvsserver.perl
git-filter-branch.sh
git-merge-one-file.sh
git-rebase.sh
git-send-email.perl
git.c
gitweb/gitweb.perl
graph.c
grep.c
hashmap.c
help.c
imap-send.c
khash.h
levenshtein.c
line-log.c
ll-merge.c
log-tree.c
merge-blobs.c
mergetools/vimdiff
name-hash.c
notes.c
pack-check.c
pack-revindex.c
pager.c
path.c
pathspec.c
perl/Git/SVN/Ra.pm
po/TEAMS
po/ko.po [new file with mode: 0644]
progress.c
read-cache.c
ref-filter.c
reflog-walk.c
refs.c
refs/files-backend.c
remote-curl.c
remote.c
revision.c
run-command.c
run-command.h
sequencer.c
setup.c
sha1_file.c
sha1_name.c
shallow.c
show-index.c
strbuf.c
submodule.c
t/perf/p7300-clean.sh
t/t0002-gitfile.sh
t/t0060-path-utils.sh
t/t1410-reflog.sh
t/t1501-work-tree.sh [new file with mode: 0755]
t/t1501-worktree.sh [deleted file]
t/t1509-root-work-tree.sh [new file with mode: 0755]
t/t1509-root-worktree.sh [deleted file]
t/t2019-checkout-ambiguous-ref.sh
t/t2027-worktree-list.sh
t/t3000-ls-files-others.sh
t/t3001-ls-files-others-exclude.sh
t/t3200-branch.sh
t/t3203-branch-output.sh
t/t4056-diff-order.sh
t/t5504-fetch-receive-strict.sh
t/t5505-remote.sh
t/t5510-fetch.sh
t/t5533-push-cas.sh
t/t6023-merge-file.sh
t/t6050-replace.sh
t/t6133-pathspec-rev-dwim.sh [new file with mode: 0755]
t/t6300-for-each-ref.sh
t/t7003-filter-branch.sh
t/t7004-tag.sh
t/t7409-submodule-detached-work-tree.sh [new file with mode: 0755]
t/t7409-submodule-detached-worktree.sh [deleted file]
t/t8005-blame-i18n.sh
t/t9001-send-email.sh
t/t9200-git-cvsexportcommit.sh
t/test-lib-functions.sh
t/test-lib.sh
test-path-utils.c
transport.c
tree-diff.c
userdiff.h
worktree.c
wrapper.c
write_or_die.c
xdiff-interface.c
xdiff/xdiff.h
xdiff/xemit.c
xdiff/xmerge.c
diff --git a/Documentation/RelNotes/2.7.1.txt b/Documentation/RelNotes/2.7.1.txt
new file mode 100644 (file)
index 0000000..6553d69
--- /dev/null
@@ -0,0 +1,87 @@
+Git v2.7.1 Release Notes
+========================
+
+Fixes since v2.7
+----------------
+
+ * An earlier change in 2.5.x-era broke users' hooks and aliases by
+   exporting GIT_WORK_TREE to point at the root of the working tree,
+   interfering when they tried to use a different working tree without
+   setting GIT_WORK_TREE environment themselves.
+
+ * The "exclude_list" structure has the usual "alloc, nr" pair of
+   fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
+   to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
+   array.
+
+ * "git send-email" was confused by escaped quotes stored in the alias
+   files saved by "mutt", which has been corrected.
+
+ * A few unportable C construct have been spotted by clang compiler
+   and have been fixed.
+
+ * The documentation has been updated to hint the connection between
+   the '--signoff' option and DCO.
+
+ * "git reflog" incorrectly assumed that all objects that used to be
+   at the tip of a ref must be commits, which caused it to segfault.
+
+ * The ignore mechanism saw a few regressions around untracked file
+   listing and sparse checkout selection areas in 2.7.0; the change
+   that is responsible for the regression has been reverted.
+
+ * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR
+   (e.g. COMMIT_EDITMSG) that is meant to be left after the command is
+   done.  This however did not work well if the repository is set to
+   be shared with core.sharedRepository and the umask of the previous
+   user is tighter.  They have been made to work better by calling
+   unlink(2) and retrying after fopen(3) fails with EPERM.
+
+ * Asking gitweb for a nonexistent commit left a warning in the server
+   log.
+
+ * "git rebase", unlike all other callers of "gc --auto", did not
+   ignore the exit code from "gc --auto".
+
+ * Many codepaths that run "gc --auto" before exiting kept packfiles
+   mapped and left the file descriptors to them open, which was not
+   friendly to systems that cannot remove files that are open.  They
+   now close the packs before doing so.
+
+ * A recent optimization to filter-branch in v2.7.0 introduced a
+   regression when --prune-empty filter is used, which has been
+   corrected.
+
+ * The description for SANITY prerequisite the test suite uses has
+   been clarified both in the comment and in the implementation.
+
+ * "git tag" started listing a tag "foo" as "tags/foo" when a branch
+   named "foo" exists in the same repository; remove this unnecessary
+   disambiguation, which is a regression introduced in v2.7.0.
+
+ * The way "git svn" uses auth parameter was broken by Subversion
+   1.9.0 and later.
+
+ * The "split" subcommand of "git subtree" (in contrib/) incorrectly
+   skipped merges when it shouldn't, which was corrected.
+
+ * A few options of "git diff" did not work well when the command was
+   run from a subdirectory.
+
+ * dirname() emulation has been added, as Msys2 lacks it.
+
+ * The underlying machinery used by "ls-files -o" and other commands
+   have been taught not to create empty submodule ref cache for a
+   directory that is not a submodule.  This removes a ton of wasted
+   CPU cycles.
+
+ * Drop a few old "todo" items by deciding that the change one of them
+   suggests is not such a good idea, and doing the change the other
+   one suggested to do.
+
+ * Documentation for "git fetch --depth" has been updated for clarity.
+
+ * The command line completion learned a handful of additional options
+   and command specific syntax.
+
+Also includes a handful of documentation and test updates.
diff --git a/Documentation/RelNotes/2.7.2.txt b/Documentation/RelNotes/2.7.2.txt
new file mode 100644 (file)
index 0000000..4feef76
--- /dev/null
@@ -0,0 +1,41 @@
+Git v2.7.2 Release Notes
+========================
+
+Fixes since v2.7.1
+------------------
+
+ * The low-level merge machinery has been taught to use CRLF line
+   termination when inserting conflict markers to merged contents that
+   are themselves CRLF line-terminated.
+
+ * "git worktree" had a broken code that attempted to auto-fix
+   possible inconsistency that results from end-users moving a
+   worktree to different places without telling Git (the original
+   repository needs to maintain backpointers to its worktrees, but
+   "mv" run by end-users who are not familiar with that fact will
+   obviously not adjust them), which actually made things worse
+   when triggered.
+
+ * "git push --force-with-lease" has been taught to report if the push
+   needed to force (or fast-forwarded).
+
+ * The emulated "yes" command used in our test scripts has been
+   tweaked not to spend too much time generating unnecessary output
+   that is not used, to help those who test on Windows where it would
+   not stop until it fills the pipe buffer due to lack of SIGPIPE.
+
+ * The vimdiff backend for "git mergetool" has been tweaked to arrange
+   and number buffers in the order that would match the expectation of
+   majority of people who read left to right, then top down and assign
+   buffers 1 2 3 4 "mentally" to local base remote merge windows based
+   on that order.
+
+ * The documentation for "git clean" has been corrected; it mentioned
+   that .git/modules/* are removed by giving two "-f", which has never
+   been the case.
+
+ * Paths that have been told the index about with "add -N" are not
+   quite yet in the index, but a few commands behaved as if they
+   already are in a harmful way.
+
+Also includes tiny documentation and test updates.
index 45583d8454b4cae9bdb2ddb904c077cf1d3a1223..78cd2653cddb833466a69d9236aee2f81ca3dd30 100644 (file)
@@ -8,10 +8,11 @@
        option old data in `.git/FETCH_HEAD` will be overwritten.
 
 --depth=<depth>::
-       Deepen or shorten the history of a 'shallow' repository created by
-       `git clone` with `--depth=<depth>` option (see linkgit:git-clone[1])
-       to the specified number of commits from the tip of each remote
-       branch history. Tags for the deepened commits are not fetched.
+       Limit fetching to the specified number of commits from the tip of
+       each remote branch history. If fetching to a 'shallow' repository
+       created by `git clone` with `--depth=<depth>` option (see
+       linkgit:git-clone[1]), deepen or shorten the history to the specified
+       number of commits. Tags for the deepened commits are not fetched.
 
 --unshallow::
        If the source repository is complete, convert a shallow
index fe5282f1305902545eaff585ced432d296dd64f4..6a96a669c299ebd0408d3a1e34d8e42541f3a9e8 100644 (file)
@@ -24,7 +24,7 @@ remove paths that do not exist in the working tree anymore.
 
 The "index" holds a snapshot of the content of the working tree, and it
 is this snapshot that is taken as the contents of the next commit.  Thus
-after making any changes to the working directory, and before running
+after making any changes to the working tree, and before running
 the commit command, you must use the `add` command to add any new or
 modified files to the index.
 
index 452c1feb2319a3ac47836b5039ebeba519be3c87..13cdd7f3b636dfadc262dcf099653775ec53cd5a 100644 (file)
@@ -35,6 +35,7 @@ OPTIONS
 --signoff::
        Add a `Signed-off-by:` line to the commit message, using
        the committer identity of yourself.
+       See the signoff option in linkgit:git-commit[1] for more information.
 
 -k::
 --keep::
index 77da29a474518c56c7dab23f5921aa50566506dd..6154e57238143b968b10deacf3ef6fb9d3ef1b86 100644 (file)
@@ -100,6 +100,7 @@ effect to your index in a row.
 -s::
 --signoff::
        Add Signed-off-by line at the end of the commit message.
+       See the signoff option in linkgit:git-commit[1] for more information.
 
 -S[<keyid>]::
 --gpg-sign[=<keyid>]::
index 641681f61ad360fcfd5aa98f81a9e3d49c44c8a7..51a7e26a8ec178e7e9fd0b78c00bb7ce518cd049 100644 (file)
@@ -37,9 +37,7 @@ OPTIONS
        to false, 'git clean' will refuse to delete files or directories
        unless given -f, -n or -i. Git will refuse to delete directories
        with .git sub directory or file unless a second -f
-       is given. This affects also git submodules where the storage area
-       of the removed submodule under .git/modules/ is not removed until
-       -f is given twice.
+       is given.
 
 -i::
 --interactive::
index 6bf000dac348880cc2f5b8d3cb6825e7a1ca82b4..789b668f7732957d71f42f98d361abd0b34305a7 100644 (file)
@@ -190,15 +190,14 @@ objects from the source repository into a pack in the cloned repository.
 
 --depth <depth>::
        Create a 'shallow' clone with a history truncated to the
-       specified number of revisions.
+       specified number of commits. Implies `--single-branch` unless
+       `--no-single-branch` is given to fetch the histories near the
+       tips of all branches.
 
 --[no-]single-branch::
        Clone only the history leading to the tip of a single branch,
        either specified by the `--branch` option or the primary
-       branch remote's `HEAD` points at. When creating a shallow
-       clone with the `--depth` option, this is the default, unless
-       `--no-single-branch` is given to fetch the histories near the
-       tips of all branches.
+       branch remote's `HEAD` points at.
        Further fetches into the resulting repository will only update the
        remote-tracking branch for the branch this option was used for the
        initial cloning.  If the HEAD at the remote did not point at any
index 7f34a5b33103ed1c870f234687079badc393be77..9ec6b3cc17fd776b16f6410cf88c708831d4bca3 100644 (file)
@@ -154,7 +154,11 @@ OPTIONS
 -s::
 --signoff::
        Add Signed-off-by line by the committer at the end of the commit
-       log message.
+       log message.  The meaning of a signoff depends on the project,
+       but it typically certifies that committer has
+       the rights to submit this work under the same license and
+       agrees to a Developer Certificate of Origin
+       (see http://developercertificate.org/ for more information).
 
 -n::
 --no-verify::
index c6f073cea42a2a91fba1aeb17505fe6cd7f46ac8..2e3e96f663e2ffa678f7242a661cf1f68f9c5d77 100644 (file)
@@ -92,7 +92,11 @@ refname::
        The name of the ref (the part after $GIT_DIR/).
        For a non-ambiguous short name of the ref append `:short`.
        The option core.warnAmbiguousRefs is used to select the strict
-       abbreviation mode.
+       abbreviation mode. If `strip=<N>` is appended, strips `<N>`
+       slash-separated path components from the front of the refname
+       (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`.
+       `<N>` must be a positive integer.  If a displayed ref has fewer
+       components than `<N>`, the command aborts with an error.
 
 objecttype::
        The type of the object (`blob`, `tree`, `commit`, `tag`).
@@ -142,6 +146,11 @@ In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
 be used to specify the value in the header field.
 
+For commit and tag objects, the special `creatordate` and `creator`
+fields will correspond to the appropriate date or name-email-date tuple
+from the `committer` or `tagger` fields depending on the object type.
+These are intended for working on a mix of annotated and lightweight tags.
+
 Fields that have name-email-date tuple as its value (`author`,
 `committer`, and `tagger`) can be suffixed with `name`, `email`,
 and `date` to extract the named component.
@@ -153,8 +162,8 @@ line is 'contents:body', where body is all of the lines after the first
 blank line.  The optional GPG signature is `contents:signature`.  The
 first `N` lines of the message is obtained using `contents:lines=N`.
 
-For sorting purposes, fields with numeric values sort in numeric
-order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
+For sorting purposes, fields with numeric values sort in numeric order
+(`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).
 All other fields are used to sort in their byte-value order.
 
 There is also an option to sort by versions, this can be done by using
index e3cdaeb9586017aa86aa15fec8a13371993906e3..b149e09065a11ecf21f166261d12cfb585f3cc50 100644 (file)
@@ -109,6 +109,7 @@ include::diff-options.txt[]
 --signoff::
        Add `Signed-off-by:` line to the commit message, using
        the committer identity of yourself.
+       See the signoff option in linkgit:git-commit[1] for more information.
 
 --stdout::
        Print all commits to the standard output in mbox format,
index 4c775bcec48360c3a097aea9cdb765ca9a9ec100..af521f89906c9e1f262412f5a3631a9566490af2 100644 (file)
@@ -37,6 +37,13 @@ the default `<refspec>` by consulting `remote.*.push` configuration,
 and if it is not found, honors `push.default` configuration to decide
 what to push (See linkgit:git-config[1] for the meaning of `push.default`).
 
+When neither the command-line nor the configuration specify what to
+push, the default behavior is used, which corresponds to the `simple`
+value for `push.default`: the current branch is pushed to the
+corresponding upstream branch, but as a safety measure, the push is
+aborted if the upstream branch does not have the same name as the
+local one.
+
 
 OPTIONS[[OPTIONS]]
 ------------------
index b15139ffdcda488c9e2314540885965723292a48..573616a04aec4ca5a768f0b26470489955bbf505 100644 (file)
@@ -89,6 +89,7 @@ effect to your index in a row.
 -s::
 --signoff::
        Add Signed-off-by line at the end of the commit message.
+       See the signoff option in linkgit:git-commit[1] for more information.
 
 --strategy=<strategy>::
        Use the given merge strategy.  Should only be used once.
index 7220e5eca1bddfcaf9828522c7f04ab78418874e..abab4814ec984db62dff6b493c3eb93398a36afa 100644 (file)
@@ -163,7 +163,7 @@ This option is only applicable when listing tags without annotation lines.
        A string that interpolates `%(fieldname)` from the object
        pointed at by a ref being shown.  The format is the same as
        that of linkgit:git-for-each-ref[1].  When unspecified,
-       defaults to `%(refname:short)`.
+       defaults to `%(refname:strip=2)`.
 
 --[no-]merged [<commit>]::
        Only list tags whose tips are reachable, or not reachable
index 5b9ad0429c84d2f11b0569f6d979858c833b3768..62c76c1c8945512009c6d0ca1179cf71ec50d04e 100644 (file)
@@ -32,11 +32,9 @@ The working tree's administrative files in the repository (see
 `git worktree prune` in the main or any linked working tree to
 clean up any stale administrative files.
 
-If you move a linked working tree to another file system, or
-within a file system that does not support hard links, you need to run
-at least one git command inside the linked working tree
-(e.g. `git status`) in order to update its administrative files in the
-repository so that they do not get automatically pruned.
+If you move a linked working tree, you need to manually update the
+administrative files so that they do not get pruned automatically. See
+section "DETAILS" for more information.
 
 If a linked working tree is stored on a portable device or network share
 which is not always mounted, you can prevent its administrative files from
@@ -137,6 +135,13 @@ thumb is do not make any assumption about whether a path belongs to
 $GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
 inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
 
+If you move a linked working tree, you need to update the 'gitdir' file
+in the entry's directory. For example, if a linked working tree is moved
+to `/newpath/test-next` and its `.git` file points to
+`/path/main/.git/worktrees/test-next`, then update
+`/path/main/.git/worktrees/test-next/gitdir` to reference `/newpath/test-next`
+instead.
+
 To prevent a $GIT_DIR/worktrees entry from being pruned (which
 can be useful in some situations, such as when the
 entry's working tree is stored on a portable device), add a file named
index bff6302c0dec6d18454439c4423189a86beee396..68a71b46c9c5706f76e73f55f6767d9f1ba07ce4 100644 (file)
@@ -43,9 +43,11 @@ unreleased) version of Git, that is available from the 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
-* link:v2.7.0/git.html[documentation for release 2.7]
+* link:v2.7.2/git.html[documentation for release 2.7.2]
 
 * release notes for
+  link:RelNotes/2.7.2.txt[2.7.2],
+  link:RelNotes/2.7.1.txt[2.7.1],
   link:RelNotes/2.7.0.txt[2.7].
 
 * link:v2.6.5/git.html[documentation for release 2.6.5]
index 79a1948a0bd52c778dcfccb253f9f2508b99f27e..473623d6318a859c9ed2cf600222ea6cb4a25d4c 100644 (file)
@@ -82,12 +82,12 @@ PATTERN FORMAT
 
  - An optional prefix "`!`" which negates the pattern; any
    matching file excluded by a previous pattern will become
-   included again.
+   included again. It is not possible to re-include a file if a parent
+   directory of that file is excluded. Git doesn't list excluded
+   directories for performance reasons, so any patterns on contained
+   files have no effect, no matter where they are defined.
    Put a backslash ("`\`") in front of the first "`!`" for patterns
    that begin with a literal "`!`", for example, "`\!important!.txt`".
-   It is possible to re-include a file if a parent directory of that
-   file is excluded if certain conditions are met. See section NOTES
-   for detail.
 
  - If the pattern ends with a slash, it is removed for the
    purpose of the following description, but it would only find
@@ -141,21 +141,6 @@ not tracked by Git remain untracked.
 To stop tracking a file that is currently tracked, use
 'git rm --cached'.
 
-To re-include files or directories when their parent directory is
-excluded, the following conditions must be met:
-
- - The rules to exclude a directory and re-include a subset back must
-   be in the same .gitignore file.
-
- - The directory part in the re-include rules must be literal (i.e. no
-   wildcards)
-
- - The rules to exclude the parent directory must not end with a
-   trailing slash.
-
- - The rules to exclude the parent directory must have at least one
-   slash.
-
 EXAMPLES
 --------
 
index e225974253833c97980e5ff190e291c8323757c9..cafc2843599102fae1dc070c484bc6987b84b367 100644 (file)
@@ -531,6 +531,11 @@ The most notable example is `HEAD`.
        "Secure Hash Algorithm 1"; a cryptographic hash function.
        In the context of Git used as a synonym for <<def_object_name,object name>>.
 
+[[def_shallow_clone]]shallow clone::
+       Mostly a synonym to <<def_shallow_repository,shallow repository>>
+       but the phrase makes it more explicit that it was created by
+       running `git clone --depth=...` command.
+
 [[def_shallow_repository]]shallow repository::
        A shallow <<def_repository,repository>> has an incomplete
        history some of whose <<def_commit,commits>> have <<def_parent,parents>> cauterized away (in other
index 8076172a08ce0dfc80e9656cd1ee7712c32c1d3e..cfc063018c996a61b333b38d7b387f40b21e7a00 100644 (file)
@@ -56,3 +56,10 @@ Functions
 `argv_array_clear`::
        Free all memory associated with the array and return it to the
        initial, empty state.
+
+`argv_array_detach`::
+       Disconnect the `argv` member from the `argv_array` struct and
+       return it. The caller is responsible for freeing the memory used
+       by the array, and by the strings it references. After detaching,
+       the `argv_array` is in a reinitialized state and can be pushed
+       into again.
index 1c790ac74a6907365c4a69938c3a75ab690cfc2e..ec6bacfcdfa8418b5e24a09c04091e6b92119d46 100644 (file)
@@ -2125,8 +2125,37 @@ Allowing web browsing of a repository
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 The gitweb cgi script provides users an easy way to browse your
-project's files and history without having to install Git; see the file
-gitweb/INSTALL in the Git source tree for instructions on setting it up.
+project's revisions, file contents and logs without having to install
+Git. Features like RSS/Atom feeds and blame/annotation details may
+optionally be enabled.
+
+The linkgit:git-instaweb[1] command provides a simple way to start
+browsing the repository using gitweb. The default server when using
+instaweb is lighttpd.
+
+See the file gitweb/INSTALL in the Git source tree and
+linkgit:gitweb[1] for instructions on details setting up a permament
+installation with a CGI or Perl capable server.
+
+[[how-to-get-a-git-repository-with-minimal-history]]
+How to get a Git repository with minimal history
+------------------------------------------------
+
+A <<def_shallow_clone,shallow clone>>, with its truncated
+history, is useful when one is interested only in recent history
+of a project and getting full history from the upstream is
+expensive.
+
+A <<def_shallow_clone,shallow clone>> is created by specifying
+the linkgit:git-clone[1] `--depth` switch. The depth can later be
+changed with the linkgit:git-fetch[1] `--depth` switch, or full
+history restored with `--unshallow`.
+
+Merging inside a <<def_shallow_clone,shallow clone>> will work as long
+as a merge base is in the recent history.
+Otherwise, it will be like merging unrelated histories and may
+have to result in huge conflicts.  This limitation may make such
+a repository unsuitable to be used in merge based workflows.
 
 [[sharing-development-examples]]
 Examples
@@ -4636,23 +4665,15 @@ Scan email archives for other stuff left out
 Scan man pages to see if any assume more background than this manual
 provides.
 
-Simplify beginning by suggesting disconnected head instead of
-temporary branch creation?
-
 Add more good examples.  Entire sections of just cookbook examples
 might be a good idea; maybe make an "advanced examples" section a
 standard end-of-chapter section?
 
 Include cross-references to the glossary, where appropriate.
 
-Document shallow clones?  See draft 1.5.0 release notes for some
-documentation.
-
 Add a section on working with other version control systems, including
 CVS, Subversion, and just imports of series of release tarballs.
 
-More details on gitweb?
-
 Write a chapter on using plumbing and writing scripts.
 
 Alternates, clone -reference, etc.
index 51aa9e680635e51904f0672b99018167ad1b8b5e..d7ab24e35617a456f1998a141f7e620eca1de431 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v2.7.0
+DEF_VER=v2.7.2
 
 LF='
 '
index 3ba13ce25351c60c93d0c8ed78f207d9a591d517..64e8170aa2353dccbd67ef8767299f22fb765a8e 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.7.0.txt
\ No newline at end of file
+Documentation/RelNotes/2.7.2.txt
\ No newline at end of file
diff --git a/alias.c b/alias.c
index a11229db9e67b7b651356be3fb1d4b3d1014a8bd..3b90397a99d9f7ed4a0c1c5a83f5e69c879e752f 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -23,7 +23,7 @@ int split_cmdline(char *cmdline, const char ***argv)
        int src, dst, count = 0, size = 16;
        char quoted = 0;
 
-       *argv = xmalloc(sizeof(**argv) * size);
+       ALLOC_ARRAY(*argv, size);
 
        /* split alias_string */
        (*argv)[count++] = cmdline;
index 0687afae434e55d9b8a38aa5184e6e056b963dac..5d735ae6039f0d9708d61a27a490953ff27badf5 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -171,8 +171,8 @@ static void queue_directory(const unsigned char *sha1,
                unsigned mode, int stage, struct archiver_context *c)
 {
        struct directory *d;
-       size_t len = base->len + 1 + strlen(filename) + 1;
-       d = xmalloc(sizeof(*d) + len);
+       size_t len = st_add4(base->len, 1, strlen(filename), 1);
+       d = xmalloc(st_add(sizeof(*d), len));
        d->up      = c->bottom;
        d->baselen = base->len;
        d->mode    = mode;
index eaed47712b44ed1a5f9e5d35d356d0de4a5a4d54..5d370fa3366163f8c0c81ca0b6b1a64a7030c696 100644 (file)
@@ -74,3 +74,14 @@ void argv_array_clear(struct argv_array *array)
        }
        argv_array_init(array);
 }
+
+const char **argv_array_detach(struct argv_array *array)
+{
+       if (array->argv == empty_argv)
+               return xcalloc(1, sizeof(const char *));
+       else {
+               const char **ret = array->argv;
+               argv_array_init(array);
+               return ret;
+       }
+}
index a2fa0aa606a01d5277e87d2368d7d6876b699474..29056e49a1208b5506d0809c7311e4112dc1f7f3 100644 (file)
@@ -20,5 +20,6 @@ void argv_array_pushl(struct argv_array *, ...);
 void argv_array_pushv(struct argv_array *, const char **);
 void argv_array_pop(struct argv_array *);
 void argv_array_clear(struct argv_array *);
+const char **argv_array_detach(struct argv_array *);
 
 #endif /* ARGV_ARRAY_H */
diff --git a/attr.c b/attr.c
index 086c08dcfab613ef2927ff2769797fa40cd03308..6537a433da201e866208ab23bf32bcafee037683 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -93,9 +93,7 @@ static struct git_attr *git_attr_internal(const char *name, int len)
        if (invalid_attr_name(name, len))
                return NULL;
 
-       a = xmalloc(sizeof(*a) + len + 1);
-       memcpy(a->name, name, len);
-       a->name[len] = 0;
+       FLEX_ALLOC_MEM(a, name, name, len);
        a->h = hval;
        a->next = git_attr_hash[pos];
        a->attr_nr = attr_nr++;
@@ -799,7 +797,7 @@ int git_all_attrs(const char *path, int *num, struct git_attr_check **check)
                        ++count;
        }
        *num = count;
-       *check = xmalloc(sizeof(**check) * count);
+       ALLOC_ARRAY(*check, count);
        j = 0;
        for (i = 0; i < attr_nr; i++) {
                const char *value = check_all_attr[i].value;
index 42aa7aa6aa1e53e66bafd47d76b783514dcfabf1..6d0793b9fc240f4f4e3898644e9506ecec6a1035 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -708,10 +708,10 @@ static struct commit *get_commit_reference(const unsigned char *sha1)
 
 static struct commit **get_bad_and_good_commits(int *rev_nr)
 {
-       int len = 1 + good_revs.nr;
-       struct commit **rev = xmalloc(len * sizeof(*rev));
+       struct commit **rev;
        int i, n = 0;
 
+       ALLOC_ARRAY(rev, 1 + good_revs.nr);
        rev[n++] = get_commit_reference(current_bad_oid->hash);
        for (i = 0; i < good_revs.nr; i++)
                rev[n++] = get_commit_reference(good_revs.sha1[i]);
index 7ff3f204964127374ae2a337819ce0bce7be9ab2..c50ea42172ceadd2a76d12833631301223607067 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -49,7 +49,13 @@ static int should_setup_rebase(const char *origin)
        return 0;
 }
 
-void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
+static const char tracking_advice[] =
+N_("\n"
+"After fixing the error cause you may try to fix up\n"
+"the remote tracking information by invoking\n"
+"\"git branch --set-upstream-to=%s%s%s\".");
+
+int install_branch_config(int flag, const char *local, const char *origin, const char *remote)
 {
        const char *shortname = NULL;
        struct strbuf key = STRBUF_INIT;
@@ -60,20 +66,23 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
            && !origin) {
                warning(_("Not setting branch %s as its own upstream."),
                        local);
-               return;
+               return 0;
        }
 
        strbuf_addf(&key, "branch.%s.remote", local);
-       git_config_set(key.buf, origin ? origin : ".");
+       if (git_config_set_gently(key.buf, origin ? origin : ".") < 0)
+               goto out_err;
 
        strbuf_reset(&key);
        strbuf_addf(&key, "branch.%s.merge", local);
-       git_config_set(key.buf, remote);
+       if (git_config_set_gently(key.buf, remote) < 0)
+               goto out_err;
 
        if (rebasing) {
                strbuf_reset(&key);
                strbuf_addf(&key, "branch.%s.rebase", local);
-               git_config_set(key.buf, "true");
+               if (git_config_set_gently(key.buf, "true") < 0)
+                       goto out_err;
        }
        strbuf_release(&key);
 
@@ -102,6 +111,19 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
                                          local, remote);
                }
        }
+
+       return 0;
+
+out_err:
+       strbuf_release(&key);
+       error(_("Unable to write upstream branch configuration"));
+
+       advise(_(tracking_advice),
+              origin ? origin : "",
+              origin ? "/" : "",
+              shortname ? shortname : remote);
+
+       return -1;
 }
 
 /*
@@ -109,8 +131,8 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
  * to infer the settings for branch.<new_ref>.{remote,merge} from the
  * config.
  */
-static int setup_tracking(const char *new_ref, const char *orig_ref,
-                         enum branch_track track, int quiet)
+static void setup_tracking(const char *new_ref, const char *orig_ref,
+                          enum branch_track track, int quiet)
 {
        struct tracking tracking;
        int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
@@ -118,7 +140,7 @@ static int setup_tracking(const char *new_ref, const char *orig_ref,
        memset(&tracking, 0, sizeof(tracking));
        tracking.spec.dst = (char *)orig_ref;
        if (for_each_remote(find_tracked_branch, &tracking))
-               return 1;
+               return;
 
        if (!tracking.matches)
                switch (track) {
@@ -127,18 +149,18 @@ static int setup_tracking(const char *new_ref, const char *orig_ref,
                case BRANCH_TRACK_OVERRIDE:
                        break;
                default:
-                       return 1;
+                       return;
                }
 
        if (tracking.matches > 1)
-               return error(_("Not tracking: ambiguous information for ref %s"),
-                               orig_ref);
+               die(_("Not tracking: ambiguous information for ref %s"),
+                   orig_ref);
 
-       install_branch_config(config_flags, new_ref, tracking.remote,
-                             tracking.src ? tracking.src : orig_ref);
+       if (install_branch_config(config_flags, new_ref, tracking.remote,
+                             tracking.src ? tracking.src : orig_ref) < 0)
+               exit(-1);
 
        free(tracking.src);
-       return 0;
 }
 
 int read_branch_desc(struct strbuf *buf, const char *branch_name)
index 58aa45fe72ca356a8bd3648782b36e63e207ee36..78ad4387cd326ca01f228b109b446e2049f29ee7 100644 (file)
--- a/branch.h
+++ b/branch.h
@@ -43,9 +43,10 @@ void remove_branch_state(void);
 /*
  * Configure local branch "local" as downstream to branch "remote"
  * from remote "origin".  Used by git branch --set-upstream.
+ * Returns 0 on success.
  */
 #define BRANCH_CONFIG_VERBOSE 01
-extern void install_branch_config(int flag, const char *local, const char *origin, const char *remote);
+extern int install_branch_config(int flag, const char *local, const char *origin, const char *remote);
 
 /*
  * Read branch description
index 9fb42fdd714a7785f6d75486db0d48fecceaacd6..5668e0c3a5a7e04d266b20e2a5ae60f2a7aa98cd 100644 (file)
@@ -1657,7 +1657,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 
                init_revisions(&rev_info, NULL);
                rev_info.diffopt.output_format = DIFF_FORMAT_NAME_STATUS;
-               diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1);
+               diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1, rev_info.prefix);
                add_pending_sha1(&rev_info, "HEAD", our_tree, 0);
                diff_setup_done(&rev_info.diffopt);
                run_diff_index(&rev_info, 1);
@@ -1821,7 +1821,7 @@ static int do_interactive(struct am_state *state)
 
                        if (!pager)
                                pager = "cat";
-                       argv_array_push(&cp.args, pager);
+                       prepare_pager_args(&cp, pager);
                        argv_array_push(&cp.args, am_path(state, "patch"));
                        run_command(&cp);
                }
@@ -1939,6 +1939,7 @@ static void am_run(struct am_state *state, int resume)
         */
        if (!state->rebasing) {
                am_destroy(state);
+               close_all_packs();
                run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
        }
 }
index deb1364fa81452d236a224109a99b28a034f9a9a..0db6d14cc2eeaf3a08fb08301ab02af1b22fc8f8 100644 (file)
@@ -2632,7 +2632,7 @@ static void update_image(struct image *img,
        insert_count = postimage->len;
 
        /* Adjust the contents */
-       result = xmalloc(img->len + insert_count - remove_count + 1);
+       result = xmalloc(st_add3(st_sub(img->len, remove_count), insert_count, 1));
        memcpy(result, img->buf, applied_at);
        memcpy(result + applied_at, postimage->buf, postimage->len);
        memcpy(result + applied_at + postimage->len,
index 1df13cf7f4b501ed82dcbffdf4620706591a245e..0b4f0bbb531407f6003fe66cfe16a48785b1dcf3 100644 (file)
@@ -459,13 +459,11 @@ static void queue_blames(struct scoreboard *sb, struct origin *porigin,
 static struct origin *make_origin(struct commit *commit, const char *path)
 {
        struct origin *o;
-       size_t pathlen = strlen(path) + 1;
-       o = xcalloc(1, sizeof(*o) + pathlen);
+       FLEX_ALLOC_STR(o, path, path);
        o->commit = commit;
        o->refcnt = 1;
        o->next = commit->util;
        commit->util = o;
-       memcpy(o->path, path, pathlen); /* includes NUL */
        return o;
 }
 
@@ -2042,7 +2040,8 @@ static int prepare_lines(struct scoreboard *sb)
        for (p = buf; p < end; p = get_next_line(p, end))
                num++;
 
-       sb->lineno = lineno = xmalloc(sizeof(*sb->lineno) * (num + 1));
+       ALLOC_ARRAY(sb->lineno, num + 1);
+       lineno = sb->lineno;
 
        for (p = buf; p < end; p = get_next_line(p, end))
                *lineno++ = p - buf;
@@ -2392,11 +2391,6 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
        ce->ce_mode = create_ce_mode(mode);
        add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);
 
-       /*
-        * We are not going to write this out, so this does not matter
-        * right now, but someday we might optimize diff-index --cached
-        * with cache-tree information.
-        */
        cache_tree_invalidate_path(&the_index, path);
 
        return commit;
index 3f6c825db1caf9c7cdd2ca7c1280e5ad157f9a27..7b45b6bd6b80613de9f894cfbe8e9d2dcae77b09 100644 (file)
@@ -570,7 +570,6 @@ static const char edit_description[] = "BRANCH_DESCRIPTION";
 
 static int edit_branch_description(const char *branch_name)
 {
-       int status;
        struct strbuf buf = STRBUF_INIT;
        struct strbuf name = STRBUF_INIT;
 
@@ -595,11 +594,11 @@ static int edit_branch_description(const char *branch_name)
        strbuf_stripspace(&buf, 1);
 
        strbuf_addf(&name, "branch.%s.description", branch_name);
-       status = git_config_set(name.buf, buf.len ? buf.buf : NULL);
+       git_config_set(name.buf, buf.len ? buf.buf : NULL);
        strbuf_release(&name);
        strbuf_release(&buf);
 
-       return status;
+       return 0;
 }
 
 int cmd_branch(int argc, const char **argv, const char *prefix)
index fd915d59841ecc1098e2d8a4356947215377d4da..eac499450f63554387fb8b32ef5780c32ded4a21 100644 (file)
@@ -20,7 +20,7 @@ static const char builtin_check_ref_format_usage[] =
  */
 static char *collapse_slashes(const char *refname)
 {
-       char *ret = xmalloc(strlen(refname) + 1);
+       char *ret = xmallocz(strlen(refname));
        char ch;
        char prev = '/';
        char *cp = ret;
index e8110a9243f648129ffbea0de2af039ad7791aa1..d53ab75ac9a078c821ed5112643ee896fed35a88 100644 (file)
@@ -981,7 +981,8 @@ static int parse_branchname_arg(int argc, const char **argv,
                 */
                int recover_with_dwim = dwim_new_local_branch_ok;
 
-               if (check_filename(NULL, arg) && !has_dash_dash)
+               if (!has_dash_dash &&
+                   (check_filename(NULL, arg) || !no_wildcard(arg)))
                        recover_with_dwim = 0;
                /*
                 * Accept "git checkout foo" and "git checkout foo --"
index d7acb94a9594563b1473ecac29bd5de9a5e8a55a..fb1824ce951b62e51fb7205424e1496c50c700c6 100644 (file)
@@ -147,30 +147,6 @@ static int exclude_cb(const struct option *opt, const char *arg, int unset)
        return 0;
 }
 
-/*
- * Return 1 if the given path is the root of a git repository or
- * submodule else 0. Will not return 1 for bare repositories with the
- * exception of creating a bare repository in "foo/.git" and calling
- * is_git_repository("foo").
- */
-static int is_git_repository(struct strbuf *path)
-{
-       int ret = 0;
-       int gitfile_error;
-       size_t orig_path_len = path->len;
-       assert(orig_path_len != 0);
-       strbuf_complete(path, '/');
-       strbuf_addstr(path, ".git");
-       if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
-               ret = 1;
-       if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
-           gitfile_error == READ_GITFILE_ERR_READ_FAILED)
-               ret = 1;  /* This could be a real .git file, take the
-                          * safe option and avoid cleaning */
-       strbuf_setlen(path, orig_path_len);
-       return ret;
-}
-
 static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
                int dry_run, int quiet, int *dir_gone)
 {
@@ -182,7 +158,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
 
        *dir_gone = 1;
 
-       if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_git_repository(path)) {
+       if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_nonbare_repository_dir(path)) {
                if (!quiet) {
                        quote_path_relative(path->buf, prefix, &quoted);
                        printf(dry_run ?  _(msg_would_skip_git_dir) : _(msg_skip_git_dir),
@@ -567,7 +543,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff)
        int eof = 0;
        int i;
 
-       chosen = xmalloc(sizeof(int) * stuff->nr);
+       ALLOC_ARRAY(chosen, stuff->nr);
        /* set chosen as uninitialized */
        for (i = 0; i < stuff->nr; i++)
                chosen[i] = -1;
@@ -639,7 +615,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff)
                                nr += chosen[i];
                }
 
-               result = xcalloc(nr + 1, sizeof(int));
+               result = xcalloc(st_add(nr, 1), sizeof(int));
                for (i = 0; i < stuff->nr && j < nr; i++) {
                        if (chosen[i])
                                result[j++] = i;
index a0b3cd9e5617b5a3a45dd01c8a2c7af0b2fd9668..8a90cad5b534adbb4d1370f8f2365de21a934248 100644 (file)
@@ -732,7 +732,7 @@ static int checkout(void)
 
 static int write_one_config(const char *key, const char *value, void *data)
 {
-       return git_config_set_multivar(key, value ? value : "true", "^$", 0);
+       return git_config_set_multivar_gently(key, value ? value : "true", "^$", 0);
 }
 
 static void write_config(struct string_list *config)
index d054f849606b248a82f7b29103308feab36ca9e9..89bf6ad38abbbee068ca29bad2ce2a4b728fa388 100644 (file)
@@ -761,7 +761,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
                hook_arg2 = "";
        }
 
-       s->fp = fopen(git_path(commit_editmsg), "w");
+       s->fp = fopen_for_writing(git_path(commit_editmsg));
        if (s->fp == NULL)
                die_errno(_("could not open '%s'"), git_path(commit_editmsg));
 
index adc772786a7ddf9952aaccb7578b57d10396da93..c26d6e7fdd5d2896850ac909cb9ce04960520b0d 100644 (file)
@@ -582,7 +582,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                check_write();
                check_argc(argc, 2, 2);
                value = normalize_value(argv[0], argv[1]);
-               ret = git_config_set_in_file(given_config_source.file, argv[0], value);
+               ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value);
                if (ret == CONFIG_NOTHING_SET)
                        error("cannot overwrite multiple values with a single value\n"
                        "       Use a regexp, --add or --replace-all to change %s.", argv[0]);
@@ -592,23 +592,23 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                check_write();
                check_argc(argc, 2, 3);
                value = normalize_value(argv[0], argv[1]);
-               return git_config_set_multivar_in_file(given_config_source.file,
-                                                      argv[0], value, argv[2], 0);
+               return git_config_set_multivar_in_file_gently(given_config_source.file,
+                                                             argv[0], value, argv[2], 0);
        }
        else if (actions == ACTION_ADD) {
                check_write();
                check_argc(argc, 2, 2);
                value = normalize_value(argv[0], argv[1]);
-               return git_config_set_multivar_in_file(given_config_source.file,
-                                                      argv[0], value,
-                                                      CONFIG_REGEX_NONE, 0);
+               return git_config_set_multivar_in_file_gently(given_config_source.file,
+                                                             argv[0], value,
+                                                             CONFIG_REGEX_NONE, 0);
        }
        else if (actions == ACTION_REPLACE_ALL) {
                check_write();
                check_argc(argc, 2, 3);
                value = normalize_value(argv[0], argv[1]);
-               return git_config_set_multivar_in_file(given_config_source.file,
-                                                      argv[0], value, argv[2], 1);
+               return git_config_set_multivar_in_file_gently(given_config_source.file,
+                                                             argv[0], value, argv[2], 1);
        }
        else if (actions == ACTION_GET) {
                check_argc(argc, 1, 2);
@@ -634,17 +634,17 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                check_write();
                check_argc(argc, 1, 2);
                if (argc == 2)
-                       return git_config_set_multivar_in_file(given_config_source.file,
-                                                              argv[0], NULL, argv[1], 0);
+                       return git_config_set_multivar_in_file_gently(given_config_source.file,
+                                                                     argv[0], NULL, argv[1], 0);
                else
-                       return git_config_set_in_file(given_config_source.file,
-                                                     argv[0], NULL);
+                       return git_config_set_in_file_gently(given_config_source.file,
+                                                            argv[0], NULL);
        }
        else if (actions == ACTION_UNSET_ALL) {
                check_write();
                check_argc(argc, 1, 2);
-               return git_config_set_multivar_in_file(given_config_source.file,
-                                                      argv[0], NULL, argv[1], 1);
+               return git_config_set_multivar_in_file_gently(given_config_source.file,
+                                                             argv[0], NULL, argv[1], 1);
        }
        else if (actions == ACTION_RENAME_SECTION) {
                int ret;
index ed0acca91fb870d3f773779b34f4e24c401945e5..52c98a9217c60a60f0012dbdafbb193e78ec8a33 100644 (file)
@@ -341,7 +341,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        }
        if (no_index)
                /* If this is a no-index diff, just run it and exit there. */
-               diff_no_index(&rev, argc, argv, prefix);
+               diff_no_index(&rev, argc, argv);
 
        /* Otherwise, we are doing the usual "git" diff */
        rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
index d9ac5d8410b30e02fbb8edb06a1991655c5be8f4..8164b581a66f257c5b4a74abbf1b76546946e2cf 100644 (file)
@@ -880,7 +880,7 @@ static void export_marks(char *file)
        FILE *f;
        int e = 0;
 
-       f = fopen(file, "w");
+       f = fopen_for_writing(file);
        if (!f)
                die_errno("Unable to open marks file %s for writing.", file);
 
@@ -1021,7 +1021,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
                const char **refspecs_str;
                int i;
 
-               refspecs_str = xmalloc(sizeof(*refspecs_str) * refspecs_list.nr);
+               ALLOC_ARRAY(refspecs_str, refspecs_list.nr);
                for (i = 0; i < refspecs_list.nr; i++)
                        refspecs_str[i] = refspecs_list.items[i].string;
 
index cf3019e05bdf45e1fa16a483621a6773976f98c5..7d5914f9212c194e7f45cffb81540ee297fcb54b 100644 (file)
@@ -10,33 +10,24 @@ static const char fetch_pack_usage[] =
 "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
 "[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]";
 
-static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc,
-                                const char *name, int namelen)
+static void add_sought_entry(struct ref ***sought, int *nr, int *alloc,
+                            const char *name)
 {
-       struct ref *ref = xcalloc(1, sizeof(*ref) + namelen + 1);
+       struct ref *ref;
        struct object_id oid;
-       const int chunksz = GIT_SHA1_HEXSZ + 1;
 
-       if (namelen > chunksz && name[chunksz - 1] == ' ' &&
-               !get_oid_hex(name, &oid)) {
-               oidcpy(&ref->old_oid, &oid);
-               name += chunksz;
-               namelen -= chunksz;
-       }
+       if (!get_oid_hex(name, &oid) && name[GIT_SHA1_HEXSZ] == ' ')
+               name += GIT_SHA1_HEXSZ + 1;
+       else
+               oidclr(&oid);
 
-       memcpy(ref->name, name, namelen);
-       ref->name[namelen] = '\0';
+       ref = alloc_ref(name);
+       oidcpy(&ref->old_oid, &oid);
        (*nr)++;
        ALLOC_GROW(*sought, *nr, *alloc);
        (*sought)[*nr - 1] = ref;
 }
 
-static void add_sought_entry(struct ref ***sought, int *nr, int *alloc,
-                            const char *string)
-{
-       add_sought_entry_mem(sought, nr, alloc, string, strlen(string));
-}
-
 int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
 {
        int i, ret;
index c85f3471d4b53ce7db7662b5531ddebe5513b7b0..683f08ec91295e2fe56c372497685f40121f3b32 100644 (file)
@@ -837,7 +837,7 @@ static void check_not_current_branch(struct ref *ref_map)
 static int truncate_fetch_head(void)
 {
        const char *filename = git_path_fetch_head();
-       FILE *fp = fopen(filename, "w");
+       FILE *fp = fopen_for_writing(filename);
 
        if (!fp)
                return error(_("cannot open %s: %s\n"), filename, strerror(errno));
@@ -1107,7 +1107,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
        if (argc > 0) {
                int j = 0;
                int i;
-               refs = xcalloc(argc + 1, sizeof(const char *));
+               refs = xcalloc(st_add(argc, 1), sizeof(const char *));
                for (i = 0; i < argc; i++) {
                        if (!strcmp(argv[i], "tag")) {
                                i++;
@@ -1221,6 +1221,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
        list.strdup_strings = 1;
        string_list_clear(&list, 0);
 
+       close_all_packs();
+
        argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
        if (verbosity < 0)
                argv_array_push(&argv_gc_auto, "--quiet");
index 4229cae390ddddcc74f3506dc892ed02b45d7eae..65c02010c735ad6c5528dab2087d473e1c8b2362 100644 (file)
@@ -354,17 +354,17 @@ static void append_path(struct grep_opt *opt, const void *data, size_t len)
 static void run_pager(struct grep_opt *opt, const char *prefix)
 {
        struct string_list *path_list = opt->output_priv;
-       const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1));
+       struct child_process child = CHILD_PROCESS_INIT;
        int i, status;
 
        for (i = 0; i < path_list->nr; i++)
-               argv[i] = path_list->items[i].string;
-       argv[path_list->nr] = NULL;
+               argv_array_push(&child.args, path_list->items[i].string);
+       child.dir = prefix;
+       child.use_shell = 1;
 
-       status = run_command_v_opt_cd_env(argv, RUN_USING_SHELL, prefix, NULL);
+       status = run_command(&child);
        if (status)
                exit(status);
-       free(argv);
 }
 
 static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int cached)
@@ -375,7 +375,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int
 
        for (nr = 0; nr < active_nr; nr++) {
                const struct cache_entry *ce = active_cache[nr];
-               if (!S_ISREG(ce->ce_mode))
+               if (!S_ISREG(ce->ce_mode) || ce_intent_to_add(ce))
                        continue;
                if (!ce_path_match(ce, pathspec, NULL))
                        continue;
index 1cd0c1ee44daf056befb8a26bba2f4fd343c8658..3c55ce456309ee7da95eac0517f11161ab3c1f7c 100644 (file)
@@ -171,12 +171,10 @@ static void exec_man_cmd(const char *cmd, const char *page)
 static void add_man_viewer(const char *name)
 {
        struct man_viewer_list **p = &man_viewer_list;
-       size_t len = strlen(name);
 
        while (*p)
                p = &((*p)->next);
-       *p = xcalloc(1, (sizeof(**p) + len + 1));
-       memcpy((*p)->name, name, len); /* NUL-terminated by xcalloc */
+       FLEX_ALLOC_STR(*p, name, name);
 }
 
 static int supported_man_viewer(const char *name, size_t len)
@@ -190,9 +188,8 @@ static void do_add_man_viewer_info(const char *name,
                                   size_t len,
                                   const char *value)
 {
-       struct man_viewer_info_list *new = xcalloc(1, sizeof(*new) + len + 1);
-
-       memcpy(new->name, name, len); /* NUL-terminated by xcalloc */
+       struct man_viewer_info_list *new;
+       FLEX_ALLOC_MEM(new, name, name, len);
        new->info = xstrdup(value);
        new->next = man_viewer_info_list;
        man_viewer_info_list = new;
index 6a015095877a8d201e68348ecd76ddc5331af357..193908a619307ff38bacb212bd0450aae53e2510 100644 (file)
@@ -1346,7 +1346,7 @@ static void fix_unresolved_deltas(struct sha1file *f)
         * before deltas depending on them, a good heuristic is to start
         * resolving deltas in the same order as their position in the pack.
         */
-       sorted_by_pos = xmalloc(nr_ref_deltas * sizeof(*sorted_by_pos));
+       ALLOC_ARRAY(sorted_by_pos, nr_ref_deltas);
        for (i = 0; i < nr_ref_deltas; i++)
                sorted_by_pos[i] = &ref_deltas[i];
        qsort(sorted_by_pos, nr_ref_deltas, sizeof(*sorted_by_pos), delta_pos_compare);
@@ -1744,9 +1744,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
 
        curr_pack = open_pack_file(pack_name);
        parse_pack_header();
-       objects = xcalloc(nr_objects + 1, sizeof(struct object_entry));
+       objects = xcalloc(st_add(nr_objects, 1), sizeof(struct object_entry));
        if (show_stat)
-               obj_stat = xcalloc(nr_objects + 1, sizeof(struct object_stat));
+               obj_stat = xcalloc(st_add(nr_objects, 1), sizeof(struct object_stat));
        ofs_deltas = xcalloc(nr_objects, sizeof(struct ofs_delta_entry));
        parse_pack_objects(pack_sha1);
        resolve_deltas();
@@ -1759,7 +1759,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
        if (show_stat)
                show_pack_info(stat_only);
 
-       idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *));
+       ALLOC_ARRAY(idx_objects, nr_objects);
        for (i = 0; i < nr_objects; i++)
                idx_objects[i] = &objects[i].idx;
        curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_sha1);
index 07229d60f1fd0d581c8cfae2bd0b1c21f06cbc95..6223b7d46af346b0d96870ee0c647ab9a5440b33 100644 (file)
@@ -250,7 +250,7 @@ static int create_default_files(const char *template_path)
                git_config_set("core.bare", "false");
                /* allow template config file to override the default */
                if (log_all_ref_updates == -1)
-                   git_config_set("core.logallrefupdates", "true");
+                       git_config_set("core.logallrefupdates", "true");
                if (needs_work_tree_config(get_git_dir(), work_tree))
                        git_config_set("core.worktree", work_tree);
        }
index a8911626c2ca9e178c8f4373d544c670afdb6aea..c0d1822eb3ad371b9ab0b830aed2cc2741a978bd 100644 (file)
@@ -252,7 +252,7 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)
        if (argc < 2)
                usage_with_options(merge_base_usage, options);
 
-       rev = xmalloc(argc * sizeof(*rev));
+       ALLOC_ARRAY(rev, argc);
        while (argc-- > 0)
                rev[rev_nr++] = get_commit_reference(*argv++);
        return show_merge_base(rev, rev_nr, show_all);
index d4f0cbd45149eebe15f53ff8c34eefd9b3803d82..ca570041df0f67efa92b056cec01e7d9a4e38ad7 100644 (file)
@@ -174,7 +174,7 @@ static struct merge_list *create_entry(unsigned stage, unsigned mode, const unsi
 
 static char *traverse_path(const struct traverse_info *info, const struct name_entry *n)
 {
-       char *path = xmalloc(traverse_path_len(info, n) + 1);
+       char *path = xmallocz(traverse_path_len(info, n));
        return make_traverse_path(path, info, n);
 }
 
index 15bf95b3ac6c54727992103b1943515a1da32ff4..101ffeff4c942636e0ca688357a4b8ec8aa2a431 100644 (file)
@@ -404,6 +404,7 @@ static void finish(struct commit *head_commit,
                         * We ignore errors in 'gc --auto', since the
                         * user should see them.
                         */
+                       close_all_packs();
                        run_command_v_opt(argv_gc_auto, RUN_GIT_CMD);
                }
        }
@@ -938,7 +939,7 @@ static int setup_with_upstream(const char ***argv)
        if (!branch->merge_nr)
                die(_("No default upstream defined for the current branch."));
 
-       args = xcalloc(branch->merge_nr + 1, sizeof(char *));
+       args = xcalloc(st_add(branch->merge_nr, 1), sizeof(char *));
        for (i = 0; i < branch->merge_nr; i++) {
                if (!branch->merge[i]->dst)
                        die(_("No remote-tracking branch for %s from %s"),
index a964d6be521c09a241ab0ccdc9f313e182769412..b0aab653539c4000044f88bfeb18e55dc55cbbd1 100644 (file)
@@ -19,16 +19,17 @@ static int alloc, used;
 static void append_to_tree(unsigned mode, unsigned char *sha1, char *path)
 {
        struct treeent *ent;
-       int len = strlen(path);
+       size_t len = strlen(path);
        if (strchr(path, '/'))
                die("path %s contains slash", path);
 
-       ALLOC_GROW(entries, used + 1, alloc);
-       ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1);
+       FLEX_ALLOC_MEM(ent, name, path, len);
        ent->mode = mode;
        ent->len = len;
        hashcpy(ent->sha1, sha1);
-       memcpy(ent->name, path, len+1);
+
+       ALLOC_GROW(entries, used + 1, alloc);
+       entries[used++] = ent;
 }
 
 static int ent_compare(const void *a_, const void *b_)
index d1d43168ae79d0157f8adf9dc36a4d2683afe91b..aeae855e2b95399db4ae6032d118848449488267 100644 (file)
@@ -24,7 +24,8 @@ static const char **internal_copy_pathspec(const char *prefix,
                                           int count, unsigned flags)
 {
        int i;
-       const char **result = xmalloc((count + 1) * sizeof(const char *));
+       const char **result;
+       ALLOC_ARRAY(result, count + 1);
        memcpy(result, pathspec, count * sizeof(const char *));
        result[count] = NULL;
        for (i = 0; i < count; i++) {
@@ -47,9 +48,9 @@ static const char **internal_copy_pathspec(const char *prefix,
 
 static const char *add_slash(const char *path)
 {
-       int len = strlen(path);
+       size_t len = strlen(path);
        if (path[len - 1] != '/') {
-               char *with_slash = xmalloc(len + 2);
+               char *with_slash = xmalloc(st_add(len, 2));
                memcpy(with_slash, path, len);
                with_slash[len++] = '/';
                with_slash[len] = 0;
index 4dae5b11c28deb3c296cbd89753cafe3ca7a1e90..b4f1fa6d3396f7b8845216bc99d1aaa243d3e518 100644 (file)
@@ -624,7 +624,7 @@ static struct object_entry **compute_write_order(void)
 {
        unsigned int i, wo_end, last_untagged;
 
-       struct object_entry **wo = xmalloc(to_pack.nr_objects * sizeof(*wo));
+       struct object_entry **wo;
        struct object_entry *objects = to_pack.objects;
 
        for (i = 0; i < to_pack.nr_objects; i++) {
@@ -657,6 +657,7 @@ static struct object_entry **compute_write_order(void)
         * Give the objects in the original recency order until
         * we see a tagged tip.
         */
+       ALLOC_ARRAY(wo, to_pack.nr_objects);
        for (i = wo_end = 0; i < to_pack.nr_objects; i++) {
                if (objects[i].tagged)
                        break;
@@ -769,7 +770,7 @@ static void write_pack_file(void)
 
        if (progress > pack_to_stdout)
                progress_state = start_progress(_("Writing objects"), nr_result);
-       written_list = xmalloc(to_pack.nr_objects * sizeof(*written_list));
+       ALLOC_ARRAY(written_list, to_pack.nr_objects);
        write_order = compute_write_order();
 
        do {
@@ -2129,7 +2130,7 @@ static void prepare_pack(int window, int depth)
        if (!to_pack.nr_objects || !window || !depth)
                return;
 
-       delta_list = xmalloc(to_pack.nr_objects * sizeof(*delta_list));
+       ALLOC_ARRAY(delta_list, to_pack.nr_objects);
        nr_deltas = n = 0;
 
        for (i = 0; i < to_pack.nr_objects; i++) {
index d0532f66b1d4a479360263bb031e001f4cb42a46..72c815844dd2abe7f2b4bc5a641eb692d2a45103 100644 (file)
@@ -53,7 +53,7 @@ static inline struct llist_item *llist_item_get(void)
                free_nodes = free_nodes->next;
        } else {
                int i = 1;
-               new = xmalloc(sizeof(struct llist_item) * BLKSIZE);
+               ALLOC_ARRAY(new, BLKSIZE);
                for (; i < BLKSIZE; i++)
                        llist_item_put(&new[i]);
        }
index ca38131873aad1c5dd5b8001aceb39ed906b3c2d..c8e32b297c4be68bb0d33a6a88c15470821ae4ea 100644 (file)
@@ -1031,7 +1031,6 @@ static void run_update_post_hook(struct command *commands)
 {
        struct command *cmd;
        int argc;
-       const char **argv;
        struct child_process proc = CHILD_PROCESS_INIT;
        const char *hook;
 
@@ -1044,21 +1043,16 @@ static void run_update_post_hook(struct command *commands)
        if (!argc || !hook)
                return;
 
-       argv = xmalloc(sizeof(*argv) * (2 + argc));
-       argv[0] = hook;
-
-       for (argc = 1, cmd = commands; cmd; cmd = cmd->next) {
+       argv_array_push(&proc.args, hook);
+       for (cmd = commands; cmd; cmd = cmd->next) {
                if (cmd->error_string || cmd->did_not_exist)
                        continue;
-               argv[argc] = xstrdup(cmd->ref_name);
-               argc++;
+               argv_array_push(&proc.args, cmd->ref_name);
        }
-       argv[argc] = NULL;
 
        proc.no_stdin = 1;
        proc.stdout_to_stderr = 1;
        proc.err = use_sideband ? -1 : 0;
-       proc.argv = argv;
 
        if (!start_command(&proc)) {
                if (use_sideband)
@@ -1378,7 +1372,7 @@ static struct command **queue_command(struct command **tail,
 
        refname = line + 82;
        reflen = linelen - 82;
-       cmd = xcalloc(1, sizeof(struct command) + reflen + 1);
+       cmd = xcalloc(1, st_add3(sizeof(struct command), reflen, 1));
        hashcpy(cmd->old_sha1, old_sha1);
        hashcpy(cmd->new_sha1, new_sha1);
        memcpy(cmd->ref_name, refname, reflen);
@@ -1597,8 +1591,7 @@ static void prepare_shallow_update(struct command *commands,
 {
        int i, j, k, bitmap_size = (si->ref->nr + 31) / 32;
 
-       si->used_shallow = xmalloc(sizeof(*si->used_shallow) *
-                                  si->shallow->nr);
+       ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
        assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
 
        si->need_reachability_test =
@@ -1618,7 +1611,7 @@ static void prepare_shallow_update(struct command *commands,
                                continue;
                        si->need_reachability_test[i]++;
                        for (k = 0; k < 32; k++)
-                               if (si->used_shallow[i][j] & (1 << k))
+                               if (si->used_shallow[i][j] & (1U << k))
                                        si->shallow_ref[j * 32 + k]++;
                }
 
@@ -1664,7 +1657,7 @@ static void update_shallow_info(struct command *commands,
                return;
        }
 
-       ref_status = xmalloc(sizeof(*ref_status) * ref->nr);
+       ALLOC_ARRAY(ref_status, ref->nr);
        assign_shallow_commits_to_refs(si, NULL, ref_status);
        for (cmd = commands; cmd; cmd = cmd->next) {
                if (is_null_sha1(cmd->new_sha1))
@@ -1796,6 +1789,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
                                "gc", "--auto", "--quiet", NULL,
                        };
                        int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR;
+                       close_all_packs();
                        run_command_v_opt(argv_gc_auto, opt);
                }
                if (auto_update_server_info)
index f39960e5e480abcd08898b2f04aa444c1d7bec17..2d46b6482a0110072828e6d16da2d2fa3e0f8389 100644 (file)
@@ -382,11 +382,9 @@ static int collect_reflog(const char *ref, const struct object_id *oid, int unus
 {
        struct collected_reflog *e;
        struct collect_reflog_cb *cb = cb_data;
-       size_t namelen = strlen(ref);
 
-       e = xmalloc(sizeof(*e) + namelen + 1);
+       FLEX_ALLOC_STR(e, reflog, ref);
        hashcpy(e->sha1, oid->hash);
-       memcpy(e->reflog, ref, namelen + 1);
        ALLOC_GROW(cb->e, cb->nr + 1, cb->alloc);
        cb->e[cb->nr++] = e;
        return 0;
@@ -396,7 +394,6 @@ static struct reflog_expire_cfg {
        struct reflog_expire_cfg *next;
        unsigned long expire_total;
        unsigned long expire_unreachable;
-       size_t len;
        char pattern[FLEX_ARRAY];
 } *reflog_expire_cfg, **reflog_expire_cfg_tail;
 
@@ -408,13 +405,11 @@ static struct reflog_expire_cfg *find_cfg_ent(const char *pattern, size_t len)
                reflog_expire_cfg_tail = &reflog_expire_cfg;
 
        for (ent = reflog_expire_cfg; ent; ent = ent->next)
-               if (ent->len == len &&
-                   !memcmp(ent->pattern, pattern, len))
+               if (!strncmp(ent->pattern, pattern, len) &&
+                   ent->pattern[len] == '\0')
                        return ent;
 
-       ent = xcalloc(1, (sizeof(*ent) + len));
-       memcpy(ent->pattern, pattern, len);
-       ent->len = len;
+       FLEX_ALLOC_MEM(ent, pattern, pattern, len);
        *reflog_expire_cfg_tail = ent;
        reflog_expire_cfg_tail = &(ent->next);
        return ent;
index e3cd25d580b0f1ee14b4a5037ceae8dc20b31f30..7457c743e8d8539c4f08df81f86c8b27c0bce392 100644 (file)
@@ -114,30 +114,14 @@ static char *strip_escapes(const char *str, const char *service,
        }
 }
 
-/* Should be enough... */
-#define MAXARGUMENTS 256
-
-static const char **parse_argv(const char *arg, const char *service)
+static void parse_argv(struct argv_array *out, const char *arg, const char *service)
 {
-       int arguments = 0;
-       int i;
-       const char **ret;
-       char *temparray[MAXARGUMENTS + 1];
-
        while (*arg) {
-               char *expanded;
-               if (arguments == MAXARGUMENTS)
-                       die("remote-ext command has too many arguments");
-               expanded = strip_escapes(arg, service, &arg);
+               char *expanded = strip_escapes(arg, service, &arg);
                if (expanded)
-                       temparray[arguments++] = expanded;
+                       argv_array_push(out, expanded);
+               free(expanded);
        }
-
-       ret = xmalloc((arguments + 1) * sizeof(char *));
-       for (i = 0; i < arguments; i++)
-               ret[i] = temparray[i];
-       ret[arguments] = NULL;
-       return ret;
 }
 
 static void send_git_request(int stdin_fd, const char *serv, const char *repo,
@@ -158,7 +142,7 @@ static int run_child(const char *arg, const char *service)
        child.in = -1;
        child.out = -1;
        child.err = 0;
-       child.argv = parse_argv(arg, service);
+       parse_argv(&child.args, arg, service);
 
        if (start_command(&child) < 0)
                die("Can't run specified command");
index 6694cf20efdc01fb59d0b6afa41f7b1557c9b2d5..43136951b55be959d9fd6a2cc960b19f1a1484ac 100644 (file)
@@ -108,8 +108,8 @@ enum {
 #define MIRROR_PUSH 2
 #define MIRROR_BOTH (MIRROR_FETCH|MIRROR_PUSH)
 
-static int add_branch(const char *key, const char *branchname,
-               const char *remotename, int mirror, struct strbuf *tmp)
+static void add_branch(const char *key, const char *branchname,
+                      const char *remotename, int mirror, struct strbuf *tmp)
 {
        strbuf_reset(tmp);
        strbuf_addch(tmp, '+');
@@ -119,7 +119,7 @@ static int add_branch(const char *key, const char *branchname,
        else
                strbuf_addf(tmp, "refs/heads/%s:refs/remotes/%s/%s",
                                branchname, remotename, branchname);
-       return git_config_set_multivar(key, tmp->buf, "^$", 0);
+       git_config_set_multivar(key, tmp->buf, "^$", 0);
 }
 
 static const char mirror_advice[] =
@@ -197,8 +197,7 @@ static int add(int argc, const char **argv)
                die(_("'%s' is not a valid remote name"), name);
 
        strbuf_addf(&buf, "remote.%s.url", name);
-       if (git_config_set(buf.buf, url))
-               return 1;
+       git_config_set(buf.buf, url);
 
        if (!mirror || mirror & MIRROR_FETCH) {
                strbuf_reset(&buf);
@@ -206,25 +205,22 @@ static int add(int argc, const char **argv)
                if (track.nr == 0)
                        string_list_append(&track, "*");
                for (i = 0; i < track.nr; i++) {
-                       if (add_branch(buf.buf, track.items[i].string,
-                                      name, mirror, &buf2))
-                               return 1;
+                       add_branch(buf.buf, track.items[i].string,
+                                  name, mirror, &buf2);
                }
        }
 
        if (mirror & MIRROR_PUSH) {
                strbuf_reset(&buf);
                strbuf_addf(&buf, "remote.%s.mirror", name);
-               if (git_config_set(buf.buf, "true"))
-                       return 1;
+               git_config_set(buf.buf, "true");
        }
 
        if (fetch_tags != TAGS_DEFAULT) {
                strbuf_reset(&buf);
                strbuf_addf(&buf, "remote.%s.tagopt", name);
-               if (git_config_set(buf.buf,
-                       fetch_tags == TAGS_SET ? "--tags" : "--no-tags"))
-                       return 1;
+               git_config_set(buf.buf,
+                              fetch_tags == TAGS_SET ? "--tags" : "--no-tags");
        }
 
        if (fetch && fetch_remote(name))
@@ -590,25 +586,20 @@ static int migrate_file(struct remote *remote)
 
        strbuf_addf(&buf, "remote.%s.url", remote->name);
        for (i = 0; i < remote->url_nr; i++)
-               if (git_config_set_multivar(buf.buf, remote->url[i], "^$", 0))
-                       return error(_("Could not append '%s' to '%s'"),
-                                       remote->url[i], buf.buf);
+               git_config_set_multivar(buf.buf, remote->url[i], "^$", 0);
        strbuf_reset(&buf);
        strbuf_addf(&buf, "remote.%s.push", remote->name);
        for (i = 0; i < remote->push_refspec_nr; i++)
-               if (git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0))
-                       return error(_("Could not append '%s' to '%s'"),
-                                       remote->push_refspec[i], buf.buf);
+               git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0);
        strbuf_reset(&buf);
        strbuf_addf(&buf, "remote.%s.fetch", remote->name);
        for (i = 0; i < remote->fetch_refspec_nr; i++)
-               if (git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0))
-                       return error(_("Could not append '%s' to '%s'"),
-                                       remote->fetch_refspec[i], buf.buf);
+               git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0);
        if (remote->origin == REMOTE_REMOTES)
                unlink_or_warn(git_path("remotes/%s", remote->name));
        else if (remote->origin == REMOTE_BRANCHES)
                unlink_or_warn(git_path("branches/%s", remote->name));
+
        return 0;
 }
 
@@ -655,8 +646,7 @@ static int mv(int argc, const char **argv)
 
        strbuf_reset(&buf);
        strbuf_addf(&buf, "remote.%s.fetch", rename.new);
-       if (git_config_set_multivar(buf.buf, NULL, NULL, 1))
-               return error(_("Could not remove config section '%s'"), buf.buf);
+       git_config_set_multivar(buf.buf, NULL, NULL, 1);
        strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old);
        for (i = 0; i < oldremote->fetch_refspec_nr; i++) {
                char *ptr;
@@ -676,8 +666,7 @@ static int mv(int argc, const char **argv)
                                  "\tPlease update the configuration manually if necessary."),
                                buf2.buf);
 
-               if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0))
-                       return error(_("Could not append '%s'"), buf.buf);
+               git_config_set_multivar(buf.buf, buf2.buf, "^$", 0);
        }
 
        read_branches();
@@ -687,9 +676,7 @@ static int mv(int argc, const char **argv)
                if (info->remote_name && !strcmp(info->remote_name, rename.old)) {
                        strbuf_reset(&buf);
                        strbuf_addf(&buf, "branch.%s.remote", item->string);
-                       if (git_config_set(buf.buf, rename.new)) {
-                               return error(_("Could not set '%s'"), buf.buf);
-                       }
+                       git_config_set(buf.buf, rename.new);
                }
        }
 
@@ -787,10 +774,7 @@ static int rm(int argc, const char **argv)
                                strbuf_reset(&buf);
                                strbuf_addf(&buf, "branch.%s.%s",
                                                item->string, *k);
-                               if (git_config_set(buf.buf, NULL)) {
-                                       strbuf_release(&buf);
-                                       return -1;
-                               }
+                               git_config_set(buf.buf, NULL);
                        }
                }
        }
@@ -1409,24 +1393,20 @@ static int update(int argc, const char **argv)
 
 static int remove_all_fetch_refspecs(const char *remote, const char *key)
 {
-       return git_config_set_multivar(key, NULL, NULL, 1);
+       return git_config_set_multivar_gently(key, NULL, NULL, 1);
 }
 
-static int add_branches(struct remote *remote, const char **branches,
-                       const char *key)
+static void add_branches(struct remote *remote, const char **branches,
+                        const char *key)
 {
        const char *remotename = remote->name;
        int mirror = remote->mirror;
        struct strbuf refspec = STRBUF_INIT;
 
        for (; *branches; branches++)
-               if (add_branch(key, *branches, remotename, mirror, &refspec)) {
-                       strbuf_release(&refspec);
-                       return 1;
-               }
+               add_branch(key, *branches, remotename, mirror, &refspec);
 
        strbuf_release(&refspec);
-       return 0;
 }
 
 static int set_remote_branches(const char *remotename, const char **branches,
@@ -1445,10 +1425,7 @@ static int set_remote_branches(const char *remotename, const char **branches,
                strbuf_release(&key);
                return 1;
        }
-       if (add_branches(remote, branches, key.buf)) {
-               strbuf_release(&key);
-               return 1;
-       }
+       add_branches(remote, branches, key.buf);
 
        strbuf_release(&key);
        return 0;
@@ -1580,10 +1557,11 @@ static int set_url(int argc, const char **argv)
        if ((!oldurl && !delete_mode) || add_mode) {
                if (add_mode)
                        git_config_set_multivar(name_buf.buf, newurl,
-                               "^$", 0);
+                                                      "^$", 0);
                else
                        git_config_set(name_buf.buf, newurl);
                strbuf_release(&name_buf);
+
                return 0;
        }
 
index 7e074aad408ee7d63d86643878ff5c5bb311f732..7a4f2c0b0ccedf958b78b2bdda217bfb269c6b23 100644 (file)
@@ -763,7 +763,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (!strcmp(arg, "--git-common-dir")) {
-                               puts(get_git_common_dir());
+                               const char *pfx = prefix ? prefix : "";
+                               puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir()));
                                continue;
                        }
                        if (!strcmp(arg, "--resolve-git-dir")) {
index 80b972f92fde3201bdf1cb8bd74c2b4ff53fa5ae..8829b09d0ba5d49edbad5f37f8246123dad3fd5f 100644 (file)
@@ -211,7 +211,7 @@ static int check_local_mod(unsigned char *head, int index_only)
                 * "intent to add" entry.
                 */
                if (local_changes && staged_changes) {
-                       if (!index_only || !(ce->ce_flags & CE_INTENT_TO_ADD))
+                       if (!index_only || !ce_intent_to_add(ce))
                                string_list_append(&files_staged, name);
                }
                else if (!index_only) {
index 7ff8434f7c3cf71dbd77cbf868d5dc56dd943fdb..15e716ef4322bb53428685c349aa489ed84a6dda 100644 (file)
@@ -35,7 +35,7 @@ int cmd_stripspace(int argc, const char **argv, const char *prefix)
                            N_("skip and remove all lines starting with comment character"),
                            STRIP_COMMENTS),
                OPT_CMDMODE('c', "comment-lines", &mode,
-                           N_("prepend comment character and blank to each line"),
+                           N_("prepend comment character and space to each line"),
                            COMMENT_LINES),
                OPT_END()
        };
index 8db8c87e57ef05edadce8de19316572498c40753..1705c9466546c7de52b12d3fbafbbe7b6d43cf4e 100644 (file)
@@ -44,11 +44,11 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con
        if (!format) {
                if (filter->lines) {
                        to_free = xstrfmt("%s %%(contents:lines=%d)",
-                                         "%(align:15)%(refname:short)%(end)",
+                                         "%(align:15)%(refname:strip=2)%(end)",
                                          filter->lines);
                        format = to_free;
                } else
-                       format = "%(refname:short)";
+                       format = "%(refname:strip=2)";
        }
 
        verify_ref_format(format);
index 475b9581a5583166c43199f1662b510842c59c7d..0a45710be8561e51d1b2e29586a63b0aa8518e56 100644 (file)
@@ -52,7 +52,7 @@ static int prune_worktree(const char *id, struct strbuf *reason)
                return 1;
        }
        len = st.st_size;
-       path = xmalloc(len + 1);
+       path = xmallocz(len);
        read_in_full(fd, path, len);
        close(fd);
        while (len && (path[len - 1] == '\n' || path[len - 1] == '\r'))
index a59e6f1e1fcfb65bd2fe9cdba0db60d6d87e7d96..3ebf9c3aa44eb2ab25f573192b6449f63311ffd7 100644 (file)
@@ -79,11 +79,9 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it,
        ALLOC_GROW(it->down, it->subtree_nr + 1, it->subtree_alloc);
        it->subtree_nr++;
 
-       down = xmalloc(sizeof(*down) + pathlen + 1);
+       FLEX_ALLOC_MEM(down, name, path, pathlen);
        down->cache_tree = NULL;
        down->namelen = pathlen;
-       memcpy(down->name, path, pathlen);
-       down->name[pathlen] = 0;
 
        if (pos < it->subtree_nr)
                memmove(it->down + pos + 1,
@@ -377,7 +375,7 @@ static int update_one(struct cache_tree *it,
                 * they are not part of generated trees. Invalidate up
                 * to root to force cache-tree users to read elsewhere.
                 */
-               if (ce->ce_flags & CE_INTENT_TO_ADD) {
+               if (ce_intent_to_add(ce)) {
                        to_invalidate = 1;
                        continue;
                }
diff --git a/cache.h b/cache.h
index c63fcc113a6e511a53f0170a07bd5dbbf12cc120..1f145c2c6a9bcefe21caf1e681267b4e86911136 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -214,7 +214,7 @@ struct cache_entry {
 #define CE_INTENT_TO_ADD     (1 << 29)
 #define CE_SKIP_WORKTREE     (1 << 30)
 /* CE_EXTENDED2 is for future extension */
-#define CE_EXTENDED2         (1 << 31)
+#define CE_EXTENDED2         (1U << 31)
 
 #define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD | CE_SKIP_WORKTREE)
 
@@ -228,7 +228,9 @@ struct cache_entry {
 #error "CE_EXTENDED_FLAGS out of range"
 #endif
 
+/* Forward structure decls */
 struct pathspec;
+struct child_process;
 
 /*
  * Copy the sha1 and stat state of a cache entry from one to
@@ -259,6 +261,7 @@ static inline unsigned create_ce_flags(unsigned stage)
 #define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE)
 #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE)
 #define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE)
+#define ce_intent_to_add(ce) ((ce)->ce_flags & CE_INTENT_TO_ADD)
 
 #define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644)
 static inline unsigned int create_ce_mode(unsigned int mode)
@@ -456,7 +459,6 @@ extern char *git_work_tree_cfg;
 extern int is_inside_work_tree(void);
 extern const char *get_git_dir(void);
 extern const char *get_git_common_dir(void);
-extern int is_git_directory(const char *path);
 extern char *get_object_directory(void);
 extern char *get_index_file(void);
 extern char *get_graft_file(void);
@@ -467,6 +469,25 @@ extern const char *get_git_namespace(void);
 extern const char *strip_namespace(const char *namespaced_ref);
 extern const char *get_git_work_tree(void);
 
+/*
+ * Return true if the given path is a git directory; note that this _just_
+ * looks at the directory itself. If you want to know whether "foo/.git"
+ * is a repository, you must feed that path, not just "foo".
+ */
+extern int is_git_directory(const char *path);
+
+/*
+ * Return 1 if the given path is the root of a git repository or
+ * submodule, else 0. Will not return 1 for bare repositories with the
+ * exception of creating a bare repository in "foo/.git" and calling
+ * is_git_repository("foo").
+ *
+ * If we run into read errors, we err on the side of saying "yes, it is",
+ * as we usually consider sub-repos precious, and would prefer to err on the
+ * side of not disrupting or deleting them.
+ */
+extern int is_nonbare_repository_dir(struct strbuf *path);
+
 #define READ_GITFILE_ERR_STAT_FAILED 1
 #define READ_GITFILE_ERR_NOT_A_FILE 2
 #define READ_GITFILE_ERR_OPEN_FAILED 3
@@ -1466,7 +1487,7 @@ extern int update_server_info(int);
 /* git_config_parse_key() returns these negated: */
 #define CONFIG_INVALID_KEY 1
 #define CONFIG_NO_SECTION_OR_NAME 2
-/* git_config_set(), git_config_set_multivar() return the above or these: */
+/* git_config_set_gently(), git_config_set_multivar_gently() return the above or these: */
 #define CONFIG_NO_LOCK -1
 #define CONFIG_INVALID_FILE 3
 #define CONFIG_NO_WRITE 4
@@ -1504,12 +1525,16 @@ extern int git_config_bool(const char *, const char *);
 extern int git_config_maybe_bool(const char *, const char *);
 extern int git_config_string(const char **, const char *, const char *);
 extern int git_config_pathname(const char **, const char *, const char *);
-extern int git_config_set_in_file(const char *, const char *, const char *);
-extern int git_config_set(const char *, const char *);
+extern int git_config_set_in_file_gently(const char *, const char *, const char *);
+extern void git_config_set_in_file(const char *, const char *, const char *);
+extern int git_config_set_gently(const char *, const char *);
+extern void git_config_set(const char *, const char *);
 extern int git_config_parse_key(const char *, char **, int *);
 extern int git_config_key_is_valid(const char *key);
-extern int git_config_set_multivar(const char *, const char *, const char *, int);
-extern int git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
+extern int git_config_set_multivar_gently(const char *, const char *, const char *, int);
+extern void git_config_set_multivar(const char *, const char *, const char *, int);
+extern int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, int);
+extern void git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
 extern int git_config_rename_section(const char *, const char *);
 extern int git_config_rename_section_in_file(const char *, const char *, const char *);
 extern const char *git_etc_gitconfig(void);
@@ -1656,6 +1681,7 @@ extern int pager_use_color;
 extern int term_columns(void);
 extern int decimal_width(uintmax_t);
 extern int check_pager_config(const char *cmd);
+extern void prepare_pager_args(struct child_process *, const char *pager);
 
 extern const char *editor_program;
 extern const char *askpass_program;
index 786abe62b0bb0f27b51218f7698c60476d12c8e8..d55ead18efeba9435bd2f2e76e2d7ac9ddc064c1 100644 (file)
--- a/column.c
+++ b/column.c
@@ -164,7 +164,7 @@ static void display_table(const struct string_list *list,
        data.colopts = colopts;
        data.opts = *opts;
 
-       data.len = xmalloc(sizeof(*data.len) * list->nr);
+       ALLOC_ARRAY(data.len, list->nr);
        for (i = 0; i < list->nr; i++)
                data.len[i] = item_length(colopts, list->items[i].string);
 
@@ -173,9 +173,8 @@ static void display_table(const struct string_list *list,
        if (colopts & COL_DENSE)
                shrink_columns(&data);
 
-       empty_cell = xmalloc(initial_width + 1);
+       empty_cell = xmallocz(initial_width);
        memset(empty_cell, ' ', initial_width);
-       empty_cell[initial_width] = '\0';
        for (y = 0; y < data.rows; y++) {
                for (x = 0; x < data.cols; x++)
                        if (display_cell(&data, initial_width, empty_cell, x, y))
index 55713049a4d6764722307e2a2c870996ff9b373b..0e1d4b0893ce0266a6d15f880bb6ad66eb2619fb 100644 (file)
@@ -189,11 +189,11 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase,
         *   - Else if we have NEW, insert newend lline into base and
         *   consume newend
         */
-       lcs = xcalloc(origbaselen + 1, sizeof(int*));
-       directions = xcalloc(origbaselen + 1, sizeof(enum coalesce_direction*));
+       lcs = xcalloc(st_add(origbaselen, 1), sizeof(int*));
+       directions = xcalloc(st_add(origbaselen, 1), sizeof(enum coalesce_direction*));
        for (i = 0; i < origbaselen + 1; i++) {
-               lcs[i] = xcalloc(lennew + 1, sizeof(int));
-               directions[i] = xcalloc(lennew + 1, sizeof(enum coalesce_direction));
+               lcs[i] = xcalloc(st_add(lennew, 1), sizeof(int));
+               directions[i] = xcalloc(st_add(lennew, 1), sizeof(enum coalesce_direction));
                directions[i][0] = BASE;
        }
        for (j = 1; j < lennew + 1; j++)
@@ -319,7 +319,7 @@ static void append_lost(struct sline *sline, int n, const char *line, int len)
        if (line[len-1] == '\n')
                len--;
 
-       lline = xmalloc(sizeof(*lline) + len + 1);
+       FLEX_ALLOC_MEM(lline, line, line, len);
        lline->len = len;
        lline->next = NULL;
        lline->prev = sline->plost.lost_tail;
@@ -330,8 +330,6 @@ static void append_lost(struct sline *sline, int n, const char *line, int len)
        sline->plost.lost_tail = lline;
        sline->plost.len++;
        lline->parent_map = this_mask;
-       memcpy(lline->line, line, len);
-       lline->line[len] = 0;
 }
 
 struct combine_diff_state {
@@ -1043,7 +1041,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
                                elem->mode = canon_mode(S_IFLNK);
 
                        result_size = len;
-                       result = xmalloc(len + 1);
+                       result = xmallocz(len);
 
                        done = read_in_full(fd, result, len);
                        if (done < 0)
@@ -1051,8 +1049,6 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
                        else if (done < len)
                                die("early EOF '%s'", elem->path);
 
-                       result[len] = 0;
-
                        /* If not a fake symlink, apply filters, e.g. autocrlf */
                        if (is_file) {
                                struct strbuf buf = STRBUF_INIT;
@@ -1115,7 +1111,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
        if (result_size && result[result_size-1] != '\n')
                cnt++; /* incomplete line */
 
-       sline = xcalloc(cnt+2, sizeof(*sline));
+       sline = xcalloc(st_add(cnt, 2), sizeof(*sline));
        sline[0].bol = result;
        for (lno = 0, cp = result; cp < result + result_size; cp++) {
                if (*cp == '\n') {
@@ -1134,7 +1130,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
        /* Even p_lno[cnt+1] is valid -- that is for the end line number
         * for deletion hunk at the end.
         */
-       sline[0].p_lno = xcalloc((cnt+2) * num_parent, sizeof(unsigned long));
+       sline[0].p_lno = xcalloc(st_mult(st_add(cnt, 2), num_parent), sizeof(unsigned long));
        for (lno = 0; lno <= cnt; lno++)
                sline[lno+1].p_lno = sline[lno].p_lno + num_parent;
 
@@ -1266,7 +1262,7 @@ static struct diff_filepair *combined_pair(struct combine_diff_path *p,
        struct diff_filespec *pool;
 
        pair = xmalloc(sizeof(*pair));
-       pool = xcalloc(num_parent + 1, sizeof(struct diff_filespec));
+       pool = xcalloc(st_add(num_parent, 1), sizeof(struct diff_filespec));
        pair->one = pool + 1;
        pair->two = pool;
 
@@ -1372,7 +1368,7 @@ static struct combine_diff_path *find_paths_multitree(
        struct combine_diff_path paths_head;
        struct strbuf base;
 
-       parents_sha1 = xmalloc(nparent * sizeof(parents_sha1[0]));
+       ALLOC_ARRAY(parents_sha1, nparent);
        for (i = 0; i < nparent; i++)
                parents_sha1[i] = parents->sha1[i];
 
@@ -1483,7 +1479,7 @@ void diff_tree_combined(const unsigned char *sha1,
        if (opt->orderfile && num_paths) {
                struct obj_order *o;
 
-               o = xmalloc(sizeof(*o) * num_paths);
+               ALLOC_ARRAY(o, num_paths);
                for (i = 0, p = paths; p; p = p->next, i++)
                        o[i].obj = p;
                order_objects(opt->orderfile, path_path, o, num_paths);
index 40388d71e754bb35e3879a73f6e8a0ad8904ca41..3f4f371e5eec41fa67345c0b9d373b541e52172a 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -147,7 +147,7 @@ struct commit_graft *read_graft_line(char *buf, int len)
        if ((len + 1) % entry_size)
                goto bad_graft_data;
        i = (len + 1) / entry_size - 1;
-       graft = xmalloc(sizeof(*graft) + GIT_SHA1_RAWSZ * i);
+       graft = xmalloc(st_add(sizeof(*graft), st_mult(GIT_SHA1_RAWSZ, i)));
        graft->nr_parent = i;
        if (get_oid_hex(buf, &graft->oid))
                goto bad_graft_data;
@@ -903,7 +903,7 @@ static int remove_redundant(struct commit **array, int cnt)
 
        work = xcalloc(cnt, sizeof(*work));
        redundant = xcalloc(cnt, 1);
-       filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1));
+       ALLOC_ARRAY(filled_index, cnt - 1);
 
        for (i = 0; i < cnt; i++)
                parse_commit(array[i]);
index d8f8a3c6dc039ff8891d04857be737b29259d7c6..96bd9533b448e56176a335a41e32f9bb2dd24d03 100644 (file)
@@ -1,15 +1,71 @@
 #include "../git-compat-util.h"
+#include "../strbuf.h"
 
 /* Adapted from libiberty's basename.c.  */
 char *gitbasename (char *path)
 {
        const char *base;
-       /* Skip over the disk name in MSDOS pathnames. */
-       if (has_dos_drive_prefix(path))
-               path += 2;
+
+       if (path)
+               skip_dos_drive_prefix(&path);
+
+       if (!path || !*path)
+               return ".";
+
        for (base = path; *path; path++) {
-               if (is_dir_sep(*path))
-                       base = path + 1;
+               if (!is_dir_sep(*path))
+                       continue;
+               do {
+                       path++;
+               } while (is_dir_sep(*path));
+               if (*path)
+                       base = path;
+               else
+                       while (--path != base && is_dir_sep(*path))
+                               *path = '\0';
        }
        return (char *)base;
 }
+
+char *gitdirname(char *path)
+{
+       static struct strbuf buf = STRBUF_INIT;
+       char *p = path, *slash = NULL, c;
+       int dos_drive_prefix;
+
+       if (!p)
+               return ".";
+
+       if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p)
+               goto dot;
+
+       /*
+        * POSIX.1-2001 says dirname("/") should return "/", and dirname("//")
+        * should return "//", but dirname("///") should return "/" again.
+        */
+       if (is_dir_sep(*p)) {
+               if (!p[1] || (is_dir_sep(p[1]) && !p[2]))
+                       return path;
+               slash = ++p;
+       }
+       while ((c = *(p++)))
+               if (is_dir_sep(c)) {
+                       char *tentative = p - 1;
+
+                       /* POSIX.1-2001 says to ignore trailing slashes */
+                       while (is_dir_sep(*p))
+                               p++;
+                       if (*p)
+                               slash = tentative;
+               }
+
+       if (slash) {
+               *slash = '\0';
+               return path;
+       }
+
+dot:
+       strbuf_reset(&buf);
+       strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path);
+       return buf.buf;
+}
index 7fed637ed09648b155441e883302e6b96afb7202..d47c0035449b412ee074c9a94c0f5281211f5f7e 100644 (file)
@@ -149,11 +149,12 @@ static inline uint64_t git_bswap64(uint64_t x)
  * and is faster on architectures with memory alignment issues.
  */
 
-#if defined(__i386__) || defined(__x86_64__) || \
+#if !defined(NO_UNALIGNED_LOADS) && ( \
+    defined(__i386__) || defined(__x86_64__) || \
     defined(_M_IX86) || defined(_M_X64) || \
     defined(__ppc__) || defined(__ppc64__) || \
     defined(__powerpc__) || defined(__powerpc64__) || \
-    defined(__s390__) || defined(__s390x__)
+    defined(__s390__) || defined(__s390x__))
 
 #define get_be16(p)    ntohs(*(unsigned short *)(p))
 #define get_be32(p)    ntohl(*(unsigned int *)(p))
index 5edea29508d06fdc2daea540edadffdebd54173e..af56c1fe6116a448a0699ef3360e24e0ecbe419f 100644 (file)
@@ -769,7 +769,7 @@ static const char *quote_arg(const char *arg)
                return arg;
 
        /* insert \ where necessary */
-       d = q = xmalloc(len+n+3);
+       d = q = xmalloc(st_add3(len, n, 3));
        *d++ = '"';
        while (*arg) {
                if (*arg == '"')
@@ -852,7 +852,7 @@ static char **get_path_split(void)
        if (!n)
                return NULL;
 
-       path = xmalloc((n+1)*sizeof(char *));
+       ALLOC_ARRAY(path, n + 1);
        p = envpath;
        i = 0;
        do {
@@ -937,7 +937,7 @@ static wchar_t *make_environment_block(char **deltaenv)
                i++;
 
        /* copy the environment, leaving space for changes */
-       tmpenv = xmalloc((size + i) * sizeof(char*));
+       ALLOC_ARRAY(tmpenv, size + i);
        memcpy(tmpenv, environ, size * sizeof(char*));
 
        /* merge supplied environment changes into the temporary environment */
@@ -1028,7 +1028,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
                        free(quoted);
        }
 
-       wargs = xmalloc((2 * args.len + 1) * sizeof(wchar_t));
+       ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1));
        xutftowcs(wargs, args.buf, 2 * args.len + 1);
        strbuf_release(&args);
 
@@ -1127,7 +1127,7 @@ static int try_shell_exec(const char *cmd, char *const *argv)
                int argc = 0;
                const char **argv2;
                while (argv[argc]) argc++;
-               argv2 = xmalloc(sizeof(*argv) * (argc+1));
+               ALLOC_ARRAY(argv2, argc + 1);
                argv2[0] = (char *)cmd; /* full path to the script file */
                memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
                pid = mingw_spawnv(prog, argv2, 1);
@@ -1932,28 +1932,31 @@ pid_t waitpid(pid_t pid, int *status, int options)
        return -1;
 }
 
+int mingw_skip_dos_drive_prefix(char **path)
+{
+       int ret = has_dos_drive_prefix(*path);
+       *path += ret;
+       return ret;
+}
+
 int mingw_offset_1st_component(const char *path)
 {
-       int offset = 0;
-       if (has_dos_drive_prefix(path))
-               offset = 2;
+       char *pos = (char *)path;
 
        /* unc paths */
-       else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) {
-
+       if (!skip_dos_drive_prefix(&pos) &&
+                       is_dir_sep(pos[0]) && is_dir_sep(pos[1])) {
                /* skip server name */
-               char *pos = strpbrk(path + 2, "\\/");
+               pos = strpbrk(pos + 2, "\\/");
                if (!pos)
                        return 0; /* Error: malformed unc path */
 
                do {
                        pos++;
                } while (*pos && !is_dir_sep(*pos));
-
-               offset = pos - path;
        }
 
-       return offset + is_dir_sep(path[offset]);
+       return pos + is_dir_sep(*pos) - path;
 }
 
 int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)
index 57ca477d1f100a7ddb1cc9cb693d050e32ae0eb0..a5fb52f97750f4b7560fe846c2d1c9d02915faf2 100644 (file)
@@ -361,7 +361,10 @@ HANDLE winansi_get_osfhandle(int fd);
  * git specific compatibility
  */
 
-#define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':')
+#define has_dos_drive_prefix(path) \
+       (isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
+int mingw_skip_dos_drive_prefix(char **path);
+#define skip_dos_drive_prefix mingw_skip_dos_drive_prefix
 #define is_dir_sep(c) ((c) == '/' || (c) == '\\')
 static inline char *mingw_find_last_dir_sep(const char *path)
 {
index 079070ff1d4bd629712eff5f6f6e239898640963..dfbe6d84081c8b8eea50450a4c23c9a80b3b57a7 100644 (file)
@@ -50,7 +50,8 @@ void probe_utf8_pathname_composition(void)
                close(output_fd);
                git_path_buf(&path, "%s", auml_nfd);
                precomposed_unicode = access(path.buf, R_OK) ? 0 : 1;
-               git_config_set("core.precomposeunicode", precomposed_unicode ? "true" : "false");
+               git_config_set("core.precomposeunicode",
+                              precomposed_unicode ? "true" : "false");
                git_path_buf(&path, "%s", auml_nfc);
                if (unlink(path.buf))
                        die_errno(_("failed to unlink '%s'"), path.buf);
index 9574d537bd38d3aa72ee040b106456088ee16a07..7d071afb70530ede222ed9cdb4645baf4277fb79 100644 (file)
@@ -47,7 +47,7 @@ static void msort_with_tmp(void *b, size_t n, size_t s,
 void git_qsort(void *b, size_t n, size_t s,
               int (*cmp)(const void *, const void *))
 {
-       const size_t size = n * s;
+       const size_t size = st_mult(n, s);
        char buf[1024];
 
        if (size < sizeof(buf)) {
index fc1439a6439393ff5224e98ab126607ceaa4994d..7849f258d20195ac27c9be921fb8b65ac094a408 100644 (file)
@@ -18,7 +18,7 @@ int gitsetenv(const char *name, const char *value, int replace)
 
        namelen = strlen(name);
        valuelen = strlen(value);
-       envstr = malloc((namelen + valuelen + 2));
+       envstr = malloc(st_add3(namelen, valuelen, 2));
        if (!envstr) {
                errno = ENOMEM;
                return -1;
index d015e436d57472bf9560a6f604705f52938c9f19..b905aea31bf53dc0f614d5e95c0dbd382818cbc4 100644 (file)
@@ -32,7 +32,7 @@ void syslog(int priority, const char *fmt, ...)
                return;
        }
 
-       str = malloc(str_len + 1);
+       str = malloc(st_add(str_len, 1));
        if (!str) {
                warning("malloc failed: '%s'", strerror(errno));
                return;
@@ -43,7 +43,7 @@ void syslog(int priority, const char *fmt, ...)
        va_end(ap);
 
        while ((pos = strstr(str, "%1")) != NULL) {
-               str = realloc(str, ++str_len + 1);
+               str = realloc(str, st_add(++str_len, 1));
                if (!str) {
                        warning("realloc failed: '%s'", strerror(errno));
                        return;
index 86a5eb2571fb282a1d7bad9e6d097b2374b550dc..03544e7a3f68f858e2fed5492a4460bd05b75602 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1825,15 +1825,26 @@ static ssize_t find_beginning_of_line(const char *contents, size_t size,
        return offset;
 }
 
-int git_config_set_in_file(const char *config_filename,
-                       const char *key, const char *value)
+int git_config_set_in_file_gently(const char *config_filename,
+                                 const char *key, const char *value)
 {
-       return git_config_set_multivar_in_file(config_filename, key, value, NULL, 0);
+       return git_config_set_multivar_in_file_gently(config_filename, key, value, NULL, 0);
 }
 
-int git_config_set(const char *key, const char *value)
+void git_config_set_in_file(const char *config_filename,
+                           const char *key, const char *value)
 {
-       return git_config_set_multivar(key, value, NULL, 0);
+       git_config_set_multivar_in_file(config_filename, key, value, NULL, 0);
+}
+
+int git_config_set_gently(const char *key, const char *value)
+{
+       return git_config_set_multivar_gently(key, value, NULL, 0);
+}
+
+void git_config_set(const char *key, const char *value)
+{
+       git_config_set_multivar(key, value, NULL, 0);
 }
 
 /*
@@ -1878,7 +1889,7 @@ static int git_config_parse_key_1(const char *key, char **store_key, int *basele
         * Validate the key and while at it, lower case it for matching.
         */
        if (store_key)
-               *store_key = xmalloc(strlen(key) + 1);
+               *store_key = xmallocz(strlen(key));
 
        dot = 0;
        for (i = 0; key[i]; i++) {
@@ -1902,8 +1913,6 @@ static int git_config_parse_key_1(const char *key, char **store_key, int *basele
                if (store_key)
                        (*store_key)[i] = c;
        }
-       if (store_key)
-               (*store_key)[i] = 0;
 
        return 0;
 
@@ -1950,9 +1959,10 @@ int git_config_key_is_valid(const char *key)
  * - the config file is removed and the lock file rename()d to it.
  *
  */
-int git_config_set_multivar_in_file(const char *config_filename,
-                               const char *key, const char *value,
-                               const char *value_regex, int multi_replace)
+int git_config_set_multivar_in_file_gently(const char *config_filename,
+                                          const char *key, const char *value,
+                                          const char *value_regex,
+                                          int multi_replace)
 {
        int fd = -1, in_fd = -1;
        int ret;
@@ -2179,11 +2189,27 @@ int git_config_set_multivar_in_file(const char *config_filename,
 
 }
 
-int git_config_set_multivar(const char *key, const char *value,
-                       const char *value_regex, int multi_replace)
+void git_config_set_multivar_in_file(const char *config_filename,
+                                    const char *key, const char *value,
+                                    const char *value_regex, int multi_replace)
+{
+       if (git_config_set_multivar_in_file_gently(config_filename, key, value,
+                                                  value_regex, multi_replace) < 0)
+               die(_("Could not set '%s' to '%s'"), key, value);
+}
+
+int git_config_set_multivar_gently(const char *key, const char *value,
+                                  const char *value_regex, int multi_replace)
+{
+       return git_config_set_multivar_in_file_gently(NULL, key, value, value_regex,
+                                                     multi_replace);
+}
+
+void git_config_set_multivar(const char *key, const char *value,
+                            const char *value_regex, int multi_replace)
 {
-       return git_config_set_multivar_in_file(NULL, key, value, value_regex,
-                                              multi_replace);
+       git_config_set_multivar_in_file(NULL, key, value, value_regex,
+                                       multi_replace);
 }
 
 static int section_name_match (const char *buf, const char *name)
index 69568075191af7b22fc4e9e556cdcd3c19dc7a51..00d729996fab5be89696bf4841205d45c49c7794 100644 (file)
@@ -1169,7 +1169,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
                        --no-prefix --src-prefix= --dst-prefix=
                        --inter-hunk-context=
                        --patience --histogram --minimal
-                       --raw --word-diff
+                       --raw --word-diff --word-diff-regex=
                        --dirstat --dirstat= --dirstat-by-file
                        --dirstat-by-file= --cumulative
                        --diff-algorithm=
@@ -1687,8 +1687,12 @@ _git_rebase ()
                        --preserve-merges --stat --no-stat
                        --committer-date-is-author-date --ignore-date
                        --ignore-whitespace --whitespace=
-                       --autosquash --fork-point --no-fork-point
-                       --autostash
+                       --autosquash --no-autosquash
+                       --fork-point --no-fork-point
+                       --autostash --no-autostash
+                       --verify --no-verify
+                       --keep-empty --root --force-rebase --no-ff
+                       --exec
                        "
 
                return
@@ -2368,7 +2372,7 @@ _git_show_branch ()
        case "$cur" in
        --*)
                __gitcomp "
-                       --all --remotes --topo-order --current --more=
+                       --all --remotes --topo-order --date-order --current --more=
                        --list --independent --merge-base --no-name
                        --color --no-color
                        --sha1-name --sparse --topics --reflog
@@ -2381,7 +2385,7 @@ _git_show_branch ()
 
 _git_stash ()
 {
-       local save_opts='--keep-index --no-keep-index --quiet --patch'
+       local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
        local subcommands='save list show apply clear drop pop create branch'
        local subcommand="$(__git_find_on_cmdline "$subcommands")"
        if [ -z "$subcommand" ]; then
@@ -2403,9 +2407,20 @@ _git_stash ()
                apply,--*|pop,--*)
                        __gitcomp "--index --quiet"
                        ;;
-               show,--*|drop,--*|branch,--*)
+               drop,--*)
+                       __gitcomp "--quiet"
                        ;;
-               show,*|apply,*|drop,*|pop,*|branch,*)
+               show,--*|branch,--*)
+                       ;;
+               branch,*)
+                       if [ $cword -eq 3 ]; then
+                               __gitcomp_nl "$(__git_refs)";
+                       else
+                               __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
+                                               | sed -n -e 's/:.*//p')"
+                       fi
+                       ;;
+               show,*|apply,*|drop,*|pop,*)
                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
                                        | sed -n -e 's/:.*//p')"
                        ;;
index edf36f8c36091551d0a3e6cacb6c91446f0147eb..5c8372709b31b4ecd8caf0e05faedd0626f03021 100755 (executable)
@@ -479,8 +479,16 @@ copy_or_skip()
                        p="$p -p $parent"
                fi
        done
-       
-       if [ -n "$identical" ]; then
+
+       copycommit=
+       if [ -n "$identical" ] && [ -n "$nonidentical" ]; then
+               extras=$(git rev-list --count $identical..$nonidentical)
+               if [ "$extras" -ne 0 ]; then
+                       # we need to preserve history along the other branch
+                       copycommit=1
+               fi
+       fi
+       if [ -n "$identical" ] && [ -z "$copycommit" ]; then
                echo $identical
        else
                copy_commit $rev $tree "$p" || exit $?
index 751aee3a0cd782c9eb1f98cb78f582011fb0b181..3bf96a9bb6b29757736d8f4250fae25664e298f0 100755 (executable)
@@ -1014,4 +1014,64 @@ test_expect_success 'push split to subproj' '
        )
 '
 
+#
+# This test covers 2 cases in subtree split copy_or_skip code
+# 1) Merges where one parent is a superset of the changes of the other
+#    parent regarding changes to the subtree, in this case the merge
+#    commit should be copied
+# 2) Merges where only one parent operate on the subtree, and the merge
+#    commit should be skipped
+#
+# (1) is checked by ensuring subtree_tip is a descendent of subtree_branch
+# (2) should have a check added (not_a_subtree_change shouldn't be present
+#     on the produced subtree)
+#
+# Other related cases which are not tested (or currently handled correctly)
+# - Case (1) where there are more than 2 parents, it will sometimes correctly copy
+#   the merge, and sometimes not
+# - Merge commit where both parents have same tree as the merge, currently
+#   will always be skipped, even if they reached that state via different
+#   set of commits.
+#
+
+next_test
+test_expect_success 'subtree descendant check' '
+       subtree_test_create_repo "$subtree_test_count" &&
+       test_create_commit "$subtree_test_count" folder_subtree/a &&
+       (
+               cd "$subtree_test_count" &&
+               git branch branch
+       ) &&
+       test_create_commit "$subtree_test_count" folder_subtree/0 &&
+       test_create_commit "$subtree_test_count" folder_subtree/b &&
+       cherry=$(cd "$subtree_test_count"; git rev-parse HEAD) &&
+       (
+               cd "$subtree_test_count" &&
+               git checkout branch
+       ) &&
+       test_create_commit "$subtree_test_count" commit_on_branch &&
+       (
+               cd "$subtree_test_count" &&
+               git cherry-pick $cherry &&
+               git checkout master &&
+               git merge -m "merge should be kept on subtree" branch &&
+               git branch no_subtree_work_branch
+       ) &&
+       test_create_commit "$subtree_test_count" folder_subtree/d &&
+       (
+               cd "$subtree_test_count" &&
+               git checkout no_subtree_work_branch
+       ) &&
+       test_create_commit "$subtree_test_count" not_a_subtree_change &&
+       (
+               cd "$subtree_test_count" &&
+               git checkout master &&
+               git merge -m "merge should be skipped on subtree" no_subtree_work_branch &&
+
+               git subtree split --prefix folder_subtree/ --branch subtree_tip master &&
+               git subtree split --prefix folder_subtree/ --branch subtree_branch branch &&
+               check_equal $(git rev-list --count subtree_tip..subtree_branch) 0
+       )
+'
+
 test_done
index be70cd4da09ccab8850be41e19b0fc4b9a10f502..1e258ac8f9cebf135aa7ac07389f3ae4a49842ff 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -808,7 +808,7 @@ static void check_dead_children(void)
                        cradle = &blanket->next;
 }
 
-static char **cld_argv;
+static struct argv_array cld_argv = ARGV_ARRAY_INIT;
 static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
 {
        struct child_process cld = CHILD_PROCESS_INIT;
@@ -842,7 +842,7 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
 #endif
        }
 
-       cld.argv = (const char **)cld_argv;
+       cld.argv = cld_argv.argv;
        cld.in = incoming;
        cld.out = dup(incoming);
 
@@ -1374,12 +1374,10 @@ int main(int argc, char **argv)
                write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid());
 
        /* prepare argv for serving-processes */
-       cld_argv = xmalloc(sizeof (char *) * (argc + 2));
-       cld_argv[0] = argv[0];  /* git-daemon */
-       cld_argv[1] = "--serve";
+       argv_array_push(&cld_argv, argv[0]); /* git-daemon */
+       argv_array_push(&cld_argv, "--serve");
        for (i = 1; i < argc; ++i)
-               cld_argv[i+1] = argv[i];
-       cld_argv[argc+1] = NULL;
+               argv_array_push(&cld_argv, argv[i]);
 
        return serve(&listen_addr, listen_port, cred);
 }
index 8e0fd270b5be4d9ab8616ab57202862dd2fc6eda..03daadb25af835a695c7d0baf466b0e1f82b58c4 100644 (file)
@@ -237,12 +237,12 @@ static void fixup_paths(const char **path, struct strbuf *replacement)
 }
 
 void diff_no_index(struct rev_info *revs,
-                  int argc, const char **argv,
-                  const char *prefix)
+                  int argc, const char **argv)
 {
        int i, prefixlen;
        const char *paths[2];
        struct strbuf replacement = STRBUF_INIT;
+       const char *prefix = revs->prefix;
 
        diff_setup(&revs->diffopt);
        for (i = 1; i < argc - 2; ) {
@@ -252,7 +252,8 @@ void diff_no_index(struct rev_info *revs,
                else if (!strcmp(argv[i], "--"))
                        i++;
                else {
-                       j = diff_opt_parse(&revs->diffopt, argv + i, argc - i);
+                       j = diff_opt_parse(&revs->diffopt, argv + i, argc - i,
+                                          revs->prefix);
                        if (j <= 0)
                                die("invalid diff option/value: %s", argv[i]);
                        i += j;
diff --git a/diff.c b/diff.c
index 80eb0c2156a0f3727f8a9598f3e83233224539b0..059123c5dcef4129763895b0f2ad5a54728b0c07 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2607,12 +2607,9 @@ static void builtin_checkdiff(const char *name_a, const char *name_b,
 
 struct diff_filespec *alloc_filespec(const char *path)
 {
-       int namelen = strlen(path);
-       struct diff_filespec *spec = xmalloc(sizeof(*spec) + namelen + 1);
+       struct diff_filespec *spec;
 
-       memset(spec, 0, sizeof(*spec));
-       spec->path = (char *)(spec + 1);
-       memcpy(spec->path, path, namelen+1);
+       FLEXPTR_ALLOC_STR(spec, path, path);
        spec->count = 1;
        spec->is_binary = -1;
        return spec;
@@ -2707,21 +2704,21 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int
 
 static int diff_populate_gitlink(struct diff_filespec *s, int size_only)
 {
-       int len;
-       char *data = xmalloc(100), *dirty = "";
+       struct strbuf buf = STRBUF_INIT;
+       char *dirty = "";
 
        /* Are we looking at the work tree? */
        if (s->dirty_submodule)
                dirty = "-dirty";
 
-       len = snprintf(data, 100,
-                      "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty);
-       s->data = data;
-       s->size = len;
-       s->should_free = 1;
+       strbuf_addf(&buf, "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty);
+       s->size = buf.len;
        if (size_only) {
                s->data = NULL;
-               free(data);
+               strbuf_release(&buf);
+       } else {
+               s->data = strbuf_detach(&buf, NULL);
+               s->should_free = 1;
        }
        return 0;
 }
@@ -3693,12 +3690,16 @@ static int parse_ws_error_highlight(struct diff_options *opt, const char *arg)
        return 1;
 }
 
-int diff_opt_parse(struct diff_options *options, const char **av, int ac)
+int diff_opt_parse(struct diff_options *options,
+                  const char **av, int ac, const char *prefix)
 {
        const char *arg = av[0];
        const char *optarg;
        int argcount;
 
+       if (!prefix)
+               prefix = "";
+
        /* Output format options */
        if (!strcmp(arg, "-p") || !strcmp(arg, "-u") || !strcmp(arg, "--patch")
            || opt_arg(arg, 'U', "unified", &options->context))
@@ -3915,7 +3916,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        else if (!strcmp(arg, "--pickaxe-regex"))
                options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
        else if ((argcount = short_opt('O', av, &optarg))) {
-               options->orderfile = optarg;
+               const char *path = prefix_filename(prefix, strlen(prefix), optarg);
+               options->orderfile = xstrdup(path);
                return argcount;
        }
        else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
@@ -3954,9 +3956,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        else if (!strcmp(arg, "--no-function-context"))
                DIFF_OPT_CLR(options, FUNCCONTEXT);
        else if ((argcount = parse_long_opt("output", av, &optarg))) {
-               options->file = fopen(optarg, "w");
+               const char *path = prefix_filename(prefix, strlen(prefix), optarg);
+               options->file = fopen(path, "w");
                if (!options->file)
-                       die_errno("Could not open '%s'", optarg);
+                       die_errno("Could not open '%s'", path);
                options->close_file = 1;
                return argcount;
        } else
@@ -5079,7 +5082,7 @@ size_t fill_textconv(struct userdiff_driver *driver,
 {
        size_t size;
 
-       if (!driver || !driver->textconv) {
+       if (!driver) {
                if (!DIFF_FILE_VALID(df)) {
                        *outbuf = "";
                        return 0;
@@ -5090,6 +5093,9 @@ size_t fill_textconv(struct userdiff_driver *driver,
                return df->size;
        }
 
+       if (!driver->textconv)
+               die("BUG: fill_textconv called with non-textconv driver");
+
        if (driver->textconv_cache && df->sha1_valid) {
                *outbuf = notes_cache_get(driver->textconv_cache, df->sha1,
                                          &size);
diff --git a/diff.h b/diff.h
index f7208ad103d4b81194e5b14e7e027a2d25388667..e7d68edaf9d4744ce3c48356e1835c5506d5322d 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -91,7 +91,7 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)
 #define DIFF_OPT_DIRSTAT_BY_LINE     (1 << 28)
 #define DIFF_OPT_FUNCCONTEXT         (1 << 29)
 #define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30)
-#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1 << 31)
+#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1U << 31)
 
 #define DIFF_OPT_TST(opts, flag)    ((opts)->flags & DIFF_OPT_##flag)
 #define DIFF_OPT_TOUCHED(opts, flag)    ((opts)->touched_flags & DIFF_OPT_##flag)
@@ -222,8 +222,8 @@ struct combine_diff_path {
        } parent[FLEX_ARRAY];
 };
 #define combine_diff_path_size(n, l) \
-       (sizeof(struct combine_diff_path) + \
-        sizeof(struct combine_diff_parent) * (n) + (l) + 1)
+       st_add4(sizeof(struct combine_diff_path), (l), 1, \
+               st_mult(sizeof(struct combine_diff_parent), (n)))
 
 extern void show_combined_diff(struct combine_diff_path *elem, int num_parent,
                              int dense, struct rev_info *);
@@ -268,7 +268,7 @@ extern int parse_long_opt(const char *opt, const char **argv,
 extern int git_diff_basic_config(const char *var, const char *value, void *cb);
 extern int git_diff_ui_config(const char *var, const char *value, void *cb);
 extern void diff_setup(struct diff_options *);
-extern int diff_opt_parse(struct diff_options *, const char **, int);
+extern int diff_opt_parse(struct diff_options *, const char **, int, const char *);
 extern void diff_setup_done(struct diff_options *);
 
 #define DIFF_DETECT_RENAME     1
@@ -345,14 +345,30 @@ extern int diff_flush_patch_id(struct diff_options *, unsigned char *);
 
 extern int diff_result_code(struct diff_options *, int);
 
-extern void diff_no_index(struct rev_info *, int, const char **, const char *);
+extern void diff_no_index(struct rev_info *, int, const char **);
 
 extern int index_differs_from(const char *def, int diff_flags);
 
+/*
+ * Fill the contents of the filespec "df", respecting any textconv defined by
+ * its userdiff driver.  The "driver" parameter must come from a
+ * previous call to get_textconv(), and therefore should either be NULL or have
+ * textconv enabled.
+ *
+ * Note that the memory ownership of the resulting buffer depends on whether
+ * the driver field is NULL. If it is, then the memory belongs to the filespec
+ * struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer
+ * that should be freed by the caller.
+ */
 extern size_t fill_textconv(struct userdiff_driver *driver,
                            struct diff_filespec *df,
                            char **outbuf);
 
+/*
+ * Look up the userdiff driver for the given filespec, and return it if
+ * and only if it has textconv enabled (otherwise return NULL). The result
+ * can be passed to fill_textconv().
+ */
 extern struct userdiff_driver *get_textconv(struct diff_filespec *one);
 
 extern int parse_rename_score(const char **cp_p);
index 7cf431d261f9a35679ead7c8acda15aecdb8720d..4159748a70ccc0ddee7cf2fcf82976629dfa6867 100644 (file)
@@ -53,7 +53,8 @@ static struct spanhash_top *spanhash_rehash(struct spanhash_top *orig)
        int osz = 1 << orig->alloc_log2;
        int sz = osz << 1;
 
-       new = xmalloc(sizeof(*orig) + sizeof(struct spanhash) * sz);
+       new = xmalloc(st_add(sizeof(*orig),
+                            st_mult(sizeof(struct spanhash), sz)));
        new->alloc_log2 = orig->alloc_log2 + 1;
        new->free = INITIAL_FREE(new->alloc_log2);
        memset(new->data, 0, sizeof(struct spanhash) * sz);
@@ -130,7 +131,8 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one)
        int is_text = !diff_filespec_is_binary(one);
 
        i = INITIAL_HASH_SIZE;
-       hash = xmalloc(sizeof(*hash) + sizeof(struct spanhash) * (1<<i));
+       hash = xmalloc(st_add(sizeof(*hash),
+                             st_mult(sizeof(struct spanhash), 1<<i)));
        hash->alloc_log2 = i;
        hash->free = INITIAL_FREE(i);
        memset(hash->data, 0, sizeof(struct spanhash) * (1<<i));
index 97dd3d0095723c194288db0da1b9cfbf400e7e26..69d41f7a5781a10e43cf0e74f20be85a0d1fc5be 100644 (file)
@@ -52,7 +52,7 @@ static void prepare_order(const char *orderfile)
                }
                if (pass == 0) {
                        order_cnt = cnt;
-                       order = xmalloc(sizeof(*order) * cnt);
+                       ALLOC_ARRAY(order, cnt);
                }
        }
 }
@@ -120,7 +120,7 @@ void diffcore_order(const char *orderfile)
        if (!q->nr)
                return;
 
-       o = xmalloc(sizeof(*o) * q->nr);
+       ALLOC_ARRAY(o, q->nr);
        for (i = 0; i < q->nr; i++)
                o[i].obj = q->queue[i];
        order_objects(orderfile, pair_pathtwo, o, q->nr);
index af1fe08861e6862985ac8fb9311b17568cb9e547..3b3c1ed535e7c8b17947d69dbe0bd5c8f115cf2d 100644 (file)
@@ -537,7 +537,7 @@ void diffcore_rename(struct diff_options *options)
                                rename_dst_nr * rename_src_nr, 50, 1);
        }
 
-       mx = xcalloc(num_create * NUM_CANDIDATE_PER_DST, sizeof(*mx));
+       mx = xcalloc(st_mult(num_create, NUM_CANDIDATE_PER_DST), sizeof(*mx));
        for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
                struct diff_filespec *two = rename_dst[i].two;
                struct diff_score *m;
diff --git a/dir.c b/dir.c
index d2a8f06b0243bda92c04f57d96c0b18838ee7dce..3087b7eb2e8f6fa8f3b3fb16310f621e80db301e 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -503,12 +503,7 @@ void add_exclude(const char *string, const char *base,
 
        parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
        if (flags & EXC_FLAG_MUSTBEDIR) {
-               char *s;
-               x = xmalloc(sizeof(*x) + patternlen + 1);
-               s = (char *)(x+1);
-               memcpy(s, string, patternlen);
-               s[patternlen] = '\0';
-               x->pattern = s;
+               FLEXPTR_ALLOC_MEM(x, pattern, string, patternlen);
        } else {
                x = xmalloc(sizeof(*x));
                x->pattern = string;
@@ -564,9 +559,7 @@ void clear_exclude_list(struct exclude_list *el)
        free(el->excludes);
        free(el->filebuf);
 
-       el->nr = 0;
-       el->excludes = NULL;
-       el->filebuf = NULL;
+       memset(el, 0, sizeof(*el));
 }
 
 static void trim_trailing_spaces(char *buf)
@@ -627,10 +620,7 @@ static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
        }
 
        uc->dir_created++;
-       d = xmalloc(sizeof(*d) + len + 1);
-       memset(d, 0, sizeof(*d));
-       memcpy(d->name, name, len);
-       d->name[len] = '\0';
+       FLEX_ALLOC_MEM(d, name, name, len);
 
        ALLOC_GROW(dir->dirs, dir->dirs_nr + 1, dir->dirs_alloc);
        memmove(dir->dirs + first + 1, dir->dirs + first,
@@ -699,7 +689,7 @@ static int add_excludes(const char *fname, const char *base, int baselen,
                        return 0;
                }
                if (buf[size-1] != '\n') {
-                       buf = xrealloc(buf, size+1);
+                       buf = xrealloc(buf, st_add(size, 1));
                        buf[size++] = '\n';
                }
        } else {
@@ -713,7 +703,7 @@ static int add_excludes(const char *fname, const char *base, int baselen,
                        close(fd);
                        return 0;
                }
-               buf = xmalloc(size+1);
+               buf = xmallocz(size);
                if (read_in_full(fd, buf, size) != size) {
                        free(buf);
                        close(fd);
@@ -882,25 +872,6 @@ int match_pathname(const char *pathname, int pathlen,
                 */
                if (!patternlen && !namelen)
                        return 1;
-               /*
-                * This can happen when we ignore some exclude rules
-                * on directories in other to see if negative rules
-                * may match. E.g.
-                *
-                * /abc
-                * !/abc/def/ghi
-                *
-                * The pattern of interest is "/abc". On the first
-                * try, we should match path "abc" with this pattern
-                * in the "if" statement right above, but the caller
-                * ignores it.
-                *
-                * On the second try with paths within "abc",
-                * e.g. "abc/xyz", we come here and try to match it
-                * with "/abc".
-                */
-               if (!patternlen && namelen && *name == '/')
-                       return 1;
        }
 
        return fnmatch_icase_mem(pattern, patternlen,
@@ -908,48 +879,6 @@ int match_pathname(const char *pathname, int pathlen,
                                 WM_PATHNAME) == 0;
 }
 
-/*
- * Return non-zero if pathname is a directory and an ancestor of the
- * literal path in a (negative) pattern. This is used to keep
- * descending in "foo" and "foo/bar" when the pattern is
- * "!foo/bar/.gitignore". "foo/notbar" will not be descended however.
- */
-static int match_neg_path(const char *pathname, int pathlen, int *dtype,
-                         const char *base, int baselen,
-                         const char *pattern, int prefix, int patternlen,
-                         int flags)
-{
-       assert((flags & EXC_FLAG_NEGATIVE) && !(flags & EXC_FLAG_NODIR));
-
-       if (*dtype == DT_UNKNOWN)
-               *dtype = get_dtype(NULL, pathname, pathlen);
-       if (*dtype != DT_DIR)
-               return 0;
-
-       if (*pattern == '/') {
-               pattern++;
-               patternlen--;
-               prefix--;
-       }
-
-       if (baselen) {
-               if (((pathlen < baselen && base[pathlen] == '/') ||
-                    pathlen == baselen) &&
-                   !strncmp_icase(pathname, base, pathlen))
-                       return 1;
-               pathname += baselen + 1;
-               pathlen  -= baselen + 1;
-       }
-
-
-       if (prefix &&
-           ((pathlen < prefix && pattern[pathlen] == '/') &&
-            !strncmp_icase(pathname, pattern, pathlen)))
-               return 1;
-
-       return 0;
-}
-
 /*
  * Scan the given exclude list in reverse to see whether pathname
  * should be ignored.  The first match (i.e. the last on the list), if
@@ -963,7 +892,7 @@ static struct exclude *last_exclude_matching_from_list(const char *pathname,
                                                       struct exclude_list *el)
 {
        struct exclude *exc = NULL; /* undecided */
-       int i, matched_negative_path = 0;
+       int i;
 
        if (!el->nr)
                return NULL;    /* undefined */
@@ -998,18 +927,7 @@ static struct exclude *last_exclude_matching_from_list(const char *pathname,
                        exc = x;
                        break;
                }
-
-               if ((x->flags & EXC_FLAG_NEGATIVE) && !matched_negative_path &&
-                   match_neg_path(pathname, pathlen, dtype, x->base,
-                                  x->baselen ? x->baselen - 1 : 0,
-                                  exclude, prefix, x->patternlen, x->flags))
-                       matched_negative_path = 1;
-       }
-       if (exc &&
-           !(exc->flags & EXC_FLAG_NEGATIVE) &&
-           !(exc->flags & EXC_FLAG_NODIR) &&
-           matched_negative_path)
-               exc = NULL;
+       }
        return exc;
 }
 
@@ -1241,10 +1159,8 @@ static struct dir_entry *dir_entry_new(const char *pathname, int len)
 {
        struct dir_entry *ent;
 
-       ent = xmalloc(sizeof(*ent) + len + 1);
+       FLEX_ALLOC_MEM(ent, name, pathname, len);
        ent->len = len;
-       memcpy(ent->name, pathname, len);
-       ent->name[len] = 0;
        return ent;
 }
 
@@ -2408,16 +2324,15 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra
        struct ondisk_untracked_cache *ouc;
        struct write_data wd;
        unsigned char varbuf[16];
-       int len = 0, varint_len;
-       if (untracked->exclude_per_dir)
-               len = strlen(untracked->exclude_per_dir);
-       ouc = xmalloc(sizeof(*ouc) + len + 1);
+       int varint_len;
+       size_t len = strlen(untracked->exclude_per_dir);
+
+       FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len);
        stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
        stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
        hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.sha1);
        hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.sha1);
        ouc->dir_flags = htonl(untracked->dir_flags);
-       memcpy(ouc->exclude_per_dir, untracked->exclude_per_dir, len + 1);
 
        varint_len = encode_varint(untracked->ident.len, varbuf);
        strbuf_add(out, varbuf, varint_len);
@@ -2522,21 +2437,21 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
        ud.untracked_alloc = value;
        ud.untracked_nr    = value;
        if (ud.untracked_nr)
-               ud.untracked = xmalloc(sizeof(*ud.untracked) * ud.untracked_nr);
+               ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
        data = next;
 
        next = data;
        ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
        if (next > end)
                return -1;
-       ud.dirs = xmalloc(sizeof(*ud.dirs) * ud.dirs_nr);
+       ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
        data = next;
 
        len = strlen((const char *)data);
        next = data + len + 1;
        if (next > rd->end)
                return -1;
-       *untracked_ = untracked = xmalloc(sizeof(*untracked) + len);
+       *untracked_ = untracked = xmalloc(st_add(sizeof(*untracked), len));
        memcpy(untracked, &ud, sizeof(ud));
        memcpy(untracked->name, data, len + 1);
        data = next;
@@ -2649,7 +2564,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long
        rd.data       = next;
        rd.end        = end;
        rd.index      = 0;
-       rd.ucd        = xmalloc(sizeof(*rd.ucd) * len);
+       ALLOC_ARRAY(rd.ucd, len);
 
        if (read_one_dir(&uc->root, &rd) || rd.index != len)
                goto done;
diff --git a/entry.c b/entry.c
index 582c40071a3034af9a391cf438dd74ddb34e15ff..a4109574fa72e0f3f32ad7b9e1ed0e402c8aecff 100644 (file)
--- a/entry.c
+++ b/entry.c
@@ -6,7 +6,7 @@
 static void create_directories(const char *path, int path_len,
                               const struct checkout *state)
 {
-       char *buf = xmalloc(path_len + 1);
+       char *buf = xmallocz(path_len);
        int len = 0;
 
        while (len < path_len) {
index 2da7fe2e06ff38b977209d44b7404c93358430af..1cc4aab4eacb629f8fe147c2e20b53c4141587aa 100644 (file)
@@ -235,8 +235,6 @@ void set_git_work_tree(const char *new_work_tree)
        }
        git_work_tree_initialized = 1;
        work_tree = xstrdup(real_path(new_work_tree));
-       if (setenv(GIT_WORK_TREE_ENVIRONMENT, work_tree, 1))
-               die("could not set GIT_WORK_TREE to '%s'", work_tree);
 }
 
 const char *get_git_work_tree(void)
index 47ad6747c415372da89fa7c88dd8ce03b2765676..7103ceefbff6768042161345565bb773ab6b8d30 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-#include "git-compat-util.h"
+#include "cache.h"
 #include "ewok.h"
 
 #define EWAH_MASK(x) ((eword_t)1 << (x % BITS_IN_EWORD))
@@ -25,8 +25,8 @@
 
 struct bitmap *bitmap_new(void)
 {
-       struct bitmap *bitmap = ewah_malloc(sizeof(struct bitmap));
-       bitmap->words = ewah_calloc(32, sizeof(eword_t));
+       struct bitmap *bitmap = xmalloc(sizeof(struct bitmap));
+       bitmap->words = xcalloc(32, sizeof(eword_t));
        bitmap->word_alloc = 32;
        return bitmap;
 }
@@ -38,9 +38,7 @@ void bitmap_set(struct bitmap *self, size_t pos)
        if (block >= self->word_alloc) {
                size_t old_size = self->word_alloc;
                self->word_alloc = block * 2;
-               self->words = ewah_realloc(self->words,
-                       self->word_alloc * sizeof(eword_t));
-
+               REALLOC_ARRAY(self->words, self->word_alloc);
                memset(self->words + old_size, 0x0,
                        (self->word_alloc - old_size) * sizeof(eword_t));
        }
@@ -100,12 +98,7 @@ struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah)
        ewah_iterator_init(&it, ewah);
 
        while (ewah_iterator_next(&blowup, &it)) {
-               if (i >= bitmap->word_alloc) {
-                       bitmap->word_alloc *= 1.5;
-                       bitmap->words = ewah_realloc(
-                               bitmap->words, bitmap->word_alloc * sizeof(eword_t));
-               }
-
+               ALLOC_GROW(bitmap->words, i + 1, bitmap->word_alloc);
                bitmap->words[i++] = blowup;
        }
 
@@ -134,8 +127,7 @@ void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other)
 
        if (self->word_alloc < other_final) {
                self->word_alloc = other_final;
-               self->words = ewah_realloc(self->words,
-                       self->word_alloc * sizeof(eword_t));
+               REALLOC_ARRAY(self->words, self->word_alloc);
                memset(self->words + original_size, 0x0,
                        (self->word_alloc - original_size) * sizeof(eword_t));
        }
index b522437c0a0b1ba4906feadeb734542ec941b49a..2dc9c82ecf513ed721f290926f042b9f592221c2 100644 (file)
@@ -39,8 +39,7 @@ static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
                return;
 
        self->alloc_size = new_size;
-       self->buffer = ewah_realloc(self->buffer,
-               self->alloc_size * sizeof(eword_t));
+       REALLOC_ARRAY(self->buffer, self->alloc_size);
        self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
 }
 
@@ -282,12 +281,9 @@ struct ewah_bitmap *ewah_new(void)
 {
        struct ewah_bitmap *self;
 
-       self = ewah_malloc(sizeof(struct ewah_bitmap));
-       if (self == NULL)
-               return NULL;
-
-       self->buffer = ewah_malloc(32 * sizeof(eword_t));
+       self = xmalloc(sizeof(struct ewah_bitmap));
        self->alloc_size = 32;
+       ALLOC_ARRAY(self->buffer, self->alloc_size);
 
        ewah_clear(self);
        return self;
index 43481b9c60c8afe30d6916650dd0e765065715c9..61f6a43579f5e3fc98e562fe6f0c6d8c118e0ded 100644 (file)
@@ -134,11 +134,7 @@ int ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len)
        self->buffer_size = self->alloc_size = get_be32(ptr);
        ptr += sizeof(uint32_t);
 
-       self->buffer = ewah_realloc(self->buffer,
-               self->alloc_size * sizeof(eword_t));
-
-       if (!self->buffer)
-               return -1;
+       REALLOC_ARRAY(self->buffer, self->alloc_size);
 
        /*
         * Copy the raw data for the bitmap as a whole chunk;
@@ -180,11 +176,7 @@ int ewah_deserialize(struct ewah_bitmap *self, int fd)
                return -1;
 
        self->buffer_size = self->alloc_size = (size_t)ntohl(word_count);
-       self->buffer = ewah_realloc(self->buffer,
-               self->alloc_size * sizeof(eword_t));
-
-       if (!self->buffer)
-               return -1;
+       REALLOC_ARRAY(self->buffer, self->alloc_size);
 
        /** 64 bit x N -- compressed words */
        buffer = self->buffer;
index 6e2c5e1e3d4475b31ba3c556b31b9d5d72e26d59..269a1a87063af0d89ab4b7569f0193e08bd98bf3 100644 (file)
 #ifndef __EWOK_BITMAP_H__
 #define __EWOK_BITMAP_H__
 
-#ifndef ewah_malloc
-#      define ewah_malloc xmalloc
-#endif
-#ifndef ewah_realloc
-#      define ewah_realloc xrealloc
-#endif
-#ifndef ewah_calloc
-#      define ewah_calloc xcalloc
-#endif
-
 struct strbuf;
 typedef uint64_t eword_t;
 #define BITS_IN_EWORD (sizeof(eword_t) * 8)
index e85f0fd8d897f4823a7c765d6b6ef929a15ca679..cf442a97f86aea7accc673d3fe55b9b7494dbf78 100644 (file)
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "exec_cmd.h"
 #include "quote.h"
+#include "argv-array.h"
 #define MAX_ARGS       32
 
 static const char *argv_exec_path;
@@ -107,32 +108,25 @@ void setup_path(void)
        strbuf_release(&new_path);
 }
 
-const char **prepare_git_cmd(const char **argv)
+const char **prepare_git_cmd(struct argv_array *out, const char **argv)
 {
-       int argc;
-       const char **nargv;
-
-       for (argc = 0; argv[argc]; argc++)
-               ; /* just counting */
-       nargv = xmalloc(sizeof(*nargv) * (argc + 2));
-
-       nargv[0] = "git";
-       for (argc = 0; argv[argc]; argc++)
-               nargv[argc + 1] = argv[argc];
-       nargv[argc + 1] = NULL;
-       return nargv;
+       argv_array_push(out, "git");
+       argv_array_pushv(out, argv);
+       return out->argv;
 }
 
 int execv_git_cmd(const char **argv) {
-       const char **nargv = prepare_git_cmd(argv);
-       trace_argv_printf(nargv, "trace: exec:");
+       struct argv_array nargv = ARGV_ARRAY_INIT;
+
+       prepare_git_cmd(&nargv, argv);
+       trace_argv_printf(nargv.argv, "trace: exec:");
 
        /* execvp() can only ever return if it fails */
-       sane_execvp("git", (char **)nargv);
+       sane_execvp("git", (char **)nargv.argv);
 
        trace_printf("trace: exec failed: %s\n", strerror(errno));
 
-       free(nargv);
+       argv_array_clear(&nargv);
        return -1;
 }
 
index 93b0c02529a854af4ccb648ea0d0571c5495b63a..1f6b43378ba3866c07578b2222154e3a760440d1 100644 (file)
@@ -1,11 +1,13 @@
 #ifndef GIT_EXEC_CMD_H
 #define GIT_EXEC_CMD_H
 
+struct argv_array;
+
 extern void git_set_argv_exec_path(const char *exec_path);
 extern const char *git_extract_argv0_path(const char *path);
 extern const char *git_exec_path(void);
 extern void setup_path(void);
-extern const char **prepare_git_cmd(const char **argv);
+extern const char **prepare_git_cmd(struct argv_array *out, const char **argv);
 extern int execv_git_cmd(const char **argv); /* NULL terminated */
 LAST_ARG_MUST_BE_NULL
 extern int execl_git_cmd(const char *cmd, ...);
index 3c65edb5c44e1fa57beef851d56a9674a5be1b72..75f77480a2d3829f1f01f4df44d6a0cc5f4f7030 100644 (file)
@@ -622,7 +622,7 @@ static void *pool_alloc(size_t len)
                        return xmalloc(len);
                }
                total_allocd += sizeof(struct mem_pool) + mem_pool_alloc;
-               p = xmalloc(sizeof(struct mem_pool) + mem_pool_alloc);
+               p = xmalloc(st_add(sizeof(struct mem_pool), mem_pool_alloc));
                p->next_pool = mem_pool;
                p->next_free = (char *) p->space;
                p->end = p->next_free + mem_pool_alloc;
@@ -814,7 +814,8 @@ static struct tree_entry *new_tree_entry(void)
        if (!avail_tree_entry) {
                unsigned int n = tree_entry_alloc;
                total_allocd += n * sizeof(struct tree_entry);
-               avail_tree_entry = e = xmalloc(n * sizeof(struct tree_entry));
+               ALLOC_ARRAY(e, n);
+               avail_tree_entry = e;
                while (n-- > 1) {
                        *((void**)e) = e + 1;
                        e++;
@@ -864,15 +865,12 @@ static void start_packfile(void)
 {
        static char tmp_file[PATH_MAX];
        struct packed_git *p;
-       int namelen;
        struct pack_header hdr;
        int pack_fd;
 
        pack_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
                              "pack/tmp_pack_XXXXXX");
-       namelen = strlen(tmp_file) + 2;
-       p = xcalloc(1, sizeof(*p) + namelen);
-       xsnprintf(p->pack_name, namelen, "%s", tmp_file);
+       FLEX_ALLOC_STR(p, pack_name, tmp_file);
        p->pack_fd = pack_fd;
        p->do_not_close = 1;
        pack_file = sha1fd(pack_fd, p->pack_name);
@@ -898,7 +896,7 @@ static const char *create_index(void)
        struct object_entry_pool *o;
 
        /* Build the table of object IDs. */
-       idx = xmalloc(object_count * sizeof(*idx));
+       ALLOC_ARRAY(idx, object_count);
        c = idx;
        for (o = blocks; o; o = o->next_pool)
                for (e = o->next_free; e-- != o->entries;)
index 01e34b689b975799610eabc15fc9138990706ff8..f96f6dfb35afb419ac38fcec9b4013fbf0e6d36d 100644 (file)
@@ -15,6 +15,7 @@
 #include "version.h"
 #include "prio-queue.h"
 #include "sha1-array.h"
+#include "sigchain.h"
 
 static int transfer_unpack_limit = -1;
 static int fetch_unpack_limit = -1;
@@ -671,9 +672,12 @@ static int everything_local(struct fetch_pack_args *args,
 static int sideband_demux(int in, int out, void *data)
 {
        int *xd = data;
+       int ret;
 
-       int ret = recv_sideband("fetch-pack", xd[0], out);
+       sigchain_push(SIGPIPE, SIG_IGN);
+       ret = recv_sideband("fetch-pack", xd[0], out);
        close(out);
+       sigchain_pop(SIGPIPE);
        return ret;
 }
 
diff --git a/fsck.c b/fsck.c
index c637f6676b639beb90240e4667ed07ceb83cdbf8..ca4c68537788496dea803b559e2ffd4cf1dbeea7 100644 (file)
--- a/fsck.c
+++ b/fsck.c
@@ -199,7 +199,8 @@ void fsck_set_msg_type(struct fsck_options *options,
 
        if (!options->msg_type) {
                int i;
-               int *msg_type = xmalloc(sizeof(int) * FSCK_MSG_MAX);
+               int *msg_type;
+               ALLOC_ARRAY(msg_type, FSCK_MSG_MAX);
                for (i = 0; i < FSCK_MSG_MAX; i++)
                        msg_type[i] = fsck_msg_type(i, options);
                options->msg_type = msg_type;
index 2da0a75a380da198bd65fe3d9b0c95ef98a0b4aa..1459f9b87e9d939af3460d3461ad4ec805e1ef29 100644 (file)
 #define unsigned_add_overflows(a, b) \
     ((b) > maximum_unsigned_value_of_type(a) - (a))
 
+/*
+ * Returns true if the multiplication of "a" and "b" will
+ * overflow. The types of "a" and "b" must match and must be unsigned.
+ * Note that this macro evaluates "a" twice!
+ */
+#define unsigned_mult_overflows(a, b) \
+    ((a) && (b) > maximum_unsigned_value_of_type(a) / (a))
+
 #ifdef __GNUC__
 #define TYPEOF(x) (__typeof__(x))
 #else
@@ -253,6 +261,8 @@ struct itimerval {
 #else
 #define basename gitbasename
 extern char *gitbasename(char *);
+#define dirname gitdirname
+extern char *gitdirname(char *);
 #endif
 
 #ifndef NO_ICONV
@@ -335,6 +345,14 @@ static inline int git_has_dos_drive_prefix(const char *path)
 #define has_dos_drive_prefix git_has_dos_drive_prefix
 #endif
 
+#ifndef skip_dos_drive_prefix
+static inline int git_skip_dos_drive_prefix(char **path)
+{
+       return 0;
+}
+#define skip_dos_drive_prefix git_skip_dos_drive_prefix
+#endif
+
 #ifndef is_dir_sep
 static inline int git_is_dir_sep(int c)
 {
@@ -663,7 +681,6 @@ extern int git_vsnprintf(char *str, size_t maxsize,
 #ifdef __GLIBC_PREREQ
 #if __GLIBC_PREREQ(2, 1)
 #define HAVE_STRCHRNUL
-#define HAVE_MEMPCPY
 #endif
 #endif
 
@@ -677,14 +694,6 @@ static inline char *gitstrchrnul(const char *s, int c)
 }
 #endif
 
-#ifndef HAVE_MEMPCPY
-#define mempcpy gitmempcpy
-static inline void *gitmempcpy(void *dest, const void *src, size_t n)
-{
-       return (char *)memcpy(dest, src, n) + n;
-}
-#endif
-
 #ifdef NO_INET_PTON
 int inet_pton(int af, const char *src, void *dst);
 #endif
@@ -703,6 +712,32 @@ extern void release_pack_memory(size_t);
 typedef void (*try_to_free_t)(size_t);
 extern try_to_free_t set_try_to_free_routine(try_to_free_t);
 
+static inline size_t st_add(size_t a, size_t b)
+{
+       if (unsigned_add_overflows(a, b))
+               die("size_t overflow: %"PRIuMAX" + %"PRIuMAX,
+                   (uintmax_t)a, (uintmax_t)b);
+       return a + b;
+}
+#define st_add3(a,b,c)   st_add((a),st_add((b),(c)))
+#define st_add4(a,b,c,d) st_add((a),st_add3((b),(c),(d)))
+
+static inline size_t st_mult(size_t a, size_t b)
+{
+       if (unsigned_mult_overflows(a, b))
+               die("size_t overflow: %"PRIuMAX" * %"PRIuMAX,
+                   (uintmax_t)a, (uintmax_t)b);
+       return a * b;
+}
+
+static inline size_t st_sub(size_t a, size_t b)
+{
+       if (a < b)
+               die("size_t underflow: %"PRIuMAX" - %"PRIuMAX,
+                   (uintmax_t)a, (uintmax_t)b);
+       return a - b;
+}
+
 #ifdef HAVE_ALLOCA_H
 # include <alloca.h>
 # define xalloca(size)      (alloca(size))
@@ -733,8 +768,72 @@ extern int xmkstemp_mode(char *template, int mode);
 extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
 extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
 extern char *xgetcwd(void);
+extern FILE *fopen_for_writing(const char *path);
+
+#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
+#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
 
-#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
+/*
+ * These functions help you allocate structs with flex arrays, and copy
+ * the data directly into the array. For example, if you had:
+ *
+ *   struct foo {
+ *     int bar;
+ *     char name[FLEX_ARRAY];
+ *   };
+ *
+ * you can do:
+ *
+ *   struct foo *f;
+ *   FLEX_ALLOC_MEM(f, name, src, len);
+ *
+ * to allocate a "foo" with the contents of "src" in the "name" field.
+ * The resulting struct is automatically zero'd, and the flex-array field
+ * is NUL-terminated (whether the incoming src buffer was or not).
+ *
+ * The FLEXPTR_* variants operate on structs that don't use flex-arrays,
+ * but do want to store a pointer to some extra data in the same allocated
+ * block. For example, if you have:
+ *
+ *   struct foo {
+ *     char *name;
+ *     int bar;
+ *   };
+ *
+ * you can do:
+ *
+ *   struct foo *f;
+ *   FLEX_ALLOC_STR(f, name, src);
+ *
+ * and "name" will point to a block of memory after the struct, which will be
+ * freed along with the struct (but the pointer can be repointed anywhere).
+ *
+ * The *_STR variants accept a string parameter rather than a ptr/len
+ * combination.
+ *
+ * Note that these macros will evaluate the first parameter multiple
+ * times, and it must be assignable as an lvalue.
+ */
+#define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \
+       (x) = NULL; /* silence -Wuninitialized for offset calculation */ \
+       (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \
+} while (0)
+#define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \
+       (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \
+       (x)->ptrname = (void *)((x)+1); \
+} while(0)
+#define FLEX_ALLOC_STR(x, flexname, str) \
+       FLEX_ALLOC_MEM((x), flexname, (str), strlen(str))
+#define FLEXPTR_ALLOC_STR(x, ptrname, str) \
+       FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str))
+
+static inline void *xalloc_flex(size_t base_len, size_t offset,
+                               const void *src, size_t src_len)
+{
+       unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1));
+       memcpy(ret + offset, src, src_len);
+       return ret;
+}
 
 static inline char *xstrdup_or_null(const char *str)
 {
index 95e69b19a70ba63f2055d6a2ec3f9af0092a0832..02c0445be1057619e01e56bd6792f78fc011dc42 100755 (executable)
@@ -2664,7 +2664,7 @@ sub argsfromdir
     #   co  # Obtain list directly.
     #   remove # HERE: TEST: MAYBE client does the recursion for us,
     #          # since it only makes sense to remove stuff already in
-    #          # the sandobx?
+    #          # the sandbox?
     #   ci # HERE: Similar to remove...
     #      # Don't try to implement the confusing/weird
     #      # ci -r bug er.."feature".
index 98f1779cf3241fa12300fbf3dc0c4eff8ab10b61..86b2ff1e07614846465109dcb4b9afed11013839 100755 (executable)
@@ -404,7 +404,7 @@ while read commit parents; do
        then
                tree=$(git write-tree)
        else
-               tree="$commit^{tree}"
+               tree=$(git rev-parse "$commit^{tree}")
        fi
        workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \
                "$tree" $parentstr < ../message > ../map/$commit ||
index cdc02af517c9d77a081d7918480f8d0a2c6a29d0..424b034e34b4b40e7c44da16ddf83a31dee6f6a0 100755 (executable)
@@ -120,8 +120,7 @@ case "${1:-.}${2:-.}${3:-.}" in
        case "$1" in
        '')
                echo "Added $4 in both, but differently."
-               orig=$(git-unpack-file $2)
-               create_virtual_base "$orig" "$src2"
+               orig=$(git-unpack-file e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
                ;;
        *)
                echo "Auto-merging $4"
index af7ba5fd90c3000892ed31893e1812514e4f3773..cf60c4390870ef28cff08b6a173a435d41e2d470 100755 (executable)
@@ -176,7 +176,7 @@ You can run "git stash pop" or "git stash drop" at any time.
 
 finish_rebase () {
        apply_autostash &&
-       git gc --auto &&
+       { git gc --auto || true; } &&
        rm -rf "$state_dir"
 }
 
index 6caa5b563fafb09cee5eb8f35283e7b9fa967439..d356901348042a7f2ec67211857e4d551d169d52 100755 (executable)
@@ -524,8 +524,13 @@ sub parse_sendmail_aliases {
                if (/^\s*alias\s+(?:-group\s+\S+\s+)*(\S+)\s+(.*)$/) {
                        my ($alias, $addr) = ($1, $2);
                        $addr =~ s/#.*$//; # mutt allows # comments
-                        # commas delimit multiple addresses
-                       $aliases{$alias} = [ split_addrs($addr) ];
+                       # commas delimit multiple addresses
+                       my @addr = split_addrs($addr);
+
+                       # quotes may be escaped in the file,
+                       # unescape them so we do not double-escape them later.
+                       s/\\"/"/g foreach @addr;
+                       $aliases{$alias} = \@addr
                }}},
        mailrc => sub { my $fh = shift; while (<$fh>) {
                if (/^alias\s+(\S+)\s+(.*)$/) {
diff --git a/git.c b/git.c
index 6ed824cacfccddcb01104835b45ab934ff3f443e..e61a59c0145af8d24575e11d38ff91910b2cae8a 100644 (file)
--- a/git.c
+++ b/git.c
@@ -239,19 +239,15 @@ static int handle_alias(int *argcp, const char ***argv)
        alias_string = alias_lookup(alias_command);
        if (alias_string) {
                if (alias_string[0] == '!') {
-                       const char **alias_argv;
-                       int argc = *argcp, i;
+                       struct child_process child = CHILD_PROCESS_INIT;
 
                        commit_pager_choice();
 
-                       /* build alias_argv */
-                       alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1));
-                       alias_argv[0] = alias_string + 1;
-                       for (i = 1; i < argc; ++i)
-                               alias_argv[i] = (*argv)[i];
-                       alias_argv[argc] = NULL;
+                       child.use_shell = 1;
+                       argv_array_push(&child.args, alias_string + 1);
+                       argv_array_pushv(&child.args, (*argv) + 1);
 
-                       ret = run_command_v_opt(alias_argv, RUN_USING_SHELL);
+                       ret = run_command(&child);
                        if (ret >= 0)   /* normal exit */
                                exit(ret);
 
index 7a5b23acf2155fb4e39dcb2f20944362cfbe0ac7..05d7910b7cdbd6fea7c835491caa774a46e4b7f8 100755 (executable)
@@ -7576,7 +7576,7 @@ sub git_object {
                        git_cmd(), 'cat-file', '-t', $object_id) . ' 2> /dev/null'
                        or die_error(404, "Object does not exist");
                $type = <$fd>;
-               chomp $type;
+               defined $type && chomp $type;
                close $fd
                        or die_error(404, "Object does not exist");
 
diff --git a/graph.c b/graph.c
index c25a09a8fdaf3e90bf7e029c78127146418ab023..1350bdde3be4346e8bc2038c57e4883d0ab12b25 100644 (file)
--- a/graph.c
+++ b/graph.c
@@ -234,12 +234,10 @@ struct git_graph *graph_init(struct rev_info *opt)
         * We'll automatically grow columns later if we need more room.
         */
        graph->column_capacity = 30;
-       graph->columns = xmalloc(sizeof(struct column) *
-                                graph->column_capacity);
-       graph->new_columns = xmalloc(sizeof(struct column) *
-                                    graph->column_capacity);
-       graph->mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity);
-       graph->new_mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity);
+       ALLOC_ARRAY(graph->columns, graph->column_capacity);
+       ALLOC_ARRAY(graph->new_columns, graph->column_capacity);
+       ALLOC_ARRAY(graph->mapping, 2 * graph->column_capacity);
+       ALLOC_ARRAY(graph->new_mapping, 2 * graph->column_capacity);
 
        /*
         * The diff output prefix callback, with this we can make
diff --git a/grep.c b/grep.c
index 7b2b96a4376efe51e41f9311c6fa5250a2dcd13d..528b652f713d2b6db5f48e3829448212cc3837bf 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -1741,7 +1741,7 @@ static int grep_source_load_file(struct grep_source *gs)
        i = open(filename, O_RDONLY);
        if (i < 0)
                goto err_ret;
-       data = xmalloc(size + 1);
+       data = xmallocz(size);
        if (st.st_size != read_in_full(i, data, size)) {
                error(_("'%s': short read %s"), filename, strerror(errno));
                close(i);
@@ -1749,7 +1749,6 @@ static int grep_source_load_file(struct grep_source *gs)
                return -1;
        }
        close(i);
-       data[size] = 0;
 
        gs->buf = data;
        gs->size = size;
index f693839cb4786fd5be57d878b58499273ec17f81..b10b642229ca0c3e6eb27142f080921dd5c3aece 100644 (file)
--- a/hashmap.c
+++ b/hashmap.c
@@ -256,10 +256,9 @@ const void *memintern(const void *data, size_t len)
        e = hashmap_get(&map, &key, data);
        if (!e) {
                /* not found: create it */
-               e = xmallocz(sizeof(struct pool_entry) + len);
+               FLEX_ALLOC_MEM(e, data, data, len);
                hashmap_entry_init(e, key.ent.hash);
                e->len = len;
-               memcpy(e->data, data, len);
                hashmap_add(&map, e);
        }
        return e->data;
diff --git a/help.c b/help.c
index d996b340669a66d0b1619472fedf5c11b940d7c5..19328ea992299d2b66b1b8de8a4a609a4d25388b 100644 (file)
--- a/help.c
+++ b/help.c
 
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 {
-       struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1);
-
+       struct cmdname *ent;
+       FLEX_ALLOC_MEM(ent, name, name, len);
        ent->len = len;
-       memcpy(ent->name, name, len);
-       ent->name[len] = 0;
 
        ALLOC_GROW(cmds->names, cmds->cnt + 1, cmds->alloc);
        cmds->names[cmds->cnt++] = ent;
index 4d3b7737a99de02c42945951e91b4d7ed865611d..2c52027c84455819740bed9f53970e175b9ca133 100644 (file)
@@ -892,12 +892,11 @@ static char *cram(const char *challenge_64, const char *user, const char *pass)
        response = xstrfmt("%s %s", user, hex);
        resp_len = strlen(response) + 1;
 
-       response_64 = xmalloc(ENCODED_SIZE(resp_len) + 1);
+       response_64 = xmallocz(ENCODED_SIZE(resp_len));
        encoded_len = EVP_EncodeBlock((unsigned char *)response_64,
                                      (unsigned char *)response, resp_len);
        if (encoded_len < 0)
                die("EVP_EncodeBlock error");
-       response_64[encoded_len] = '\0';
        return (char *)response_64;
 }
 
@@ -1188,7 +1187,7 @@ static void lf_to_crlf(struct strbuf *msg)
                j++;
        }
 
-       new = xmalloc(j + 1);
+       new = xmallocz(j);
 
        /*
         * Second pass: write the new string.  Note that this loop is
diff --git a/khash.h b/khash.h
index 376475a5eaf80585311ab518d03c229a7a49a7ed..c0da40daa78f703f825208bb7d1b4b5b3cc05ae3 100644 (file)
--- a/khash.h
+++ b/khash.h
@@ -117,7 +117,7 @@ static const double __ac_HASH_UPPER = 0.77;
                        if (new_n_buckets < 4) new_n_buckets = 4;                                       \
                        if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \
                        else { /* hash table size to be changed (shrink or expand); rehash */ \
-                               new_flags = (khint32_t*)xmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
+                               ALLOC_ARRAY(new_flags, __ac_fsize(new_n_buckets)); \
                                if (!new_flags) return -1;                                                              \
                                memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
                                if (h->n_buckets < new_n_buckets) {     /* expand */            \
index fc281597fd2fd5ad2299eab0848da99355e383fc..d2632690d5107b53ee8a7ac4832cd85eb8c7bfc1 100644 (file)
@@ -42,11 +42,13 @@ int levenshtein(const char *string1, const char *string2,
                int w, int s, int a, int d)
 {
        int len1 = strlen(string1), len2 = strlen(string2);
-       int *row0 = xmalloc(sizeof(int) * (len2 + 1));
-       int *row1 = xmalloc(sizeof(int) * (len2 + 1));
-       int *row2 = xmalloc(sizeof(int) * (len2 + 1));
+       int *row0, *row1, *row2;
        int i, j;
 
+       ALLOC_ARRAY(row0, len2 + 1);
+       ALLOC_ARRAY(row1, len2 + 1);
+       ALLOC_ARRAY(row2, len2 + 1);
+
        for (j = 0; j <= len2; j++)
                row1[j] = j * a;
        for (i = 0; i < len1; i++) {
index af6e2f799ec7e2447ee888854442a7cbfe7644e4..bbe31ed6fbb7c103c739f7e9a3c45cde5d36fcec 100644 (file)
@@ -14,6 +14,7 @@
 #include "graph.h"
 #include "userdiff.h"
 #include "line-log.h"
+#include "argv-array.h"
 
 static void range_set_grow(struct range_set *rs, size_t extra)
 {
@@ -521,7 +522,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines,
        if (diff_populate_filespec(spec, 0))
                die("Cannot read blob %s", sha1_to_hex(spec->sha1));
 
-       ends = xmalloc(size * sizeof(*ends));
+       ALLOC_ARRAY(ends, size);
        ends[cur++] = 0;
        data = spec->data;
        while (num < spec->size) {
@@ -746,22 +747,17 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list
        add_line_range(rev, commit, range);
 
        if (!rev->diffopt.detect_rename) {
-               int i, count = 0;
-               struct line_log_data *r = range;
+               struct line_log_data *r;
+               struct argv_array array = ARGV_ARRAY_INIT;
                const char **paths;
-               while (r) {
-                       count++;
-                       r = r->next;
-               }
-               paths = xmalloc((count+1)*sizeof(char *));
-               r = range;
-               for (i = 0; i < count; i++) {
-                       paths[i] = xstrdup(r->path);
-                       r = r->next;
-               }
-               paths[count] = NULL;
+
+               for (r = range; r; r = r->next)
+                       argv_array_push(&array, r->path);
+               paths = argv_array_detach(&array);
+
                parse_pathspec(&rev->diffopt.pathspec, 0,
                               PATHSPEC_PREFER_FULL, "", paths);
+               /* strings are now owned by pathspec */
                free(paths);
        }
 }
@@ -1146,9 +1142,9 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm
        if (nparents > 1 && rev->first_parent_only)
                nparents = 1;
 
-       diffqueues = xmalloc(nparents * sizeof(*diffqueues));
-       cand = xmalloc(nparents * sizeof(*cand));
-       parents = xmalloc(nparents * sizeof(*parents));
+       ALLOC_ARRAY(diffqueues, nparents);
+       ALLOC_ARRAY(cand, nparents);
+       ALLOC_ARRAY(parents, nparents);
 
        p = commit->parents;
        for (i = 0; i < nparents; i++) {
index 0338630fc2a5378ed33afa828db4940b34aabe82..ff4a43a982a6a67ec826fdb01153a9e35e720751 100644 (file)
@@ -205,7 +205,7 @@ static int ll_ext_merge(const struct ll_merge_driver *fn,
        if (fstat(fd, &st))
                goto close_bad;
        result->size = st.st_size;
-       result->ptr = xmalloc(result->size + 1);
+       result->ptr = xmallocz(result->size);
        if (read_in_full(fd, result->ptr, result->size) != result->size) {
                free(result->ptr);
                result->ptr = NULL;
index f70a30e12702fa68c77f6b2490692f3861ad32e7..60f983934d5ea2c8e276d2c493d78caf56e9a39a 100644 (file)
@@ -77,9 +77,8 @@ int parse_decorate_color_config(const char *var, const char *slot_name, const ch
 
 void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
 {
-       int nlen = strlen(name);
-       struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1);
-       memcpy(res->name, name, nlen + 1);
+       struct name_decoration *res;
+       FLEX_ALLOC_STR(res, name, name);
        res->type = type;
        res->next = add_decoration(&name_decoration, obj, res);
 }
index ddca601c77fcab7d9d68362ce5c4f252ab7ccf51..9b6eac22e4256d8f2bf82961b6e4f320d89fdeba 100644 (file)
@@ -48,40 +48,6 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our
        return res.ptr;
 }
 
-static int common_outf(void *priv_, mmbuffer_t *mb, int nbuf)
-{
-       int i;
-       mmfile_t *dst = priv_;
-
-       for (i = 0; i < nbuf; i++) {
-               memcpy(dst->ptr + dst->size, mb[i].ptr, mb[i].size);
-               dst->size += mb[i].size;
-       }
-       return 0;
-}
-
-static int generate_common_file(mmfile_t *res, mmfile_t *f1, mmfile_t *f2)
-{
-       unsigned long size = f1->size < f2->size ? f1->size : f2->size;
-       void *ptr = xmalloc(size);
-       xpparam_t xpp;
-       xdemitconf_t xecfg;
-       xdemitcb_t ecb;
-
-       memset(&xpp, 0, sizeof(xpp));
-       xpp.flags = 0;
-       memset(&xecfg, 0, sizeof(xecfg));
-       xecfg.ctxlen = 3;
-       xecfg.flags = XDL_EMIT_COMMON;
-       ecb.outf = common_outf;
-
-       res->ptr = ptr;
-       res->size = 0;
-
-       ecb.priv = res;
-       return xdi_diff(f1, f2, &xpp, &xecfg, &ecb);
-}
-
 void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct blob *their, unsigned long *size)
 {
        void *res = NULL;
@@ -112,8 +78,8 @@ void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct
                if (fill_mmfile_blob(&common, base) < 0)
                        goto out_free_f2_f1;
        } else {
-               if (generate_common_file(&common, &f1, &f2) < 0)
-                       goto out_free_f2_f1;
+               common.ptr = xstrdup("");
+               common.size = 0;
        }
        res = three_way_filemerge(path, &common, &f1, &f2, size);
        free_mmfile(&common);
index 1ddfbfcd782d3b8d0e479cb0c5e29abce86e63c9..74ea6d54793f62188cd88e93f1adfe74c5957dda 100644 (file)
@@ -9,8 +9,8 @@ merge_cmd () {
        gvimdiff|vimdiff)
                if $base_present
                then
-                       "$merge_tool_path" -f -d -c 'wincmd J' \
-                               "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
+                       "$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \
+                               "$LOCAL" "$BASE" "$REMOTE" "$MERGED"
                else
                        "$merge_tool_path" -f -d -c 'wincmd l' \
                                "$LOCAL" "$MERGED" "$REMOTE"
index 332ba956e7edec6c6fbe10f346ec08fc469b846f..6d9f23e932559c58c9ebf4679a6035889f726ed2 100644 (file)
@@ -55,10 +55,9 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate,
        dir = find_dir_entry(istate, ce->name, namelen);
        if (!dir) {
                /* not found, create it and add to hash table */
-               dir = xcalloc(1, sizeof(struct dir_entry) + namelen + 1);
+               FLEX_ALLOC_MEM(dir, name, ce->name, namelen);
                hashmap_entry_init(dir, memihash(ce->name, namelen));
                dir->namelen = namelen;
-               strncpy(dir->name, ce->name, namelen);
                hashmap_add(&istate->dir_hash, dir);
 
                /* recursively add missing parent directories */
diff --git a/notes.c b/notes.c
index db77922130b4f7df6ab72122206a76d6c580faac..8b59ccdb1166dfc413035e2699f3eb1dc9bd853e 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -1032,7 +1032,7 @@ struct notes_tree **load_notes_trees(struct string_list *refs)
        struct string_list_item *item;
        int counter = 0;
        struct notes_tree **trees;
-       trees = xmalloc((refs->nr+1) * sizeof(struct notes_tree *));
+       ALLOC_ARRAY(trees, refs->nr + 1);
        for_each_string_list_item(item, refs) {
                struct notes_tree *t = xcalloc(1, sizeof(struct notes_tree));
                init_notes(t, item->string, combine_notes_ignore, 0);
index 433bd86ccd5c38ff5a4993be4e1463946aead59d..1da89a41cec9e605fc3fdfa8efaaf2489e501c88 100644 (file)
@@ -89,7 +89,7 @@ static int verify_packfile(struct packed_git *p,
         * we do not do scan-streaming check on the pack file.
         */
        nr_objects = p->num_objects;
-       entries = xmalloc((nr_objects + 1) * sizeof(*entries));
+       ALLOC_ARRAY(entries, nr_objects + 1);
        entries[nr_objects].offset = pack_sig_ofs;
        /* first sort entries by pack offset, since unpacking them is more efficient that way */
        for (i = 0; i < nr_objects; i++) {
index e542ea7703a740916f8d2cac9176674782d37f61..f6a3613bebe4ae8d398ab3b0ada22ba81b1339ee 100644 (file)
@@ -83,10 +83,14 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
         * keep track of them with alias pointers, always sorting from "from"
         * to "to".
         */
-       struct revindex_entry *tmp = xmalloc(n * sizeof(*tmp));
-       struct revindex_entry *from = entries, *to = tmp;
+       struct revindex_entry *tmp, *from, *to;
        int bits;
-       unsigned *pos = xmalloc(BUCKETS * sizeof(*pos));
+       unsigned *pos;
+
+       ALLOC_ARRAY(pos, BUCKETS);
+       ALLOC_ARRAY(tmp, n);
+       from = entries;
+       to = tmp;
 
        /*
         * If (max >> bits) is zero, then we know that the radix digit we are
@@ -161,7 +165,7 @@ static void create_pack_revindex(struct pack_revindex *rix)
        unsigned i;
        const char *index = p->index_data;
 
-       rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1));
+       ALLOC_ARRAY(rix->revindex, num_ent + 1);
        index += 4 * 256;
 
        if (p->index_version > 1) {
diff --git a/pager.c b/pager.c
index e425070528f4f9fbf0953c9056d1ea43686e176f..4bc048148e043eabf1315bbcbae8ea4c6363b330 100644 (file)
--- a/pager.c
+++ b/pager.c
@@ -11,7 +11,6 @@
  * something different on Windows.
  */
 
-static const char *pager_argv[] = { NULL, NULL };
 static struct child_process pager_process = CHILD_PROCESS_INIT;
 
 static void wait_for_pager(int in_signal)
@@ -64,6 +63,16 @@ const char *git_pager(int stdout_is_tty)
        return pager;
 }
 
+void prepare_pager_args(struct child_process *pager_process, const char *pager)
+{
+       argv_array_push(&pager_process->args, pager);
+       pager_process->use_shell = 1;
+       if (!getenv("LESS"))
+               argv_array_push(&pager_process->env_array, "LESS=FRX");
+       if (!getenv("LV"))
+               argv_array_push(&pager_process->env_array, "LV=-c");
+}
+
 void setup_pager(void)
 {
        const char *pager = git_pager(isatty(1));
@@ -80,14 +89,8 @@ void setup_pager(void)
        setenv("GIT_PAGER_IN_USE", "true", 1);
 
        /* spawn the pager */
-       pager_argv[0] = pager;
-       pager_process.use_shell = 1;
-       pager_process.argv = pager_argv;
+       prepare_pager_args(&pager_process, pager);
        pager_process.in = -1;
-       if (!getenv("LESS"))
-               argv_array_push(&pager_process.env_array, "LESS=FRX");
-       if (!getenv("LV"))
-               argv_array_push(&pager_process.env_array, "LV=-c");
        argv_array_push(&pager_process.env_array, "GIT_PAGER_IN_USE");
        if (start_command(&pager_process))
                return;
diff --git a/path.c b/path.c
index 3cd155e27dddee6774d48522945c0615f6207d8c..8b7e16812927645367c4912e88d2a5f3065efb85 100644 (file)
--- a/path.c
+++ b/path.c
@@ -782,13 +782,10 @@ const char *relative_path(const char *in, const char *prefix,
        else if (!prefix_len)
                return in;
 
-       if (have_same_root(in, prefix)) {
+       if (have_same_root(in, prefix))
                /* bypass dos_drive, for "c:" is identical to "C:" */
-               if (has_dos_drive_prefix(in)) {
-                       i = 2;
-                       j = 2;
-               }
-       } else {
+               i = j = has_dos_drive_prefix(in);
+       else {
                return in;
        }
 
@@ -943,11 +940,10 @@ const char *remove_leading_path(const char *in, const char *prefix)
 int normalize_path_copy_len(char *dst, const char *src, int *prefix_len)
 {
        char *dst0;
+       int i;
 
-       if (has_dos_drive_prefix(src)) {
+       for (i = has_dos_drive_prefix(src); i > 0; i--)
                *dst++ = *src++;
-               *dst++ = *src++;
-       }
        dst0 = dst;
 
        if (is_dir_sep(*src)) {
index 9304ee33d75ab9de14e4a7b6dc96f5dd8028c464..c9e9b6c0778c755fcade1430cf674dfd867050f1 100644 (file)
@@ -406,7 +406,8 @@ void parse_pathspec(struct pathspec *pathspec,
                n++;
 
        pathspec->nr = n;
-       pathspec->items = item = xmalloc(sizeof(*item) * n);
+       ALLOC_ARRAY(pathspec->items, n);
+       item = pathspec->items;
        pathspec->_raw = argv;
        prefixlen = prefix ? strlen(prefix) : 0;
 
@@ -483,7 +484,7 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
 void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
        *dst = *src;
-       dst->items = xmalloc(sizeof(struct pathspec_item) * dst->nr);
+       ALLOC_ARRAY(dst->items, dst->nr);
        memcpy(dst->items, src->items,
               sizeof(struct pathspec_item) * dst->nr);
 }
index 4a499fcb38daf4ab8d3e20ca0fa10e5732e684a9..e7646968011234c09e1565577357a7678c015762 100644 (file)
@@ -81,7 +81,6 @@ sub prepare_config_once {
        SVN::_Core::svn_config_ensure($config_dir, undef);
        my ($baton, $callbacks) = SVN::Core::auth_open_helper(_auth_providers);
        my $config = SVN::Core::config_get_config($config_dir);
-       my $dont_store_passwords = 1;
        my $conf_t = $config->{'config'};
 
        no warnings 'once';
@@ -93,9 +92,14 @@ sub prepare_config_once {
            $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
            $SVN::_Core::SVN_CONFIG_OPTION_STORE_PASSWORDS,
            1) == 0) {
+               my $val = '1';
+               if (::compare_svn_version('1.9.0') < 0) { # pre-SVN r1553823
+                       my $dont_store_passwords = 1;
+                       $val = bless \$dont_store_passwords, "_p_void";
+               }
                SVN::_Core::svn_auth_set_parameter($baton,
                    $SVN::_Core::SVN_AUTH_PARAM_DONT_STORE_PASSWORDS,
-                   bless (\$dont_store_passwords, "_p_void"));
+                   $val);
        }
        if (SVN::_Core::svn_config_get_bool($conf_t,
            $SVN::_Core::SVN_CONFIG_SECTION_AUTH,
index 5e1f7e0b50a3ed8fe8393d01ea48dbec946a8a68..df12b5819c9824c3e24eb696d836bb1370f63083 100644 (file)
--- a/po/TEAMS
+++ b/po/TEAMS
@@ -32,6 +32,10 @@ Repository:  https://github.com/quizzlo/git-po-it/
 Leader:                Marco Paolone <marcopaolone AT gmail.com>
 Members:       Stefano Lattarini <stefano.lattarini AT gmail.com>
 
+Language:      ko (Korean)
+Repository:    https://github.com/changwoo/git-l10n-ko/
+Leader:                Changwoo Ryu <cwryu@debian.org>
+
 Language:      pt_PT (Portuguese - Portugal)
 Repository:    https://github.com/marcomsousa/git-l10n-pt_PT/
 Leader:                Marco Sousa <marcomsousa AT gmail.com>
diff --git a/po/ko.po b/po/ko.po
new file mode 100644 (file)
index 0000000..8ec0eac
--- /dev/null
+++ b/po/ko.po
@@ -0,0 +1,11859 @@
+# Git Korean translation
+# Copyright (C) 2015-2016 Changwoo Ryu and contributors
+# This file is distributed under the same license as the Git package.
+#
+# Contributors:
+#  Hyunjun Kim <yoloseem AT users.noreply.github.com>, 2015.
+#  Changwoo Ryu <cwryu@debian.org>, 2015-2016.
+#
+# - 작업자는 위 Contributors 목록에 추가해 주세요.
+# - 번역하면서 80컬럼을 넘어가지 않도록 해 주세요.
+#   - 가능한한 원문이 1줄이면 1줄에 들어가게 하고, 부득이하면 경우에 따라
+#     알맞게 줄바꿈합니다. (커맨드라인이면 줄바꿈하고 다음 줄에 탭 2개)
+# - 용어는 일관성을 지켜 주십시오.
+#   - 용어가 바뀌어야 한다고 생각하면 그렇게 번역하기 전에 충분히 의견 교환을
+#     하십시오.
+# - 일반적인 문장에서 영어 단어를 그대로 쓰지 않습니다. 최소한 음역합니다.
+#   - 예외적으로 명령어 등 문자 그대로 가리키는 경우에만 원문 그대로 씁니다.
+#     - 예: 업스트림 추적에 'origin' 대신 <이름>을 사용합니다
+#   - 번역된 용어가 깃 명령어와 연관되는 경우에는 괄호 안에 씁니다.
+#     - 예: 되돌리기(revert)가 진행 중입니다
+# - 용어:
+#  +--------------+----------------------------------------------+
+#  | 3-way merge  | 3-방향 병합                                  |
+#  | author       | 작성자                                       |
+#  | bisect       | 이등분                                       |
+#  | blob         | 블롭                                         |
+#  | bundle       | 번들                                         |
+#  | branch       | 브랜치                                       |
+#  | cherry-pick  | (커밋) 빼오기                                |
+#  | commit       | 커밋                                         |
+#  | commit-ish   | 커밋-따위                                    |
+#  | committer    | 커미터                                       |
+#  | conflict     | 충돌                                         |
+#  | fast-forward | 정방향 진행                                  |
+#  | head         | 헤드                                         |
+#  | hook         | 훅                                           |
+#  | history      | (커밋) 내역                                  |
+#  | Git          | 깃                                           |
+#  | log          | 기록                                         |
+#  | merge        | 병합                                         |
+#  | note         | 노트                                         |
+#  | pack         | 묶음                                         |
+#  | pathspec     | 경로명세                                     |
+#  | rebase       | 리베이스                                     |
+#  | ref          | 레퍼런스                                     |
+#  | repo         | 저장소                                       |
+#  | remote       | 리모트 (저장소)                              |
+#  | reset        | 재지정                                       |
+#  | revert       | 되돌리기                                     |
+#  | subcommand   | 하위 명령                                    |
+#  | submodule    | 하위 모듈                                    |
+#  | tree-ish     | 트리-따위                                    |
+#  | working tree | 작업 폴더                                    |
+#  +--------------+----------------------------------------------+
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: git\n"
+"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
+"POT-Creation-Date: 2015-12-22 22:50+0800\n"
+"PO-Revision-Date: 2016-01-03 18:50+0900\n"
+"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
+"Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-"
+"ko>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: advice.c:55
+#, c-format
+msgid "hint: %.*s\n"
+msgstr "힌트: %.*s\n"
+
+#: advice.c:88
+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 ""
+"작업 폴더에서 문제를 바로잡은 다음, 'git add/rm <파일>'을 적절히\n"
+"사용해 해결 표시하고 커밋하십시오."
+
+#: advice.c:101 builtin/merge.c:1225
+msgid "You have not concluded your merge (MERGE_HEAD exists)."
+msgstr "병합 작업을 다 마치지 않았습니다 (MERGE_HEAD 파일이 있습니다)."
+
+#: advice.c:103
+msgid "Please, commit your changes before merging."
+msgstr "병합하기 전에 변경 사항을 커밋하십시오."
+
+#: advice.c:104
+msgid "Exiting because of unfinished merge."
+msgstr "병합을 마치지 못했기 때문에 끝납니다."
+
+#: archive.c:12
+msgid "git archive [<options>] <tree-ish> [<path>...]"
+msgstr "git archive [<옵션>] <트리-따위> [<경로>...]"
+
+#: archive.c:13
+msgid "git archive --list"
+msgstr "git archive --list"
+
+#: archive.c:14
+msgid ""
+"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
+msgstr ""
+"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로"
+">...]"
+
+#: archive.c:15
+msgid "git archive --remote <repo> [--exec <cmd>] --list"
+msgstr "git archive --remote <저장소> [--exec <명령>] --list"
+
+#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327
+#, c-format
+msgid "pathspec '%s' did not match any files"
+msgstr "'%s' 경로명세가 어떤 파일과도 일치하지 않습니다"
+
+#: archive.c:429
+msgid "fmt"
+msgstr "형식"
+
+#: archive.c:429
+msgid "archive format"
+msgstr "압축 형식"
+
+#: archive.c:430 builtin/log.c:1229
+msgid "prefix"
+msgstr "접두어"
+
+#: archive.c:431
+msgid "prepend prefix to each pathname in the archive"
+msgstr "아카이브의 각 경로 이름의 앞에 지정한 경로를 붙입니다"
+
+#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536
+#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989
+#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446
+#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558
+#: builtin/read-tree.c:109 parse-options.h:153
+msgid "file"
+msgstr "파일"
+
+#: archive.c:433 builtin/archive.c:89
+msgid "write the archive to this file"
+msgstr "아카이브를 이 파일에 씁니다"
+
+#: archive.c:435
+msgid "read .gitattributes in working directory"
+msgstr "작업 폴더의 .gitattributes를 읽습니다"
+
+#: archive.c:436
+msgid "report archived files on stderr"
+msgstr "아카이브에 포함된 파일을 표준오류로 표시합니다"
+
+#: archive.c:437
+msgid "store only"
+msgstr "저장만 하기"
+
+#: archive.c:438
+msgid "compress faster"
+msgstr "더 빠르게 압축"
+
+#: archive.c:446
+msgid "compress better"
+msgstr "더 작게 압축"
+
+#: archive.c:449
+msgid "list supported archive formats"
+msgstr "지원하는 압축 형식의 목록을 표시합니다"
+
+#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77
+msgid "repo"
+msgstr "저장소"
+
+#: archive.c:452 builtin/archive.c:91
+msgid "retrieve the archive from remote repository <repo>"
+msgstr "원격 저장소 <저장소>에서 아카이브를 가져옵니다"
+
+#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479
+msgid "command"
+msgstr "명령"
+
+#: archive.c:454 builtin/archive.c:93
+msgid "path to the remote git-upload-archive command"
+msgstr "원격 git-upload-archive 명령의 경로"
+
+#: attr.c:265
+msgid ""
+"Negative patterns are ignored in git attributes\n"
+"Use '\\!' for literal leading exclamation."
+msgstr ""
+"git attributes에서 반대 패턴은 무시됩니다.\n"
+"앞에 느낌표를 쓰려면 '\\!'를 사용하십시오."
+
+#: branch.c:61
+#, c-format
+msgid "Not setting branch %s as its own upstream."
+msgstr "%s 브랜치를 자신의 업스트림으로 지정하지 않음."
+
+#: branch.c:84
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었"
+"습니다."
+
+#: branch.c:85
+#, c-format
+msgid "Branch %s set up to track remote branch %s from %s."
+msgstr "%s 브랜치가 리모트의 %s 브랜치를 (%s에서) 따라가도록 설정되었습니다."
+
+#: branch.c:89
+#, c-format
+msgid "Branch %s set up to track local branch %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 브랜치를 따라가도록 설정되었습니다."
+
+#: branch.c:90
+#, c-format
+msgid "Branch %s set up to track local branch %s."
+msgstr "%s 브랜치가 %s 브랜치를 따라가도록 설정되었습니다."
+
+#: branch.c:95
+#, c-format
+msgid "Branch %s set up to track remote ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:96
+#, c-format
+msgid "Branch %s set up to track remote ref %s."
+msgstr "%s 브랜치가 리모트의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:100
+#, c-format
+msgid "Branch %s set up to track local ref %s by rebasing."
+msgstr ""
+"%s 브랜치가 리베이스를 통해 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:101
+#, c-format
+msgid "Branch %s set up to track local ref %s."
+msgstr "%s 브랜치가 로컬의 %s 레퍼런스를 따라가도록 설정되었습니다."
+
+#: branch.c:134
+#, c-format
+msgid "Not tracking: ambiguous information for ref %s"
+msgstr "따라가지 않음: %s 레퍼런스에 대해 애매한 정보"
+
+#: branch.c:163
+#, c-format
+msgid "'%s' is not a valid branch name."
+msgstr "'%s'은(는) 올바른 브랜치 이름이 아닙니다."
+
+#: branch.c:168
+#, c-format
+msgid "A branch named '%s' already exists."
+msgstr "이름이 '%s'인 브랜치가 이미 있습니다."
+
+#: branch.c:176
+msgid "Cannot force update the current branch."
+msgstr "현재 브랜치를 강제로 업데이트할 수 없습니다."
+
+#: branch.c:196
+#, c-format
+msgid "Cannot setup tracking information; starting point '%s' is not a branch."
+msgstr ""
+"따라가기 정보를 설정할 수 없습니다. 시작 위치 '%s'이(가) 브랜치가 아닙니다."
+
+#: branch.c:198
+#, c-format
+msgid "the requested upstream branch '%s' does not exist"
+msgstr "요청한 업스트림 '%s' 브랜치가 없습니다"
+
+#: branch.c:200
+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 ""
+"\n"
+"리모트에 이미 있는 업스트림 브랜치를 기반으로 작업하려면,\n"
+"먼저 \"git fetch\"로 가져 리모트 브랜치를 가져옵니다.\n"
+"\n"
+"새 로컬 브랜치를 거기에 해당하는 리모트 브랜치로 push하려면,\n"
+"\"git push -u\"로 push하는 업스트림을 설정할 수 있습니다."
+
+#: branch.c:244
+#, c-format
+msgid "Not a valid object name: '%s'."
+msgstr "올바른 오브젝트 이름이 아닙니다: '%s'."
+
+#: branch.c:264
+#, c-format
+msgid "Ambiguous object name: '%s'."
+msgstr "애매한 오브젝트 이름: '%s'."
+
+#: branch.c:269
+#, c-format
+msgid "Not a valid branch point: '%s'."
+msgstr "올바른 브랜치 위치가 아닙니다: '%s'."
+
+#: branch.c:322
+#, c-format
+msgid "'%s' is already checked out at '%s'"
+msgstr "'%s'은(는) 이미 '%s' 위치에 받아져 있습니다"
+
+#: bundle.c:34
+#, c-format
+msgid "'%s' does not look like a v2 bundle file"
+msgstr "'%s' 파일이 버전2 번들 파일로 보이지 않습니다"
+
+#: bundle.c:61
+#, c-format
+msgid "unrecognized header: %s%s (%d)"
+msgstr "인식할 수 없는 헤더: %s%s (%d)"
+
+#: bundle.c:87 builtin/commit.c:766
+#, c-format
+msgid "could not open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
+
+#: bundle.c:139
+msgid "Repository lacks these prerequisite commits:"
+msgstr "저장소에 필수적인 다음 커밋이 없습니다:"
+
+#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083
+#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334
+#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358
+#: builtin/shortlog.c:158
+msgid "revision walk setup failed"
+msgstr "리비전 walk 준비가 실패했습니다"
+
+#: bundle.c:185
+#, c-format
+msgid "The bundle contains this ref:"
+msgid_plural "The bundle contains these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 있습니다:"
+
+#: bundle.c:192
+msgid "The bundle records a complete history."
+msgstr "번들은 전체 커밋 내역을 기록합니다."
+
+#: bundle.c:194
+#, c-format
+msgid "The bundle requires this ref:"
+msgid_plural "The bundle requires these %d refs:"
+msgstr[0] "번들에 다음 레퍼런스 %d개가 필요합니다:"
+
+#: bundle.c:253
+msgid "Could not spawn pack-objects"
+msgstr "pack-objects 명령을 실행할 수 없습니다"
+
+#: bundle.c:264
+msgid "pack-objects died"
+msgstr "pack-objects 명령이 죽었습니다"
+
+#: bundle.c:304
+msgid "rev-list died"
+msgstr "rev-list 명령이 죽었습니다"
+
+#: bundle.c:353
+#, c-format
+msgid "ref '%s' is excluded by the rev-list options"
+msgstr "rev-list 옵션에서 '%s' 레퍼런스가 제외되었습니다"
+
+#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261
+#, c-format
+msgid "unrecognized argument: %s"
+msgstr "알 수 없는 인자: %s"
+
+#: bundle.c:449
+msgid "Refusing to create empty bundle."
+msgstr "빈 번들은 만들지 않습니다."
+
+#: bundle.c:459
+#, c-format
+msgid "cannot create '%s'"
+msgstr "'%s'을(를) 만들 수 없습니다"
+
+#: bundle.c:480
+msgid "index-pack died"
+msgstr "index-pack 명령이 죽었습니다"
+
+#: color.c:275
+#, c-format
+msgid "invalid color value: %.*s"
+msgstr "잘못된 색 값: %.*s"
+
+#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520
+#: builtin/am.c:2149
+#, c-format
+msgid "could not parse %s"
+msgstr "parse %s을(를) 파싱할 수 없습니다"
+
+#: commit.c:42
+#, c-format
+msgid "%s %s is not a commit!"
+msgstr "%s %s, 커밋이 아닙니다"
+
+#: compat/obstack.c:406 compat/obstack.c:408
+msgid "memory exhausted"
+msgstr "메모리 바닥남"
+
+#: config.c:474 config.c:476
+#, c-format
+msgid "bad config file line %d in %s"
+msgstr "%2$s 파일 %1$d번 줄에 잘못된 설정"
+
+#: config.c:592
+#, c-format
+msgid "bad numeric config value '%s' for '%s' in %s: %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s', %s 파일): %s"
+
+#: config.c:594
+#, c-format
+msgid "bad numeric config value '%s' for '%s': %s"
+msgstr "잘못된 수치 설정 값 '%s' (키 '%s'): %s"
+
+#: config.c:679
+#, c-format
+msgid "failed to expand user dir in: '%s'"
+msgstr "다음에 사용자 디렉터리 확장에 실패: '%s'"
+
+#: config.c:757 config.c:768
+#, c-format
+msgid "bad zlib compression level %d"
+msgstr "%d번은 올바른 zlib 압축 단계가 아닙니다"
+
+#: config.c:890
+#, c-format
+msgid "invalid mode for object creation: %s"
+msgstr "오브젝트 생성 모드가 올바르지 않습니다: %s"
+
+#: config.c:1216
+msgid "unable to parse command-line config"
+msgstr "명령행 설정을 파싱할 수 없습니다"
+
+#: config.c:1277
+msgid "unknown error occured while reading the configuration files"
+msgstr "설정 파일을 읽는 중 알 수 없는 오류가 생겼습니다"
+
+#: config.c:1601
+#, c-format
+msgid "unable to parse '%s' from command-line config"
+msgstr "명령행 설정에서 '%s'을(를) 설정할 수 없습니다"
+
+#: config.c:1603
+#, c-format
+msgid "bad config variable '%s' in file '%s' at line %d"
+msgstr "'%2$s' 파일의 %3$d번 줄 '%1$s' 설정 변수가 잘못되었습니다"
+
+#: config.c:1662
+#, c-format
+msgid "%s has multiple values"
+msgstr "%s은(는) 여러 개 값이 있습니다"
+
+#: connected.c:69
+msgid "Could not run 'git rev-list'"
+msgstr "'git rev-list'를 실행할 수 없습니다"
+
+#: connected.c:89
+#, c-format
+msgid "failed write to rev-list: %s"
+msgstr "rev-list 쓰기에 실패했습니다: %s"
+
+#: connected.c:97
+#, c-format
+msgid "failed to close rev-list's stdin: %s"
+msgstr "rev-list의 표준입력을 닫는데 실패했습니다: %s"
+
+#: date.c:95
+msgid "in the future"
+msgstr "미래에"
+
+#: date.c:101
+#, c-format
+msgid "%lu second ago"
+msgid_plural "%lu seconds ago"
+msgstr[0] "%lu초 전"
+
+#: date.c:108
+#, c-format
+msgid "%lu minute ago"
+msgid_plural "%lu minutes ago"
+msgstr[0] "%lu분 전"
+
+#: date.c:115
+#, c-format
+msgid "%lu hour ago"
+msgid_plural "%lu hours ago"
+msgstr[0] "%lu시간 전"
+
+#: date.c:122
+#, c-format
+msgid "%lu day ago"
+msgid_plural "%lu days ago"
+msgstr[0] "%lu일 전"
+
+#: date.c:128
+#, c-format
+msgid "%lu week ago"
+msgid_plural "%lu weeks ago"
+msgstr[0] "%lu주 전"
+
+#: date.c:135
+#, c-format
+msgid "%lu month ago"
+msgid_plural "%lu months ago"
+msgstr[0] "%lu달 전"
+
+#: date.c:146
+#, c-format
+msgid "%lu year"
+msgid_plural "%lu years"
+msgstr[0] "%lu년"
+
+#. TRANSLATORS: "%s" is "<n> years"
+#: date.c:149
+#, c-format
+msgid "%s, %lu month ago"
+msgid_plural "%s, %lu months ago"
+msgstr[0] "%s %lu달 전"
+
+#: date.c:154 date.c:159
+#, c-format
+msgid "%lu year ago"
+msgid_plural "%lu years ago"
+msgstr[0] "%lu년 전"
+
+#: diffcore-order.c:24
+#, c-format
+msgid "failed to read orderfile '%s'"
+msgstr "'%s' 순서 파일을 읽는데 실패했습니다"
+
+#: diffcore-rename.c:536
+msgid "Performing inexact rename detection"
+msgstr "부정확한 이름 바꾸기 탐색을 수행하는 중"
+
+#: diff.c:115
+#, c-format
+msgid "  Failed to parse dirstat cut-off percentage '%s'\n"
+msgstr "  dirstat 자름 퍼센트 값 '%s' 파싱에 실패했습니다\n"
+
+#: diff.c:120
+#, c-format
+msgid "  Unknown dirstat parameter '%s'\n"
+msgstr "  알 수 없는 dirstat 파라미터 '%s'\n"
+
+#: diff.c:215
+#, c-format
+msgid "Unknown value for 'diff.submodule' config variable: '%s'"
+msgstr "'diff.submodule' 설정 변수에 알 수 없는 값: '%s'"
+
+#: diff.c:267
+#, c-format
+msgid ""
+"Found errors in 'diff.dirstat' config variable:\n"
+"%s"
+msgstr ""
+"'diff.submodule' 설정 변수에 오류:\n"
+"%s'"
+
+#: diff.c:3000
+#, c-format
+msgid "external diff died, stopping at %s"
+msgstr "외부 diff 프로그램이 죽음, %s 위치에서 멈춤"
+
+#: diff.c:3396
+msgid "--follow requires exactly one pathspec"
+msgstr "--follow 옵션에는 정확히 하나의 경로명세가 필요합니다"
+
+#: diff.c:3559
+#, c-format
+msgid ""
+"Failed to parse --dirstat/-X option parameter:\n"
+"%s"
+msgstr ""
+"--dirstat/-X 옵션 파라미터를 파싱하는데 실패했습니다:\n"
+"%s"
+
+#: diff.c:3573
+#, c-format
+msgid "Failed to parse --submodule option parameter: '%s'"
+msgstr "--submodule 옵션 파라미터 파싱에 실패했습니다: '%s'"
+
+#: dir.c:1915
+msgid "failed to get kernel name and information"
+msgstr "커널 이름과 정보를 가져오는데 실패했습니다"
+
+#: dir.c:1998
+msgid "Untracked cache is disabled on this system."
+msgstr "이 시스템에서는 추적되지 않는 캐시를 사용하지 않습니다."
+
+#: gpg-interface.c:166 gpg-interface.c:237
+msgid "could not run gpg."
+msgstr "gpg를 실행할 수 없습니다."
+
+#: gpg-interface.c:178
+msgid "gpg did not accept the data"
+msgstr "gpg에서 데이터를 받아들이지 않습니다"
+
+#: gpg-interface.c:189
+msgid "gpg failed to sign the data"
+msgstr "gpg에서 데이터를 서명하는데 실패했습니다."
+
+#: gpg-interface.c:222
+#, c-format
+msgid "could not create temporary file '%s': %s"
+msgstr "임시 파일 '%s'을(를) 만들 수 없습니다: %s"
+
+#: gpg-interface.c:225
+#, c-format
+msgid "failed writing detached signature to '%s': %s"
+msgstr "분리된 서명을 '%s'에 쓰는데 실패했습니다: %s"
+
+#: grep.c:1718
+#, c-format
+msgid "'%s': unable to read %s"
+msgstr "'%s': %s을(를) 읽을 수 없습니다"
+
+#: grep.c:1735
+#, c-format
+msgid "'%s': %s"
+msgstr "'%s': %s"
+
+#: grep.c:1746
+#, c-format
+msgid "'%s': short read %s"
+msgstr "'%s': %s에서 읽다가 잘림"
+
+#: help.c:207
+#, c-format
+msgid "available git commands in '%s'"
+msgstr "'%s'에 있는 깃 명령"
+
+#: help.c:214
+msgid "git commands available from elsewhere on your $PATH"
+msgstr "다른 $PATH에 있는 깃 명령"
+
+#: help.c:246
+msgid "These are common Git commands used in various situations:"
+msgstr "다음은 여러가지 상황에서 자주 사용하는 깃 명령입니다:"
+
+#: help.c:311
+#, 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 ""
+"'%s'은(는) 깃 명령으로 보이지만, 실행할 수\n"
+"없습니다. 아마도 git-%s 망가진 것 같습니다."
+
+#: help.c:368
+msgid "Uh oh. Your system reports no Git commands at all."
+msgstr "어라라. 시스템에 깃 명령이 하나도 없다고 나옵니다."
+
+#: help.c:390
+#, c-format
+msgid ""
+"WARNING: You called a Git command named '%s', which does not exist.\n"
+"Continuing under the assumption that you meant '%s'"
+msgstr ""
+"경고: 이름이 '%s'인 깃 명령을 실행했지만, 그 명령이 없습니다.\n"
+"자동으로 '%s' 명령이라고 가정하고 계속합니다"
+
+#: help.c:395
+#, c-format
+msgid "in %0.1f seconds automatically..."
+msgstr "(%0.1f초 뒤에)..."
+
+#: help.c:402
+#, c-format
+msgid "git: '%s' is not a git command. See 'git --help'."
+msgstr "git: '%s'은(는) 깃 명령이 아닙니다. 'git --help'를 참고하십시오."
+
+#: help.c:406 help.c:466
+msgid ""
+"\n"
+"Did you mean this?"
+msgid_plural ""
+"\n"
+"Did you mean one of these?"
+msgstr[0] ""
+"\n"
+"다음을 의도하신 것 아니었나요?"
+
+#: help.c:462
+#, c-format
+msgid "%s: %s - %s"
+msgstr "%s: %s - %s"
+
+#: merge.c:41
+msgid "failed to read the cache"
+msgstr "캐시를 읽는데 실패했습니다"
+
+#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376
+#: builtin/checkout.c:587 builtin/clone.c:722
+msgid "unable to write new index file"
+msgstr "새 인덱스 파일을 쓸 수 없습니다"
+
+#: merge-recursive.c:189
+#, c-format
+msgid "(bad commit)\n"
+msgstr "(잘못된 커밋)\n"
+
+#: merge-recursive.c:209
+#, c-format
+msgid "addinfo_cache failed for path '%s'"
+msgstr "'%s' 경로에 대해 addinfo_cache가 실패했습니다"
+
+#: merge-recursive.c:270
+msgid "error building trees"
+msgstr "트리 빌드에 오류"
+
+#: merge-recursive.c:686
+#, c-format
+msgid "failed to create path '%s'%s"
+msgstr "'%s' 경로 만들기에 실패했습니다%s"
+
+#: merge-recursive.c:697
+#, c-format
+msgid "Removing %s to make room for subdirectory\n"
+msgstr "하위 디렉터리에 공간을 만드려고 %s을(를) 제거합니다\n"
+
+#: merge-recursive.c:711 merge-recursive.c:732
+msgid ": perhaps a D/F conflict?"
+msgstr ": 아마도 D/F 충돌?"
+
+#: merge-recursive.c:722
+#, c-format
+msgid "refusing to lose untracked file at '%s'"
+msgstr "'%s' 위치의 추적되지 않는 파일을 잃기를 거부합니다"
+
+#: merge-recursive.c:762
+#, c-format
+msgid "cannot read object %s '%s'"
+msgstr "%s '%s' 오브젝트를 읽을 수 없음"
+
+#: merge-recursive.c:764
+#, c-format
+msgid "blob expected for %s '%s'"
+msgstr "%s '%s'에 대해 블롭을 예상"
+
+#: merge-recursive.c:787 builtin/clone.c:369
+#, c-format
+msgid "failed to open '%s'"
+msgstr "'%s'을(를) 여는데 실패"
+
+#: merge-recursive.c:795
+#, c-format
+msgid "failed to symlink '%s'"
+msgstr "'%s' 심볼릭 링크에 실패"
+
+#: merge-recursive.c:798
+#, c-format
+msgid "do not know what to do with %06o %s '%s'"
+msgstr "다음을 어떻게 할지 알 수 없습니다: %06o %s '%s'"
+
+#: merge-recursive.c:936
+msgid "Failed to execute internal merge"
+msgstr "내부 병합 실행에 실패"
+
+#: merge-recursive.c:940
+#, c-format
+msgid "Unable to add %s to database"
+msgstr "%s을(를) 데이터베이스에 추가할 수 없습니다"
+
+#: merge-recursive.c:956
+msgid "unsupported object type in the tree"
+msgstr "트리에서 지원하지 않는 오브젝트 종류"
+
+#: merge-recursive.c:1031 merge-recursive.c:1045
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree."
+msgstr ""
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (%s에서) 삭제. %s 버전의 %s 트리에 남음."
+
+#: merge-recursive.c:1037 merge-recursive.c:1050
+#, c-format
+msgid ""
+"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
+"in tree at %s."
+msgstr ""
+"충돌! (%s/삭제): %s (위치 %s) 및 %s (위치 %s) 삭제. %s 버전의 %s 트리에 "
+"%s(으)로 남음."
+
+#: merge-recursive.c:1091
+msgid "rename"
+msgstr "이름바꾸기"
+
+#: merge-recursive.c:1091
+msgid "renamed"
+msgstr "이름바꿈"
+
+#: merge-recursive.c:1147
+#, c-format
+msgid "%s is a directory in %s adding as %s instead"
+msgstr "%s은(는) %s에 있는 디렉터리로 %s(으)로 이름을 바꿉니다"
+
+#: merge-recursive.c:1169
+#, c-format
+msgid ""
+"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
+"\"->\"%s\" in \"%s\"%s"
+msgstr ""
+"충돌! (이름바꾸기/이름바꾸기): \"%3$s\" 브랜치에서 이름바꾸기 \"%1$s\"->"
+"\"%2$s\" \"%6$s\" 브랜치에서 이름 바꾸기 \"%4$s\"->\"%5$s\"%7$s"
+
+#: merge-recursive.c:1174
+msgid " (left unresolved)"
+msgstr " (해결되지 않음)"
+
+#: merge-recursive.c:1228
+#, c-format
+msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
+msgstr ""
+"충돌! (rename/rename): 이름 바꾸기 %s->%s (위치 %s). 이름 바꾸기 %s->%s (위"
+"치 %s)"
+
+#: merge-recursive.c:1258
+#, c-format
+msgid "Renaming %s to %s and %s to %s instead"
+msgstr "대신 이름을 %s에서 %s(으)로 바꾸고 %s에서 %s(으)로 바꿉니다"
+
+#: merge-recursive.c:1457
+#, c-format
+msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
+msgstr "충돌! (rename/add): 이름 바꾸기 %s->%s (위치 %s). %s 추가 (위치 %s)"
+
+#: merge-recursive.c:1467
+#, c-format
+msgid "Adding merged %s"
+msgstr "병합된 %s을(를) 추가합니다"
+
+#: merge-recursive.c:1472 merge-recursive.c:1674
+#, c-format
+msgid "Adding as %s instead"
+msgstr "대신 %s(으)로 추가합니다"
+
+#: merge-recursive.c:1523
+#, c-format
+msgid "cannot read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
+
+#: merge-recursive.c:1526
+#, c-format
+msgid "object %s is not a blob"
+msgstr "%s 오브젝트는 블롭이 아닙니다"
+
+#: merge-recursive.c:1578
+msgid "modify"
+msgstr "수정"
+
+#: merge-recursive.c:1578
+msgid "modified"
+msgstr "수정됨"
+
+#: merge-recursive.c:1588
+msgid "content"
+msgstr "내용"
+
+#: merge-recursive.c:1595
+msgid "add/add"
+msgstr "추가/추가"
+
+#: merge-recursive.c:1629
+#, c-format
+msgid "Skipped %s (merged same as existing)"
+msgstr "건너뛰기: %s (기존과 같게 병합)"
+
+#: merge-recursive.c:1643
+#, c-format
+msgid "Auto-merging %s"
+msgstr "자동 병합: %s"
+
+#: merge-recursive.c:1647 git-submodule.sh:1025
+msgid "submodule"
+msgstr "하위 모듈"
+
+#: merge-recursive.c:1648
+#, c-format
+msgid "CONFLICT (%s): Merge conflict in %s"
+msgstr "충돌! (%s): %s에 병합 충돌"
+
+#: merge-recursive.c:1734
+#, c-format
+msgid "Removing %s"
+msgstr "제거: %s"
+
+#: merge-recursive.c:1759
+msgid "file/directory"
+msgstr "파일/디렉터리"
+
+#: merge-recursive.c:1765
+msgid "directory/file"
+msgstr "디렉터리/파일"
+
+#: merge-recursive.c:1770
+#, c-format
+msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
+msgstr ""
+"충돌! (%s): 이름이 %s인 디렉터리가 %s에 있습니다. %s을(를) %s(으)로 추가합니"
+"다"
+
+#: merge-recursive.c:1780
+#, c-format
+msgid "Adding %s"
+msgstr "추가: %s"
+
+#: merge-recursive.c:1797
+msgid "Fatal merge failure, shouldn't happen."
+msgstr "치명적인 병합 실패, 일어날 수 없는 상황."
+
+#: merge-recursive.c:1816
+msgid "Already up-to-date!"
+msgstr "이미 업데이트 상태입니다!"
+
+#: merge-recursive.c:1825
+#, c-format
+msgid "merging of trees %s and %s failed"
+msgstr "%s 및 %s 트리의 병합이 실패했습니다"
+
+#: merge-recursive.c:1855
+#, c-format
+msgid "Unprocessed path??? %s"
+msgstr "처리되지 않은 경로??? %s"
+
+#: merge-recursive.c:1903
+msgid "Merging:"
+msgstr "병합:"
+
+#: merge-recursive.c:1916
+#, c-format
+msgid "found %u common ancestor:"
+msgid_plural "found %u common ancestors:"
+msgstr[0] "과거의 공통 커밋 %u개 발견:"
+
+#: merge-recursive.c:1953
+msgid "merge returned no commit"
+msgstr "병합 결과에 커밋이 없습니다"
+
+#: merge-recursive.c:2010
+#, c-format
+msgid "Could not parse object '%s'"
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다"
+
+#: merge-recursive.c:2021 builtin/merge.c:645
+msgid "Unable to write index."
+msgstr "인덱스를 쓸 수 없습니다."
+
+#: notes-utils.c:41
+msgid "Cannot commit uninitialized/unreferenced notes tree"
+msgstr "초기화하지 않았거나 레퍼런스하지 않은 notes 트리를 커밋할 수 없습니다"
+
+#: notes-utils.c:100
+#, c-format
+msgid "Bad notes.rewriteMode value: '%s'"
+msgstr "잘못된 notes.rewriteMode 값: '%s'"
+
+#: notes-utils.c:110
+#, c-format
+msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
+msgstr "%s에서 노트를 다시 쓰기를 거부합니다 (refs/notes/ 밖임)"
+
+#. TRANSLATORS: The first %s is the name of the
+#. environment variable, the second %s is its value
+#: notes-utils.c:137
+#, c-format
+msgid "Bad %s value: '%s'"
+msgstr "잘못된 %s 값: '%s'"
+
+#: object.c:242
+#, c-format
+msgid "unable to parse object: %s"
+msgstr "오브젝트를 파싱할 수 없습니다: %s"
+
+#: parse-options.c:570
+msgid "..."
+msgstr "..."
+
+#: parse-options.c:588
+#, c-format
+msgid "usage: %s"
+msgstr "사용법: %s"
+
+#. TRANSLATORS: the colon here should align with the
+#. one in "usage: %s" translation
+#: parse-options.c:592
+#, c-format
+msgid "   or: %s"
+msgstr "  또는: %s"
+
+#: parse-options.c:595
+#, c-format
+msgid "    %s"
+msgstr "    %s"
+
+#: parse-options.c:629
+msgid "-NUM"
+msgstr "-NUM"
+
+#: parse-options-cb.c:108
+#, c-format
+msgid "malformed object name '%s'"
+msgstr "잘못된 형식의 오브젝트 이름 '%s'"
+
+#: path.c:752
+#, c-format
+msgid "Could not make %s writable by group"
+msgstr "%s을(를) 그룹에서 쓰기 가능하도록 만들 수 없습니다"
+
+#: pathspec.c:133
+msgid "global 'glob' and 'noglob' pathspec settings are incompatible"
+msgstr "'glob' 및 'noglob' 경로명세 전체 설정은 호환되지 않습니다"
+
+#: pathspec.c:143
+msgid ""
+"global 'literal' pathspec setting is incompatible with all other global "
+"pathspec settings"
+msgstr ""
+"'literal' 경로명세 전체 설정은 다른 경로명세 전체 설정과 호환되지 않습니다"
+
+#: pathspec.c:177
+msgid "invalid parameter for pathspec magic 'prefix'"
+msgstr "경로명세 지시어 'prefix'에 잘못된 파라미터"
+
+#: pathspec.c:183
+#, c-format
+msgid "Invalid pathspec magic '%.*s' in '%s'"
+msgstr "잘못된 경로명세 지시어 '%.*s' (위치 '%s')"
+
+#: pathspec.c:187
+#, c-format
+msgid "Missing ')' at the end of pathspec magic in '%s'"
+msgstr "경로 명세 지시어 끝에 ')' 빠짐 (위치 '%s')"
+
+#: pathspec.c:205
+#, c-format
+msgid "Unimplemented pathspec magic '%c' in '%s'"
+msgstr "구현되지 않은 경로명세 지시어 '%c' (위치 '%s')"
+
+#: pathspec.c:230
+#, c-format
+msgid "%s: 'literal' and 'glob' are incompatible"
+msgstr "%s: 'literal'과 'glob'은 호환되지 않습니다"
+
+#: pathspec.c:241
+#, c-format
+msgid "%s: '%s' is outside repository"
+msgstr "%s: '%s'은(는) 저장소 밖입니다"
+
+#: pathspec.c:291
+#, c-format
+msgid "Pathspec '%s' is in submodule '%.*s'"
+msgstr "경로명세 '%s'은(는) ''%.*s' 하위 모듈 안에 있습니다"
+
+#: pathspec.c:353
+#, c-format
+msgid "%s: pathspec magic not supported by this command: %s"
+msgstr "%s: 경로명세 지시어가 이 명령어에서 지원하지 않습니다: %s"
+
+#: pathspec.c:432
+#, c-format
+msgid "pathspec '%s' is beyond a symbolic link"
+msgstr "'%s' 경로명세는 심볼릭 링크 아래에 있습니다"
+
+#: pathspec.c:441
+msgid ""
+"There is nothing to exclude from by :(exclude) patterns.\n"
+"Perhaps you forgot to add either ':/' or '.' ?"
+msgstr ""
+":(exclude) 패턴으로 제외할 사항이 없습니다.\n"
+"':/' 또는 '.' 추가를 잊으신 것 아닙니까?"
+
+#: pretty.c:969
+msgid "unable to parse --pretty format"
+msgstr "--pretty 형식을 파싱할 수 없습니다"
+
+#: progress.c:235
+msgid "done"
+msgstr "완료"
+
+#: read-cache.c:1281
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
+
+#: read-cache.c:1291
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION이 설정되었지만, 이 값이 잘못되었습니다.\n"
+"%i 버전을 사용합니다"
+
+#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973
+#: builtin/merge.c:983
+#, c-format
+msgid "Could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+
+#: refs/files-backend.c:2359
+#, c-format
+msgid "could not delete reference %s: %s"
+msgstr "%s 레퍼런스를 삭제할 수 없습니다: %s"
+
+#: refs/files-backend.c:2362
+#, c-format
+msgid "could not delete references: %s"
+msgstr "레퍼런스를 삭제할 수 없습니다: %s"
+
+#: refs/files-backend.c:2371
+#, c-format
+msgid "could not remove reference %s"
+msgstr "%s 레퍼런스를 제거할 수 없습니다"
+
+#: ref-filter.c:245
+#, c-format
+msgid "format: %%(end) atom used without corresponding atom"
+msgstr "형식: %%(end) 아톰이 대응되는 아톰 없이 사용되었습니다"
+
+#: ref-filter.c:704
+#, c-format
+msgid "positive value expected contents:lines=%s"
+msgstr "'contents:lines=%s'에서 0보다 큰 값이 와야 합니다"
+
+#: ref-filter.c:833
+#, c-format
+msgid "expected format: %%(color:<color>)"
+msgstr "예상한 형식: %%(color:<색>)"
+
+#: ref-filter.c:835
+msgid "unable to parse format"
+msgstr "형식을 파싱할 수 없습니다"
+
+#: ref-filter.c:870
+#, c-format
+msgid "expected format: %%(align:<width>,<position>)"
+msgstr "예상한 형식: %%(align:<너비>,<위치>)"
+
+#: ref-filter.c:893
+#, c-format
+msgid "improper format entered align:%s"
+msgstr "align:%s 잘못된 형식이 입력되었습니다"
+
+#: ref-filter.c:898
+#, c-format
+msgid "positive width expected with the %%(align) atom"
+msgstr "%%(align) 아톰에 너비가 0보다 커야 합니다"
+
+#: ref-filter.c:1219
+#, c-format
+msgid "malformed object at '%s'"
+msgstr "'%s'에 잘못된 형식의 오브젝트"
+
+#: ref-filter.c:1561
+#, c-format
+msgid "format: %%(end) atom missing"
+msgstr "형식: %%(end) 아톰이 없습니다"
+
+#: ref-filter.c:1615
+#, c-format
+msgid "malformed object name %s"
+msgstr "잘못된 형식의 오브젝트 이름 %s"
+
+#: remote.c:756
+#, c-format
+msgid "Cannot fetch both %s and %s to %s"
+msgstr "%s 및 %s을(를) 모두 %s에 가져올 수 없습니다"
+
+#: remote.c:760
+#, c-format
+msgid "%s usually tracks %s, not %s"
+msgstr "%s은(는) 보통 %s을(를) 추적하고, %s을(를) 추적하지 않습니다"
+
+#: remote.c:764
+#, c-format
+msgid "%s tracks both %s and %s"
+msgstr "%s은(는) %s 및 %s 모두 추적합니다"
+
+#: remote.c:772
+msgid "Internal error"
+msgstr "내부 오류"
+
+#: remote.c:1687 remote.c:1730
+msgid "HEAD does not point to a branch"
+msgstr "HEAD가 브랜치를 가리키지 않습니다"
+
+#: remote.c:1696
+#, c-format
+msgid "no such branch: '%s'"
+msgstr "그런 브랜치가 없습니다: '%s'"
+
+#: remote.c:1699
+#, c-format
+msgid "no upstream configured for branch '%s'"
+msgstr "'%s' 브랜치에 대해 업스트림을 설정하지 않았습니다"
+
+#: remote.c:1705
+#, c-format
+msgid "upstream branch '%s' not stored as a remote-tracking branch"
+msgstr "업스트림 '%s' 브랜치가 리모트 추적 브랜치로 저장되지 않았습니다"
+
+#: remote.c:1720
+#, c-format
+msgid "push destination '%s' on remote '%s' has no local tracking branch"
+msgstr "리모트 '%2$s'의 푸시 대상 '%1$s'에 로컬 추적 브랜치가 없습니다"
+
+#: remote.c:1735
+#, c-format
+msgid "branch '%s' has no remote for pushing"
+msgstr "'%s' 브랜치에 푸시 리모트가 없습니다"
+
+#: remote.c:1746
+#, c-format
+msgid "push refspecs for '%s' do not include '%s'"
+msgstr "'%s'에 대한 푸시 레퍼런스명세에 '%s'이(가) 들어 있지 않습니다"
+
+#: remote.c:1759
+msgid "push has no destination (push.default is 'nothing')"
+msgstr "푸시의 대상이 없습니다 (push.default가 'nothing'입니다)"
+
+#: remote.c:1781
+msgid "cannot resolve 'simple' push to a single destination"
+msgstr "하나의 대상에 대해 'simple' 푸시를 처리할 수 없습니다"
+
+#: remote.c:2083
+#, c-format
+msgid "Your branch is based on '%s', but the upstream is gone.\n"
+msgstr "현재 브랜치가 '%s' 기반이지만, 업스트림이 없어졌습니다.\n"
+
+#: remote.c:2087
+msgid "  (use \"git branch --unset-upstream\" to fixup)\n"
+msgstr "  (바로잡으려면 \"git branch --unset-upstream\"을 사용하십시오)\n"
+
+#: remote.c:2090
+#, c-format
+msgid "Your branch is up-to-date with '%s'.\n"
+msgstr "브랜치가 '%s'에 맞게 업데이트된 상태입니다.\n"
+
+#: remote.c:2094
+#, 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] "브랜치가 '%s'보다 %d개 커밋만큼 앞에 있습니다.\n"
+
+#: remote.c:2100
+msgid "  (use \"git push\" to publish your local commits)\n"
+msgstr "  (로컬에 있는 커밋을 제출하려면 \"git push\"를 사용하십시오)\n"
+
+#: remote.c:2103
+#, 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] "브랜치가 '%s'보다 %d개 커밋 뒤에 있고, 앞으로 돌릴 수 있습니다.\n"
+
+#: remote.c:2111
+msgid "  (use \"git pull\" to update your local branch)\n"
+msgstr "  (로컬 브랜치를 업데이트하려면 \"git pull\"을 사용하십시오)\n"
+
+#: remote.c:2114
+#, 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] ""
+"현재 브랜치와 '%s'이(가) 갈라졌습니다,\n"
+"다른 커밋이 각각 %d개와 %d개 있습니다.\n"
+
+#: remote.c:2124
+msgid "  (use \"git pull\" to merge the remote branch into yours)\n"
+msgstr ""
+"  (리모트의 브랜치를 현재 브랜치로 병합하려면 \"git pull\"을 사용하십시오)\n"
+
+#: revision.c:2193
+msgid "your current branch appears to be broken"
+msgstr "현재 브랜치가 망가진 것처럼 보입니다"
+
+#: revision.c:2196
+#, c-format
+msgid "your current branch '%s' does not have any commits yet"
+msgstr "현재 '%s' 브랜치에 아직 아무 커밋도 없습니다"
+
+#: revision.c:2390
+msgid "--first-parent is incompatible with --bisect"
+msgstr "--first-parent 옵션은 --bisect 옵션과 호환되지 않습니다"
+
+#: run-command.c:90
+msgid "open /dev/null failed"
+msgstr "/dev/null 열기 실패"
+
+#: run-command.c:92
+#, c-format
+msgid "dup2(%d,%d) failed"
+msgstr "dup2(%d,%d) 실패"
+
+#: send-pack.c:295
+msgid "failed to sign the push certificate"
+msgstr "푸시 인증서 서명에 실패했습니다"
+
+#: send-pack.c:404
+msgid "the receiving end does not support --signed push"
+msgstr "받는 쪽에서 --signed 푸시를 지원하지 않습니다"
+
+#: send-pack.c:406
+msgid ""
+"not sending a push certificate since the receiving end does not support --"
+"signed push"
+msgstr ""
+"받는 쪽에서 --signed 푸시를 지원하지 않으므로 푸시 인증서를 보내지 않습니다"
+
+#: send-pack.c:418
+msgid "the receiving end does not support --atomic push"
+msgstr "받는 쪽에서 --atomic 푸시를 지원하지 않습니다"
+
+#: sequencer.c:183
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'"
+msgstr ""
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오"
+
+#: sequencer.c:186
+msgid ""
+"after resolving the conflicts, mark the corrected paths\n"
+"with 'git add <paths>' or 'git rm <paths>'\n"
+"and commit the result with 'git commit'"
+msgstr ""
+"이 충돌을 해결한 뒤에, 바로잡은 경로를\n"
+"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오.\n"
+"그리고 결과물을 'git commit'으로 커밋하십시오"
+
+#: sequencer.c:199 sequencer.c:842 sequencer.c:922
+#, c-format
+msgid "Could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: sequencer.c:202
+#, c-format
+msgid "Error wrapping up %s"
+msgstr "%s 잠그는데 오류"
+
+#: sequencer.c:217
+msgid "Your local changes would be overwritten by cherry-pick."
+msgstr "로컬 변경 사항을 cherry-pick 때문에 덮어 쓰게 됩니다."
+
+#: sequencer.c:219
+msgid "Your local changes would be overwritten by revert."
+msgstr "로컬 변경 사항을 revert 때문에 덮어 쓰게 됩니다."
+
+#: sequencer.c:222
+msgid "Commit your changes or stash them to proceed."
+msgstr "변경 사항을 스테이징하거나 스태시한 다음 계속하십시오."
+
+#. TRANSLATORS: %s will be "revert" or "cherry-pick"
+#: sequencer.c:309
+#, c-format
+msgid "%s: Unable to write new index file"
+msgstr "%s: 새 인덱스 파일을 쓸 수 없습니다"
+
+#: sequencer.c:327
+msgid "Could not resolve HEAD commit\n"
+msgstr "HEAD 커밋을 처리할 수 없습니다\n"
+
+#: sequencer.c:347
+msgid "Unable to update cache tree\n"
+msgstr "캐시 트리를 업데이트할 수 없습니다\n"
+
+#: sequencer.c:399
+#, c-format
+msgid "Could not parse commit %s\n"
+msgstr "%s 커밋을 파싱할 수 없습니다\n"
+
+#: sequencer.c:404
+#, c-format
+msgid "Could not parse parent commit %s\n"
+msgstr "%s 이전 커밋을 파싱할 수 없습니다\n"
+
+#: sequencer.c:469
+msgid "Your index file is unmerged."
+msgstr "인덱스 파일이 병합되지 않았습니다."
+
+#: sequencer.c:488
+#, c-format
+msgid "Commit %s is a merge but no -m option was given."
+msgstr "%s 커밋은 병합이지만 -m 옵션이 주어지지 않았습니다."
+
+# FIXME: "parent %d" 번호가 무슨 의미?
+#: sequencer.c:496
+#, c-format
+msgid "Commit %s does not have parent %d"
+msgstr "Commit %s 커밋에 이전 커밋 %d이(가) 없습니다"
+
+#: sequencer.c:500
+#, c-format
+msgid "Mainline was specified but commit %s is not a merge."
+msgstr "메인라인을 지정했지만 %s 커밋이 병합 커밋이 아닙니다."
+
+#. TRANSLATORS: The first %s will be "revert" or
+#. "cherry-pick", the second %s a SHA1
+#: sequencer.c:513
+#, c-format
+msgid "%s: cannot parse parent commit %s"
+msgstr "%s: %s 이전 커밋을 파싱할 수 없습니다"
+
+#: sequencer.c:517
+#, c-format
+msgid "Cannot get commit message for %s"
+msgstr "%s에 대한 커밋 메시지를 가져올 수 없습니다"
+
+#: sequencer.c:603
+#, c-format
+msgid "could not revert %s... %s"
+msgstr "다음을 되돌릴(revert) 수 없습니다: %s... %s"
+
+#: sequencer.c:604
+#, c-format
+msgid "could not apply %s... %s"
+msgstr "다음을 적용할(apply) 수 없습니다: %s... %s"
+
+#: sequencer.c:639
+msgid "empty commit set passed"
+msgstr "빈 커밋 모음을 건너 뜁니다"
+
+#: sequencer.c:647
+#, c-format
+msgid "git %s: failed to read the index"
+msgstr "git %s: 인덱스 읽기에 실패했습니다"
+
+#: sequencer.c:651
+#, c-format
+msgid "git %s: failed to refresh the index"
+msgstr "git %s: 인덱스 새로 고침에 실패했습니다"
+
+#: sequencer.c:711
+#, c-format
+msgid "Cannot %s during a %s"
+msgstr "%2$s 동안 %1$s 할 수 없습니다"
+
+#: sequencer.c:733
+#, c-format
+msgid "Could not parse line %d."
+msgstr "%d번 줄을 파싱할 수 없습니다."
+
+#: sequencer.c:738
+msgid "No commits parsed."
+msgstr "파싱한 커밋이 없습니다."
+
+#: sequencer.c:750
+#, c-format
+msgid "Could not open %s"
+msgstr "%s을(를) 열 수 없습니다"
+
+#: sequencer.c:754
+#, c-format
+msgid "Could not read %s."
+msgstr "%s을(를) 읽을 수 없습니다."
+
+#: sequencer.c:761
+#, c-format
+msgid "Unusable instruction sheet: %s"
+msgstr "사용 불가능 인스트럭션 파일: %s"
+
+#: sequencer.c:791
+#, c-format
+msgid "Invalid key: %s"
+msgstr "잘못된 키: %s"
+
+#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49
+#, c-format
+msgid "Invalid value for %s: %s"
+msgstr "%s의 값이 올바르지 않습니다: %s"
+
+#: sequencer.c:804
+#, c-format
+msgid "Malformed options sheet: %s"
+msgstr "형식이 잘못된 옵션 파일: %s"
+
+#: sequencer.c:823
+msgid "a cherry-pick or revert is already in progress"
+msgstr "이미 커밋 빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중입니다"
+
+#: sequencer.c:824
+msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
+msgstr "\"git cherry-pick (--continue | --quit | --abort)\" 명령을 해 보십시오"
+
+#: sequencer.c:828
+#, c-format
+msgid "Could not create sequencer directory %s"
+msgstr "%s 시퀀서 디렉터리를 만들 수 없습니다"
+
+#: sequencer.c:844 sequencer.c:926
+#, c-format
+msgid "Error wrapping up %s."
+msgstr "%s 잠그는데 오류."
+
+#: sequencer.c:863 sequencer.c:996
+msgid "no cherry-pick or revert in progress"
+msgstr "빼오기(cherry-pick) 또는 되돌리기(revert)가 진행 중이지 않습니다"
+
+#: sequencer.c:865
+msgid "cannot resolve HEAD"
+msgstr "HEAD를 구해 올 수 없습니다"
+
+#: sequencer.c:867
+msgid "cannot abort from a branch yet to be born"
+msgstr "새로 만들고 있는 브랜치에서 중지할 수 없습니다"
+
+#: sequencer.c:887 builtin/apply.c:4287
+#, c-format
+msgid "cannot open %s: %s"
+msgstr "%s을(를) 열 수 없습니다: %s"
+
+#: sequencer.c:890
+#, c-format
+msgid "cannot read %s: %s"
+msgstr "%s을(를) 읽을 수 없습니다: %s"
+
+#: sequencer.c:891
+msgid "unexpected end of file"
+msgstr "예상치 못하게 파일이 끝났습니다"
+
+#: sequencer.c:897
+#, c-format
+msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
+msgstr "빼오기 전에 저장한 HEAD 파일이('%s') 손상되었습니다"
+
+#: sequencer.c:919
+#, c-format
+msgid "Could not format %s."
+msgstr "%s에 포매팅할 수 없습니다."
+
+#: sequencer.c:1064
+#, c-format
+msgid "%s: can't cherry-pick a %s"
+msgstr "%s: %s 커밋을 빼올 수 없습니다"
+
+#: sequencer.c:1067
+#, c-format
+msgid "%s: bad revision"
+msgstr "%s: 잘못된 리비전"
+
+#: sequencer.c:1101
+msgid "Can't revert as initial commit"
+msgstr "최초의 커밋을 되돌릴 수 없습니다"
+
+#: sequencer.c:1102
+msgid "Can't cherry-pick into empty head"
+msgstr "빈 헤드로 커밋을 빼올 수 없습니다."
+
+#: setup.c:248
+#, c-format
+msgid "failed to read %s"
+msgstr "%s을(를) 읽는데 실패했습니다"
+
+#: sha1_name.c:463
+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 checkout -b $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 ""
+"깃에서는 보통 40개의 16진수 문자로 끝나는 레퍼런스를 만들지 않습니다.\n"
+"16진수 문자 40자를 지정했을 때 이 레퍼런스가 무시되기 때문입니다. 이\n"
+"레퍼런스는 실수로 만들어졌을 수도 있습니다. 예를 들어,\n"
+"\n"
+"  git checkout -b $br $(git rev-parse ...)\n"
+"\n"
+"여기서 \"$br\"은 비어 있으므로 40자 레퍼런스가 만들어집니다. 이 레퍼런스를\n"
+"확인해 보시고 잘못 만들어진 것이면 지우십시오. 이 메시지를 보고 싶지\n"
+"않으면 \"git config advice.objectNameWarning false\" 명령을 사용하십시오."
+
+#: submodule.c:61 submodule.c:95
+msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
+msgstr ""
+"병합하지 않은 .gitmodules를 바꿀 수 없습니다. 병합 충돌을 먼저 해결하십시오"
+
+#: submodule.c:65 submodule.c:99
+#, c-format
+msgid "Could not find section in .gitmodules where path=%s"
+msgstr "경로가 %s일 때 .gitmodules의 섹션을 찾을 수 없습니다"
+
+#: submodule.c:73
+#, c-format
+msgid "Could not update .gitmodules entry %s"
+msgstr ".gitmodules 항목 %s을(를) 업데이트할 수 없습니다"
+
+#: submodule.c:106
+#, c-format
+msgid "Could not remove .gitmodules entry for %s"
+msgstr "%s에 대한 .gitmodules 항목을 제거할 수 없습니다"
+
+#: submodule.c:117
+msgid "staging updated .gitmodules failed"
+msgstr "업데이트한 .gitmodules를 커밋할 사항으로 표시하는데 실패"
+
+#: submodule.c:1040
+#, c-format
+msgid "Could not set core.worktree in %s"
+msgstr "%s에서 core.worktree를 설정할 수 없습니다"
+
+#: trailer.c:491 trailer.c:495 trailer.c:499 trailer.c:553 trailer.c:557
+#: trailer.c:561
+#, c-format
+msgid "unknown value '%s' for key '%s'"
+msgstr "알 수 없는 값 '%s', 키 '%s'"
+
+#: trailer.c:543 trailer.c:548 builtin/remote.c:296
+#, c-format
+msgid "more than one %s"
+msgstr "%s이(가) 여러개입니다"
+
+#: trailer.c:581
+#, c-format
+msgid "empty trailer token in trailer '%.*s'"
+msgstr "트레일러 '%.*s'에서 빈 트레일러 토큰"
+
+#: trailer.c:701
+#, c-format
+msgid "could not read input file '%s'"
+msgstr "'%s' 입력 파일을 읽을 수 없습니다"
+
+#: trailer.c:704
+msgid "could not read from stdin"
+msgstr "표준 입력에서 읽을 수 없습니다"
+
+#: transport-helper.c:1025
+#, c-format
+msgid "Could not read ref %s"
+msgstr "%s 레퍼런스를 읽을 수 없습니다"
+
+#: unpack-trees.c:203
+msgid "Checking out files"
+msgstr "파일을 가져옵니다"
+
+#: urlmatch.c:120
+msgid "invalid URL scheme name or missing '://' suffix"
+msgstr "URL 스킴 이름이 잘못되었거나 '://'가 뒤에 붙지 않았습니다"
+
+#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356
+#, c-format
+msgid "invalid %XX escape sequence"
+msgstr "잘못된 %XX 이스케이프 시퀀스"
+
+#: urlmatch.c:172
+msgid "missing host and scheme is not 'file:'"
+msgstr "호스트가 없고 스킴이 'file:'이 아닙니다"
+
+#: urlmatch.c:189
+msgid "a 'file:' URL may not have a port number"
+msgstr "'file:' URL에는 포트 번호를 쓸 수 없습니다"
+
+#: urlmatch.c:199
+msgid "invalid characters in host name"
+msgstr "호스트 이름에 잘못된 문자"
+
+#: urlmatch.c:244 urlmatch.c:255
+msgid "invalid port number"
+msgstr "잘못된 포트 번호"
+
+#: urlmatch.c:322
+msgid "invalid '..' path segment"
+msgstr "경로에서 잘못된 '..' 부분"
+
+#: wrapper.c:219 wrapper.c:362
+#, c-format
+msgid "could not open '%s' for reading and writing"
+msgstr "읽기와 쓰기용으로 '%s'을(를) 열 수 없습니다"
+
+#: wrapper.c:221 wrapper.c:364
+#, c-format
+msgid "could not open '%s' for writing"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다"
+
+#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691
+#: builtin/merge.c:1074 builtin/pull.c:380
+#, c-format
+msgid "could not open '%s' for reading"
+msgstr "'%s'을(를) 읽기용으로 열 수 없습니다"
+
+#: wrapper.c:579
+#, c-format
+msgid "unable to access '%s': %s"
+msgstr "'%s'에 접근할 수 없습니다: %s"
+
+#: wrapper.c:600
+#, c-format
+msgid "unable to access '%s'"
+msgstr "'%s'에 접근할 수 없습니다"
+
+#: wrapper.c:608
+msgid "unable to get current working directory"
+msgstr "현재 작업 디렉터리를 가져올 수 없습니다"
+
+#: wrapper.c:635
+#, c-format
+msgid "could not open %s for writing"
+msgstr "%s을(를) 쓰기용으로 열 수 없습니다"
+
+#: wrapper.c:646 builtin/am.c:425
+#, c-format
+msgid "could not write to %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: wrapper.c:652
+#, c-format
+msgid "could not close %s"
+msgstr "%s을(를) 닫을 수 없습니다"
+
+#: wt-status.c:149
+msgid "Unmerged paths:"
+msgstr "병합하지 않은 경로:"
+
+#: wt-status.c:176 wt-status.c:203
+#, c-format
+msgid "  (use \"git reset %s <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:178 wt-status.c:205
+msgid "  (use \"git rm --cached <file>...\" to unstage)"
+msgstr "  (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:182
+msgid "  (use \"git add <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:184 wt-status.c:188
+msgid "  (use \"git add/rm <file>...\" as appropriate to mark resolution)"
+msgstr ""
+"  (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:186
+msgid "  (use \"git rm <file>...\" to mark resolution)"
+msgstr "  (해결했다고 표시하려면 \"git rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:197 wt-status.c:880
+msgid "Changes to be committed:"
+msgstr "커밋할 변경 사항:"
+
+#: wt-status.c:215 wt-status.c:889
+msgid "Changes not staged for commit:"
+msgstr "커밋하도록 정하지 않은 변경 사항:"
+
+#: wt-status.c:219
+msgid "  (use \"git add <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:221
+msgid "  (use \"git add/rm <file>...\" to update what will be committed)"
+msgstr "  (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:222
+msgid ""
+"  (use \"git checkout -- <file>...\" to discard changes in working directory)"
+msgstr ""
+"  (작업 폴더의 변경 사항을 버리려면 \"git checkout -- <파일>...\"을 사용하십"
+"시오)"
+
+#: wt-status.c:224
+msgid "  (commit or discard the untracked or modified content in submodules)"
+msgstr ""
+"  (하위 모듈의 추적되지 않는 파일이나 수정된 내용을 커밋하거나 버리십시오)"
+
+#: wt-status.c:236
+#, c-format
+msgid "  (use \"git %s <file>...\" to include in what will be committed)"
+msgstr "  (커밋할 사항에 포함하려면 \"git %s <파일>...\"을 사용하십시오)"
+
+#: wt-status.c:251
+msgid "both deleted:"
+msgstr "양쪽에서 삭제:"
+
+#: wt-status.c:253
+msgid "added by us:"
+msgstr "이 쪽에서 추가:"
+
+#: wt-status.c:255
+msgid "deleted by them:"
+msgstr "저 쪽에서 삭제:"
+
+#: wt-status.c:257
+msgid "added by them:"
+msgstr "저 쪽에서 추가:"
+
+#: wt-status.c:259
+msgid "deleted by us:"
+msgstr "이 쪽에서 삭제:"
+
+#: wt-status.c:261
+msgid "both added:"
+msgstr "양쪽에서 추가:"
+
+#: wt-status.c:263
+msgid "both modified:"
+msgstr "양쪽에서 수정:"
+
+#: wt-status.c:265
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bug: 병합하지 않은 상태 %x 처리되지 않음"
+
+#: wt-status.c:273
+msgid "new file:"
+msgstr "새 파일:"
+
+#: wt-status.c:275
+msgid "copied:"
+msgstr "복사함:"
+
+#: wt-status.c:277
+msgid "deleted:"
+msgstr "삭제함:"
+
+#: wt-status.c:279
+msgid "modified:"
+msgstr "수정함:"
+
+#: wt-status.c:281
+msgid "renamed:"
+msgstr "이름 바꿈:"
+
+#: wt-status.c:283
+msgid "typechange:"
+msgstr "종류 바뀜:"
+
+#: wt-status.c:285
+msgid "unknown:"
+msgstr "알 수 없음:"
+
+#: wt-status.c:287
+msgid "unmerged:"
+msgstr "병합하지 않음:"
+
+#: wt-status.c:369
+msgid "new commits, "
+msgstr "새 커밋, "
+
+#: wt-status.c:371
+msgid "modified content, "
+msgstr "수정한 내용, "
+
+#: wt-status.c:373
+msgid "untracked content, "
+msgstr "추적하지 않은 내용, "
+
+#: wt-status.c:390
+#, c-format
+msgid "bug: unhandled diff status %c"
+msgstr "버그: 처리되지 않은 diff 상태 %c"
+
+#: wt-status.c:754
+msgid "Submodules changed but not updated:"
+msgstr "변경되었지만 업데이트하지 않은 하위 모듈:"
+
+#: wt-status.c:756
+msgid "Submodule changes to be committed:"
+msgstr "커밋할 하위 모듈의 변경 사항:"
+
+#: wt-status.c:837
+msgid ""
+"Do not touch the line above.\n"
+"Everything below will be removed."
+msgstr ""
+"위의 줄을 바꾸지 마십시오.\n"
+"아래 있는 내용은 모두 제거됩니다."
+
+#: wt-status.c:948
+msgid "You have unmerged paths."
+msgstr "병합하지 않은 경로가 있습니다."
+
+#: wt-status.c:951
+msgid "  (fix conflicts and run \"git commit\")"
+msgstr "  (충돌을 바로잡고 \"git commit\"을 실행하십시오)"
+
+#: wt-status.c:954
+msgid "All conflicts fixed but you are still merging."
+msgstr "모든 충돌을 바로잡았지만 아직 병합하는 중입니다."
+
+#: wt-status.c:957
+msgid "  (use \"git commit\" to conclude merge)"
+msgstr "  (병합을 마무리하려면 \"git commit\"을 사용하십시오)"
+
+#: wt-status.c:967
+msgid "You are in the middle of an am session."
+msgstr "am 세션 중간에 있습니다."
+
+#: wt-status.c:970
+msgid "The current patch is empty."
+msgstr "현재 패치가 비어 있습니다."
+
+#: wt-status.c:974
+msgid "  (fix conflicts and then run \"git am --continue\")"
+msgstr "  (충돌을 바로잡은 다음 \"git am --continue\"를 사용하십시오)"
+
+#: wt-status.c:976
+msgid "  (use \"git am --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너 뛰려면 \"git am --skip\"을 사용하십시오)"
+
+#: wt-status.c:978
+msgid "  (use \"git am --abort\" to restore the original branch)"
+msgstr "  (원본 브랜치를 복구하려면 \"git am --abort\"를 사용하십시오)"
+
+#: wt-status.c:1105
+msgid "No commands done."
+msgstr "완료한 명령 없음."
+
+#: wt-status.c:1108
+#, c-format
+msgid "Last command done (%d command done):"
+msgid_plural "Last commands done (%d commands done):"
+msgstr[0] "최근 완료한 명령 (%d개 명령 완료):"
+
+#: wt-status.c:1119
+#, c-format
+msgid "  (see more in file %s)"
+msgstr "  (자세한 정보는 %s 파일 참고)"
+
+#: wt-status.c:1124
+msgid "No commands remaining."
+msgstr "명령이 남아있지 않음."
+
+#: wt-status.c:1127
+#, c-format
+msgid "Next command to do (%d remaining command):"
+msgid_plural "Next commands to do (%d remaining commands):"
+msgstr[0] "다음에 할 명령 (%d개 명령 남음):"
+
+#: wt-status.c:1135
+msgid "  (use \"git rebase --edit-todo\" to view and edit)"
+msgstr "  (보고 편집하려면 \"git rebase --edit-todo\"를 사용하십시오)"
+
+#: wt-status.c:1148
+#, c-format
+msgid "You are currently rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중입니다."
+
+#: wt-status.c:1153
+msgid "You are currently rebasing."
+msgstr "현재 리베이스하는 중입니다."
+
+#: wt-status.c:1167
+msgid "  (fix conflicts and then run \"git rebase --continue\")"
+msgstr "  (충돌을 바로잡고 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1169
+msgid "  (use \"git rebase --skip\" to skip this patch)"
+msgstr "  (이 패치를 건너뛰려면 \"git rebase --skip\"을 사용하십시오)"
+
+#: wt-status.c:1171
+msgid "  (use \"git rebase --abort\" to check out the original branch)"
+msgstr "  (원본 브랜치를 가져오려면 \"git rebase --abort\"를 사용하십시오)"
+
+#: wt-status.c:1177
+msgid "  (all conflicts fixed: run \"git rebase --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1181
+#, c-format
+msgid ""
+"You are currently splitting a commit while rebasing branch '%s' on '%s'."
+msgstr "현재 '%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1186
+msgid "You are currently splitting a commit during a rebase."
+msgstr "현재 리베이스하는 중 커밋을 분리하는 중입니다."
+
+#: wt-status.c:1189
+msgid "  (Once your working directory is clean, run \"git rebase --continue\")"
+msgstr "  (작업 폴더가 깨끗해지면, \"git rebase --continue\"를 실행하십시오)"
+
+#: wt-status.c:1193
+#, c-format
+msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
+msgstr "'%s' 브랜치를 '%s' 위로 리베이스하는 중 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1198
+msgid "You are currently editing a commit during a rebase."
+msgstr "리베이스 중에 커밋을 편집하는 중입니다."
+
+#: wt-status.c:1201
+msgid "  (use \"git commit --amend\" to amend the current commit)"
+msgstr "  (현재 커밋을 수정하려면 \"git commit --amend\"을 사용하십시오)"
+
+#: wt-status.c:1203
+msgid ""
+"  (use \"git rebase --continue\" once you are satisfied with your changes)"
+msgstr "  (변경 사항에 만족할 때 \"git rebase --continue\"를 사용하십시오)"
+
+#: wt-status.c:1213
+#, c-format
+msgid "You are currently cherry-picking commit %s."
+msgstr "현재 %s 커밋을 뽑아 내고 있습니다."
+
+#: wt-status.c:1218
+msgid "  (fix conflicts and run \"git cherry-pick --continue\")"
+msgstr "  (충돌을 바로잡고 \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1221
+msgid "  (all conflicts fixed: run \"git cherry-pick --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git cherry-pick --continue\"를 실행하십시오)"
+
+#: wt-status.c:1223
+msgid "  (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
+msgstr "  (뽑기 작업을 취소하려면 \"git cherry-pick --abort\"를 사용하십시오)"
+
+#: wt-status.c:1232
+#, c-format
+msgid "You are currently reverting commit %s."
+msgstr "현재 %s 커밋을 되돌리는 중입니다."
+
+#: wt-status.c:1237
+msgid "  (fix conflicts and run \"git revert --continue\")"
+msgstr "  (충돌을 바로잡고 \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1240
+msgid "  (all conflicts fixed: run \"git revert --continue\")"
+msgstr ""
+"  (모든 충돌을 바로잡았습니다: \"git revert --continue\"를 실행하십시오)"
+
+#: wt-status.c:1242
+msgid "  (use \"git revert --abort\" to cancel the revert operation)"
+msgstr "  (되돌리기 작업을 취소하려면 \"git revert --abort\"를 사용하십시오)"
+
+#: wt-status.c:1253
+#, c-format
+msgid "You are currently bisecting, started from branch '%s'."
+msgstr "'이등분하는 중입니다. '%s' 브랜치부터 시작."
+
+#: wt-status.c:1257
+msgid "You are currently bisecting."
+msgstr "'이등분하는 중입니다."
+
+#: wt-status.c:1260
+msgid "  (use \"git bisect reset\" to get back to the original branch)"
+msgstr "  (원래 브랜치로 돌아가려면 \"git bisect reset\"을 사용하십시오)"
+
+#: wt-status.c:1438
+msgid "On branch "
+msgstr "현재 브랜치 "
+
+#: wt-status.c:1444
+msgid "interactive rebase in progress; onto "
+msgstr "대화형 리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1446
+msgid "rebase in progress; onto "
+msgstr "리베이스 진행 중. 갈 위치는 "
+
+#: wt-status.c:1451
+msgid "HEAD detached at "
+msgstr "HEAD가 다음 위치에서 분리: "
+
+#: wt-status.c:1453
+msgid "HEAD detached from "
+msgstr "HEAD가 다음으로부터 분리: "
+
+#: wt-status.c:1456
+msgid "Not currently on any branch."
+msgstr "현재 어떤 브랜치도 사용하지 않음."
+
+#: wt-status.c:1474
+msgid "Initial commit"
+msgstr "최초 커밋"
+
+#: wt-status.c:1488
+msgid "Untracked files"
+msgstr "추적하지 않는 파일"
+
+#: wt-status.c:1490
+msgid "Ignored files"
+msgstr "무시한 파일"
+
+#: wt-status.c:1494
+#, c-format
+msgid ""
+"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
+"may speed it up, but you have to be careful not to forget to add\n"
+"new files yourself (see 'git help status')."
+msgstr ""
+"추적하지 않는 파일을 모두 확인하는데 %.2f초가 걸렸습니다.\n"
+"'status -uno' 옵션을 쓰면 빨라질 수도 있지만, 새 파일을\n"
+"직접 찾아서 추가해야 합니다. ('git help status' 참고)"
+
+#: wt-status.c:1500
+#, c-format
+msgid "Untracked files not listed%s"
+msgstr "추적하지 않는 파일을 보지 않습니다%s"
+
+#: wt-status.c:1502
+msgid " (use -u option to show untracked files)"
+msgstr " (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)"
+
+#: wt-status.c:1508
+msgid "No changes"
+msgstr "변경 사항 없음"
+
+#: wt-status.c:1513
+#, c-format
+msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
+msgstr ""
+"커밋할 변경 사항을 추가하지 않았습니다 (\"git add\" 및/또는 \"git commit -a"
+"\"를\n"
+"사용하십시오)\n"
+
+#: wt-status.c:1516
+#, c-format
+msgid "no changes added to commit\n"
+msgstr "커밋할 변경 사항을 추가하지 않았습니다\n"
+
+#: wt-status.c:1519
+#, c-format
+msgid ""
+"nothing added to commit but untracked files present (use \"git add\" to "
+"track)\n"
+msgstr ""
+"커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "
+"\"git\n"
+"add\"를 사용하십시오)\n"
+
+#: wt-status.c:1522
+#, c-format
+msgid "nothing added to commit but untracked files present\n"
+msgstr "커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다\n"
+
+#: wt-status.c:1525
+#, c-format
+msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
+msgstr ""
+"커밋할 사항 없음 (파일을 만들거나 복사하고 \"git add\"를 사용하면 추적합니"
+"다)\n"
+
+#: wt-status.c:1528 wt-status.c:1533
+#, c-format
+msgid "nothing to commit\n"
+msgstr "커밋할 사항 없음\n"
+
+#: wt-status.c:1531
+#, c-format
+msgid "nothing to commit (use -u to show untracked files)\n"
+msgstr ""
+"커밋할 사항 없음 (추적하지 않는 파일을 보려면 -u 옵션을 사용하십시오)\n"
+
+#: wt-status.c:1535
+#, c-format
+msgid "nothing to commit, working directory clean\n"
+msgstr "커밋할 사항 없음, 작업 폴더 깨끗함\n"
+
+#: wt-status.c:1642
+msgid "Initial commit on "
+msgstr "최초 커밋, 브랜치: "
+
+#: wt-status.c:1646
+msgid "HEAD (no branch)"
+msgstr "HEAD (브랜치 없음)"
+
+#: wt-status.c:1675
+msgid "gone"
+msgstr "없음"
+
+#: wt-status.c:1677 wt-status.c:1685
+msgid "behind "
+msgstr "뒤에: "
+
+#: compat/precompose_utf8.c:56 builtin/clone.c:408
+#, c-format
+msgid "failed to unlink '%s'"
+msgstr "'%s' 파일 삭제에 실패했습니다"
+
+#: builtin/add.c:22
+msgid "git add [<options>] [--] <pathspec>..."
+msgstr "git add [<옵션>] [--] <경로명세>..."
+
+#: builtin/add.c:65
+#, c-format
+msgid "unexpected diff status %c"
+msgstr "예상치 못한 diff 상태 %c"
+
+#: builtin/add.c:70 builtin/commit.c:278
+msgid "updating files failed"
+msgstr "파일 업데이트가 실패했습니다"
+
+#: builtin/add.c:80
+#, c-format
+msgid "remove '%s'\n"
+msgstr "'%s' 제거\n"
+
+#: builtin/add.c:134
+msgid "Unstaged changes after refreshing the index:"
+msgstr "인덱스를 새로 고친 다음 커밋 표시하지 않은 변경 사항:"
+
+#: builtin/add.c:194 builtin/rev-parse.c:796
+msgid "Could not read the index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/add.c:205
+#, c-format
+msgid "Could not open '%s' for writing."
+msgstr "'%s' 파일을 쓰기용으로 열 수 없습니다."
+
+#: builtin/add.c:209
+msgid "Could not write patch"
+msgstr "패치를 쓸 수 없습니다"
+
+#: builtin/add.c:212
+msgid "editing patch failed"
+msgstr "패치 편집에 실패했습니다"
+
+#: builtin/add.c:215
+#, c-format
+msgid "Could not stat '%s'"
+msgstr "'%s'을(를) stat()할 수 없습니다"
+
+#: builtin/add.c:217
+msgid "Empty patch. Aborted."
+msgstr "빈 패치. 중지."
+
+#: builtin/add.c:222
+#, c-format
+msgid "Could not apply '%s'"
+msgstr "'%s'을(를) 적용할 수 없습니다"
+
+#: builtin/add.c:232
+msgid "The following paths are ignored by one of your .gitignore files:\n"
+msgstr "다음 경로는 .gitignore 파일 중 하나 때문에 무시합니다:\n"
+
+#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110
+#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543
+#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162
+msgid "dry run"
+msgstr "가짜로 실행"
+
+#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19
+#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558
+#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114
+msgid "be verbose"
+msgstr "자세히 표시"
+
+#: builtin/add.c:252
+msgid "interactive picking"
+msgstr "대화식으로 고릅니다"
+
+#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286
+msgid "select hunks interactively"
+msgstr "대화식으로 변경된 부분을 선택합니다"
+
+#: builtin/add.c:254
+msgid "edit current diff and apply"
+msgstr "현재 diff를 편집하고 적용합니다"
+
+#: builtin/add.c:255
+msgid "allow adding otherwise ignored files"
+msgstr "무시하는 파일의 추가를 허용합니다"
+
+#: builtin/add.c:256
+msgid "update tracked files"
+msgstr "추적되는 파일을 업데이트합니다"
+
+#: builtin/add.c:257
+msgid "record only the fact that the path will be added later"
+msgstr "나중에 추가할 것이라는 사실만 기록합니다"
+
+#: builtin/add.c:258
+msgid "add changes from all tracked and untracked files"
+msgstr "추적되고 추적되지 않는 모든 파일의 변경 사항을 추가합니다"
+
+#: builtin/add.c:261
+msgid "ignore paths removed in the working tree (same as --no-all)"
+msgstr "작업 폴더에서 제거한 경로를 무시합니다 (--no-all과 동일)"
+
+#: builtin/add.c:263
+msgid "don't add, only refresh the index"
+msgstr "추가하지 않고 인덱스만 새로 고칩니다"
+
+#: builtin/add.c:264
+msgid "just skip files which cannot be added because of errors"
+msgstr "오류 때문에 추가할 수 없는 파일을 건너뜁니다"
+
+#: builtin/add.c:265
+msgid "check if - even missing - files are ignored in dry run"
+msgstr "가짜로 실행했을 때 파일을 무시하는지 확인합니다"
+
+#: builtin/add.c:287
+#, c-format
+msgid "Use -f if you really want to add them.\n"
+msgstr "정말로 추가하려면 -f 옵션을 사용하십시오.\n"
+
+#: builtin/add.c:294
+msgid "adding files failed"
+msgstr "파일 추가가 실패했습니다"
+
+#: builtin/add.c:330
+msgid "-A and -u are mutually incompatible"
+msgstr "-A 및 -u 옵션은 서로 호환되지 않습니다"
+
+#: builtin/add.c:337
+msgid "Option --ignore-missing can only be used together with --dry-run"
+msgstr ""
+"--ignore-missing 옵션은 --dry-run 옵션과 같이 사용할 경우에만 쓸 수 있습니다."
+
+#: builtin/add.c:352
+#, c-format
+msgid "Nothing specified, nothing added.\n"
+msgstr "아무 것도 지정하지 않았으므로 아무 것도 추가하지 않습니다.\n"
+
+#: builtin/add.c:353
+#, c-format
+msgid "Maybe you wanted to say 'git add .'?\n"
+msgstr "'git add .' 명령을 실행하려고 한 것 아니었습니까?\n"
+
+#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938
+#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298
+#: builtin/submodule--helper.c:40
+msgid "index file corrupt"
+msgstr "인덱스 파일이 손상되었습니다"
+
+#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430
+msgid "Unable to write new index file"
+msgstr "새 인덱스 파일에 쓸 수 없습니다"
+
+#: builtin/am.c:42
+#, c-format
+msgid "could not stat %s"
+msgstr "%s에 대해 stat()할 수 없습니다"
+
+#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077
+#, c-format
+msgid "could not read '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
+
+#: builtin/am.c:445
+msgid "could not parse author script"
+msgstr "작성자 스크립트를 파싱할 수 없습니다"
+
+#: builtin/am.c:522
+#, c-format
+msgid "'%s' was deleted by the applypatch-msg hook"
+msgstr "applypatch-msg 훅 때문에 '%s'이(가) 삭제되었습니다."
+
+#: builtin/am.c:563 builtin/notes.c:300
+#, c-format
+msgid "Malformed input line: '%s'."
+msgstr "잘못된 형식의 입력 줄: '%s'."
+
+#: builtin/am.c:600 builtin/notes.c:315
+#, c-format
+msgid "Failed to copy notes from '%s' to '%s'"
+msgstr "'%s'에서 '%s'(으)로 노트를 복사하는데 실패했습니다"
+
+#: builtin/am.c:626
+msgid "fseek failed"
+msgstr "fseek 실패"
+
+#: builtin/am.c:787 builtin/am.c:875
+#, c-format
+msgid "could not open '%s' for reading: %s"
+msgstr "'%s'을(를) 읽기용으로 열 수 없습니다: %s"
+
+#: builtin/am.c:794
+#, c-format
+msgid "could not open '%s' for writing: %s"
+msgstr "'%s'을(를) 쓰기용으로 열 수 없습니다: %s"
+
+#: builtin/am.c:803
+#, c-format
+msgid "could not parse patch '%s'"
+msgstr "'%s' 패치를 파싱할 수 없습니다"
+
+#: builtin/am.c:868
+msgid "Only one StGIT patch series can be applied at once"
+msgstr "한번에 하나의 StGIT 패치 시리즈만 적용할 수 있습니다"
+
+#: builtin/am.c:916
+msgid "invalid timestamp"
+msgstr "시각이 잘못되었습니다"
+
+#: builtin/am.c:919 builtin/am.c:927
+msgid "invalid Date line"
+msgstr "Date 줄이 잘못되었습니다"
+
+#: builtin/am.c:924
+msgid "invalid timezone offset"
+msgstr "시간대 오프셋이 잘못되었습니다"
+
+#: builtin/am.c:1011
+msgid "Patch format detection failed."
+msgstr "패치 형식 검색이 실패했습니다."
+
+#: builtin/am.c:1016 builtin/clone.c:373
+#, c-format
+msgid "failed to create directory '%s'"
+msgstr "'%s' 디렉터리 만들기가 실패했습니다"
+
+#: builtin/am.c:1020
+msgid "Failed to split patches."
+msgstr "패치를 쪼개는데 실패했습니다."
+
+#: builtin/am.c:1152 builtin/commit.c:363
+msgid "unable to write index file"
+msgstr "인덱스 파일을 쓸 수 없습니다"
+
+#: builtin/am.c:1203
+#, c-format
+msgid "When you have resolved this problem, run \"%s --continue\"."
+msgstr "이 문제를 해결했을 때 \"%s --continue\"를 실행하십시오."
+
+#: builtin/am.c:1204
+#, c-format
+msgid "If you prefer to skip this patch, run \"%s --skip\" instead."
+msgstr "이 패치를 건너뛰려면, 그 대신 \"%s --skip\"을 실행하십시오."
+
+#: builtin/am.c:1205
+#, c-format
+msgid "To restore the original branch and stop patching, run \"%s --abort\"."
+msgstr ""
+"원래 브랜치를 복구하고 패치 적용을 중지하려면 \"%s --abort\"를 실행하십시오."
+
+#: builtin/am.c:1343
+msgid "Patch is empty. Was it split wrong?"
+msgstr "패치가 비어 있습니다. 잘못 쪼개지지 않았나요?"
+
+#: builtin/am.c:1417 builtin/log.c:1347
+#, c-format
+msgid "invalid ident line: %s"
+msgstr "잘못된 신원 줄: %s"
+
+#: builtin/am.c:1444
+#, c-format
+msgid "unable to parse commit %s"
+msgstr "%s 커밋을 파싱할 수 없습니다"
+
+#: builtin/am.c:1646
+msgid "Repository lacks necessary blobs to fall back on 3-way merge."
+msgstr "저장소에 3-방향 병합으로 대신할 때 필요한 블롭이 없습니다."
+
+#: builtin/am.c:1648
+msgid "Using index info to reconstruct a base tree..."
+msgstr "인덱스 정보를 사용해 기본 트리를 다시 만듭니다..."
+
+#: builtin/am.c:1667
+msgid ""
+"Did you hand edit your patch?\n"
+"It does not apply to blobs recorded in its index."
+msgstr ""
+"패치를 직접 편집하셨습니까?\n"
+"이 패치는 인덱스에 기록된 블롭에는 적용되지 않습니다."
+
+#: builtin/am.c:1673
+msgid "Falling back to patching base and 3-way merge..."
+msgstr "베이스 패치 적용 및 3-방향 병합으로 대신합니다..."
+
+#: builtin/am.c:1688
+msgid "Failed to merge in the changes."
+msgstr "변경 사항에서 병합하는데 실패했습니다."
+
+#: builtin/am.c:1712 builtin/merge.c:632
+msgid "git write-tree failed to write a tree"
+msgstr "git write-tree가 트리를 쓰는데 실패했습니다"
+
+#: builtin/am.c:1719
+msgid "applying to an empty history"
+msgstr "빈 커밋 내역에 대해 적용합니다"
+
+#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829
+#: builtin/merge.c:854
+msgid "failed to write commit object"
+msgstr "커밋 오브젝트를 쓰는데 실패했습니다"
+
+#: builtin/am.c:1764 builtin/am.c:1768
+#, c-format
+msgid "cannot resume: %s does not exist."
+msgstr "다시 시작할 수 없습니다: %s이(가) 없습니다."
+
+#: builtin/am.c:1784
+msgid "cannot be interactive without stdin connected to a terminal."
+msgstr ""
+"터미널에 표준 입력이 연결되지 않은 상태에서 대화형으로 실행할 수 없습니다."
+
+#: builtin/am.c:1789
+msgid "Commit Body is:"
+msgstr "커밋 본문은:"
+
+#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
+#. in your translation. The program will only accept English
+#. input at this point.
+#.
+#: builtin/am.c:1799
+msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: "
+msgstr "적용? 예[y]/아니오[n]/편집[e]/패치 보기[v]/모두 적용[a]: "
+
+#: builtin/am.c:1849
+#, c-format
+msgid "Dirty index: cannot apply patches (dirty: %s)"
+msgstr "변경된 인덱스: 패치를 적용할 수 없습니다 (dirty: %s)"
+
+#: builtin/am.c:1884 builtin/am.c:1955
+#, c-format
+msgid "Applying: %.*s"
+msgstr "적용하는 중: %.*s"
+
+#: builtin/am.c:1900
+msgid "No changes -- Patch already applied."
+msgstr "변경 사항 없음 -- 패치가 이미 적용되었습니다."
+
+#: builtin/am.c:1908
+#, c-format
+msgid "Patch failed at %s %.*s"
+msgstr "패치가 %s %.*s 위치에서 실패했습니다"
+
+#: builtin/am.c:1914
+#, c-format
+msgid "The copy of the patch that failed is found in: %s"
+msgstr "실패한 패치의 복사본이 다음 위치에 있습니다: %s"
+
+#: builtin/am.c:1958
+msgid ""
+"No changes - did you forget to use 'git add'?\n"
+"If there is nothing left to stage, chances are that something else\n"
+"already introduced the same changes; you might want to skip this patch."
+msgstr ""
+"변경 사항이 없습니다 - 'git add' 사용을 잊으셨습니까?\n"
+"커밋으로 표시할 사항이 남아 있지 않으면, 이미 같은 패치에서 적용된\n"
+"경우일 수도 있습니다. 그런 경우에는 이 패치를 건너뛰면 됩니다."
+
+#: builtin/am.c:1965
+msgid ""
+"You still have unmerged paths in your index.\n"
+"Did you forget to use 'git add'?"
+msgstr ""
+"인덱스에 병합하지 않은 경로가 남아 있습니다.\n"
+"'git add' 사용을 잊지 않으셨습니까?"
+
+#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308
+#: builtin/reset.c:316
+#, c-format
+msgid "Could not parse object '%s'."
+msgstr "'%s' 오브젝트를 파싱할 수 없습니다."
+
+#: builtin/am.c:2125
+msgid "failed to clean index"
+msgstr "인덱스 지우기에 실패했습니다"
+
+#: builtin/am.c:2159
+msgid ""
+"You seem to have moved HEAD since the last 'am' failure.\n"
+"Not rewinding to ORIG_HEAD"
+msgstr ""
+"마지막 'am' 실패 이후 HEAD를 옮긴 것 같습니다.\n"
+"ORIG_HEAD로 되돌리지 않습니다."
+
+#: builtin/am.c:2220
+#, c-format
+msgid "Invalid value for --patch-format: %s"
+msgstr "--patch-format 옵션에 대해 잘못된 값: %s"
+
+#: builtin/am.c:2253
+msgid "git am [<options>] [(<mbox>|<Maildir>)...]"
+msgstr "git am [<옵션>] [(<mbox>|<Maildir>)...]"
+
+#: builtin/am.c:2254
+msgid "git am [<options>] (--continue | --skip | --abort)"
+msgstr "git am [<옵션>] (--continue | --skip | --abort)"
+
+#: builtin/am.c:2260
+msgid "run interactively"
+msgstr "대화형으로 실행합니다"
+
+#: builtin/am.c:2262
+msgid "historical option -- no-op"
+msgstr "아무 동작도 하지 않습니다 (과거부터 있었던 옵션)"
+
+#: builtin/am.c:2264
+msgid "allow fall back on 3way merging if needed"
+msgstr "필요하면 3-방향 병합으로 대신하도록 허용합니다"
+
+#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57
+#: builtin/repack.c:171
+msgid "be quiet"
+msgstr "간략히 표시합니다"
+
+#: builtin/am.c:2267
+msgid "add a Signed-off-by line to the commit message"
+msgstr "커밋 메시지에 Signed-off-by 줄을 남깁니다"
+
+#: builtin/am.c:2270
+msgid "recode into utf8 (default)"
+msgstr "UTF-8 인코딩으로 변환합니다 (기본값)"
+
+#: builtin/am.c:2272
+msgid "pass -k flag to git-mailinfo"
+msgstr "git-mailinfo에 -k 옵션을 씁니다"
+
+#: builtin/am.c:2274
+msgid "pass -b flag to git-mailinfo"
+msgstr "git-mailinfo에 -b 옵션을 씁니다"
+
+#: builtin/am.c:2276
+msgid "pass -m flag to git-mailinfo"
+msgstr "git-mailinfo에 -m 옵션을 씁니다"
+
+#: builtin/am.c:2278
+msgid "pass --keep-cr flag to git-mailsplit for mbox format"
+msgstr "mbox 형식에 대해 git-mailsplit에 --keep-cr 옵션을 사용합니다"
+
+#: builtin/am.c:2281
+msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr"
+msgstr ""
+"am.keepcr에 무관하게 git-mailsplit에 --keep-cr 옵션을 사용하지 않습니다."
+
+#: builtin/am.c:2284
+msgid "strip everything before a scissors line"
+msgstr "절취선 앞의 모든 사항을 무시합니다"
+
+#: builtin/am.c:2285 builtin/apply.c:4554
+msgid "action"
+msgstr "동작"
+
+#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295
+#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307
+#: builtin/am.c:2313
+msgid "pass it through git-apply"
+msgstr "git-apply에 넘깁니다"
+
+#: builtin/am.c:2294 builtin/apply.c:4578
+msgid "root"
+msgstr "최상위"
+
+#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516
+#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93
+#: builtin/pull.c:167 builtin/submodule--helper.c:78
+#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169
+msgid "path"
+msgstr "경로"
+
+#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669
+#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127
+#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645
+#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132
+#: parse-options.h:134 parse-options.h:244
+msgid "n"
+msgstr "n"
+
+#: builtin/am.c:2306 builtin/apply.c:4522
+msgid "num"
+msgstr "개수"
+
+#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438
+#: builtin/tag.c:372
+msgid "format"
+msgstr "형식"
+
+#: builtin/am.c:2310
+msgid "format the patch(es) are in"
+msgstr "패치의 형식"
+
+#: builtin/am.c:2316
+msgid "override error message when patch failure occurs"
+msgstr "패치 실패가 발생했을 때 오류 메시지 대신 사용합니다"
+
+#: builtin/am.c:2318
+msgid "continue applying patches after resolving a conflict"
+msgstr "충돌을 해결한 다음 패치 적용을 계속합니다"
+
+#: builtin/am.c:2321
+msgid "synonyms for --continue"
+msgstr "--continue 옵션과 동일"
+
+#: builtin/am.c:2324
+msgid "skip the current patch"
+msgstr "현재 패치 건너뛰기"
+
+#: builtin/am.c:2327
+msgid "restore the original branch and abort the patching operation."
+msgstr "원래 브랜치를 복구하고 패치 적용 작업을 중지합니다."
+
+# NOTE: 옵션의 의미는 이게 맞다. 원문에서는 사용자가
+# --committer-date-is-author-date라는 옵션을 보고 의미를 알 수 있다고 가정하고 있다.
+#: builtin/am.c:2331
+msgid "lie about committer date"
+msgstr "커미터 시각을 작성자 시각으로 넣습니다"
+
+#: builtin/am.c:2333
+msgid "use current timestamp for author date"
+msgstr "현재 시각을 작성자 시각으로 사용합니다"
+
+#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225
+#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355
+msgid "key-id"
+msgstr "키-ID"
+
+#: builtin/am.c:2336
+msgid "GPG-sign commits"
+msgstr "GPG 서명 커밋"
+
+#: builtin/am.c:2339
+msgid "(internal use for git-rebase)"
+msgstr "(git-rebase를 위한 내부 용도)"
+
+#: builtin/am.c:2354
+msgid ""
+"The -b/--binary option has been a no-op for long time, and\n"
+"it will be removed. Please do not use it anymore."
+msgstr ""
+"-b/--binary 옵션은 오랜 시간 동안 아무 동작도 하지 않았으므로, 이\n"
+"옵션은 제거될 예정입니다. 이제 사용하지 마십시오."
+
+#: builtin/am.c:2361
+msgid "failed to read the index"
+msgstr "인덱스 읽기에 실패했습니다"
+
+#: builtin/am.c:2376
+#, c-format
+msgid "previous rebase directory %s still exists but mbox given."
+msgstr "이전 리베이스 디렉터리 %s이(가) 아직 있고 mbox를 지정했습니다."
+
+#: builtin/am.c:2400
+#, c-format
+msgid ""
+"Stray %s directory found.\n"
+"Use \"git am --abort\" to remove it."
+msgstr ""
+"벗어난 %s 디렉터리가 발견되었습니다.\n"
+"제거하려면 \"git am --abort\"를 사용하십시오."
+
+#: builtin/am.c:2406
+msgid "Resolve operation not in progress, we are not resuming."
+msgstr "해소 작업이 진행 중입니다. 다시 시작하지 않습니다."
+
+#: builtin/apply.c:59
+msgid "git apply [<options>] [<patch>...]"
+msgstr "git apply [<옵션>] [<패치>...]"
+
+#: builtin/apply.c:111
+#, c-format
+msgid "unrecognized whitespace option '%s'"
+msgstr "알 수 없는 공백 옵션 '%s'"
+
+#: builtin/apply.c:126
+#, c-format
+msgid "unrecognized whitespace ignore option '%s'"
+msgstr "알 수 없는 공백 무시 옵션 '%s'"
+
+#: builtin/apply.c:818
+#, c-format
+msgid "Cannot prepare timestamp regexp %s"
+msgstr "타임스탬프 정규식을 준비할 수 없습니다 (%s)"
+
+#: builtin/apply.c:827
+#, c-format
+msgid "regexec returned %d for input: %s"
+msgstr "regexec()에서 다음 입력에 대해 %d번을 리턴했습니다: %s"
+
+#: builtin/apply.c:908
+#, c-format
+msgid "unable to find filename in patch at line %d"
+msgstr "패치의 %d번 줄에 파일 이름을 찾을 수 없습니다"
+
+#: builtin/apply.c:940
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d"
+msgstr "git apply: 잘못된 git-diff - %2$d번 줄에서 /dev/null을 기대했지만, '%1$s'이(가) 왔습니다"
+
+#: builtin/apply.c:944
+#, c-format
+msgid "git apply: bad git-diff - inconsistent new filename on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에 새 파일 이름이 올바르지 않습니다"
+
+#: builtin/apply.c:945
+#, c-format
+msgid "git apply: bad git-diff - inconsistent old filename on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에 예전 파일 이름이 올바르지 않습니다"
+
+#: builtin/apply.c:952
+#, c-format
+msgid "git apply: bad git-diff - expected /dev/null on line %d"
+msgstr "git apply: 잘못된 git-diff - %d번 줄에서 /dev/null을 기대했습니다"
+
+#: builtin/apply.c:1415
+#, c-format
+msgid "recount: unexpected line: %.*s"
+msgstr "recount: 예상치 못한 줄: %.*s"
+
+#: builtin/apply.c:1472
+#, c-format
+msgid "patch fragment without header at line %d: %.*s"
+msgstr "%d번 줄에 헤더 없는 패치 부분: %.*s"
+
+#: builtin/apply.c:1489
+#, 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] ""
+"경로 이름 부분에서 %d개를 제거라 때 git diff 헤더에 파일 이름 정보가 없습니"
+"다. (%d번 줄)"
+
+#: builtin/apply.c:1655
+msgid "new file depends on old contents"
+msgstr "새 파일이 예전 내용에 의존합니다"
+
+#: builtin/apply.c:1657
+msgid "deleted file still has contents"
+msgstr "삭제한 파일에 아직 내용이 들어 있습니다"
+
+#: builtin/apply.c:1683
+#, c-format
+msgid "corrupt patch at line %d"
+msgstr "패치가 %d번 줄에서 망가졌습니다"
+
+#: builtin/apply.c:1719
+#, c-format
+msgid "new file %s depends on old contents"
+msgstr "새 파일 %s이(가) 예전 내용에 의존합니다"
+
+#: builtin/apply.c:1721
+#, c-format
+msgid "deleted file %s still has contents"
+msgstr "삭제한 파일 %s이(가) 아직 내용이 들어 있습니다"
+
+#: builtin/apply.c:1724
+#, c-format
+msgid "** warning: file %s becomes empty but is not deleted"
+msgstr "** 경고: %s 파일의 내용이 비어 있지만 삭제되지 않았습니다"
+
+#: builtin/apply.c:1870
+#, c-format
+msgid "corrupt binary patch at line %d: %.*s"
+msgstr "%d번 줄에 바이너리 패치가 손상되었습니다: %.*s"
+
+#: builtin/apply.c:1899
+#, c-format
+msgid "unrecognized binary patch at line %d"
+msgstr "%d번 줄에 바이너리 패치가 이해할 수 없습니다"
+
+#: builtin/apply.c:2050
+#, c-format
+msgid "patch with only garbage at line %d"
+msgstr "%d번 줄에 쓰레기 데이터만 있는 패치"
+
+#: builtin/apply.c:2140
+#, c-format
+msgid "unable to read symlink %s"
+msgstr "%s 심볼릭 링크를 읽을 수 없습니다"
+
+#: builtin/apply.c:2144
+#, c-format
+msgid "unable to open or read %s"
+msgstr "%s을(를) 열거나 읽을 수 없습니다"
+
+#: builtin/apply.c:2777
+#, c-format
+msgid "invalid start of line: '%c'"
+msgstr "줄 시작이 잘못됨: '%c'"
+
+#: builtin/apply.c:2896
+#, c-format
+msgid "Hunk #%d succeeded at %d (offset %d line)."
+msgid_plural "Hunk #%d succeeded at %d (offset %d lines)."
+msgstr[0] "패치 %d번 부분 %d번 줄에서 성공 (오프셋 %d줄)"
+
+#: builtin/apply.c:2908
+#, c-format
+msgid "Context reduced to (%ld/%ld) to apply fragment at %d"
+msgstr "컨텍스트가 (%ld/%ld)로 줄어듭니다. (%d번 줄에서 적용)"
+
+#: builtin/apply.c:2914
+#, c-format
+msgid ""
+"while searching for:\n"
+"%.*s"
+msgstr ""
+"다음을 검색하던 중:\n"
+"%.*s"
+
+#: builtin/apply.c:2934
+#, c-format
+msgid "missing binary patch data for '%s'"
+msgstr "'%s'에 대한 바이너리 패치 데이터가 없습니다"
+
+#: builtin/apply.c:3035
+#, c-format
+msgid "binary patch does not apply to '%s'"
+msgstr "바이너리 패치를 '%s'에 적용할 수 없습니다"
+
+#: builtin/apply.c:3041
+#, c-format
+msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)"
+msgstr ""
+"'%s'에 대한 바이너리 패치가 올바르지 않은 결과를 만듭니다. (기대한 값 %s, 실"
+"제 %s)"
+
+#: builtin/apply.c:3062
+#, c-format
+msgid "patch failed: %s:%ld"
+msgstr "패치 실패: %s:%ld"
+
+#: builtin/apply.c:3186
+#, c-format
+msgid "cannot checkout %s"
+msgstr "%s을(를) 가져올 수 없습니다"
+
+#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287
+#, c-format
+msgid "read of %s failed"
+msgstr "%s 읽기가 실패했습니다"
+
+#: builtin/apply.c:3239
+#, c-format
+msgid "reading from '%s' beyond a symbolic link"
+msgstr "심볼릭 링크 뒤에 있는 '%s' 읽기"
+
+#: builtin/apply.c:3267 builtin/apply.c:3489
+#, c-format
+msgid "path %s has been renamed/deleted"
+msgstr "%s 경로가 이름이 바뀌었거나 삭제되었습니다"
+
+#: builtin/apply.c:3348 builtin/apply.c:3503
+#, c-format
+msgid "%s: does not exist in index"
+msgstr "%s: 인덱스에 없습니다"
+
+#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: builtin/apply.c:3357 builtin/apply.c:3511
+#, c-format
+msgid "%s: does not match index"
+msgstr "%s: 인덱스와 맞지 않습니다"
+
+#: builtin/apply.c:3459
+msgid "removal patch leaves file contents"
+msgstr "제거하는 패치 다음에 파일 내용이 남았습니다"
+
+#: builtin/apply.c:3528
+#, c-format
+msgid "%s: wrong type"
+msgstr "%s: 잘못된 종류"
+
+#: builtin/apply.c:3530
+#, c-format
+msgid "%s has type %o, expected %o"
+msgstr "%s의 종류가 %o이지만 %o이(가) 되어야 합니다"
+
+#: builtin/apply.c:3689 builtin/apply.c:3691
+#, c-format
+msgid "invalid path '%s'"
+msgstr "잘못된 경로 '%s'"
+
+#: builtin/apply.c:3746
+#, c-format
+msgid "%s: already exists in index"
+msgstr "%s: 이미 인덱스에 있습니다"
+
+#: builtin/apply.c:3749
+#, c-format
+msgid "%s: already exists in working directory"
+msgstr "%s: 이미 작업 디렉터리에 있습니다"
+
+#: builtin/apply.c:3769
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o)"
+msgstr "%2$s의 새 모드(%1$o)가 예전 모드(%3$o)와 다릅니다"
+
+#: builtin/apply.c:3774
+#, c-format
+msgid "new mode (%o) of %s does not match old mode (%o) of %s"
+msgstr "%2$s의 새 모드(%1$o)가 %4$s의 예전 모드(%3$o)와 다릅니다"
+
+#: builtin/apply.c:3794
+#, c-format
+msgid "affected file '%s' is beyond a symbolic link"
+msgstr "영향 받는 '%s' 파일이 심볼릭 링크 뒤에 있습니다"
+
+#: builtin/apply.c:3798
+#, c-format
+msgid "%s: patch does not apply"
+msgstr "%s: 패치를 적용하지 않습니다"
+
+#: builtin/apply.c:3812
+#, c-format
+msgid "Checking patch %s..."
+msgstr "%s 패치를 확인하는 중입니다..."
+
+#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135
+#, c-format
+msgid "make_cache_entry failed for path '%s'"
+msgstr "경로 '%s'에 대해 make_cache_entry 실패"
+
+#: builtin/apply.c:4048
+#, c-format
+msgid "unable to remove %s from index"
+msgstr "인덱스에서 %s을(를) 제거할 수 없습니다"
+
+#: builtin/apply.c:4077
+#, c-format
+msgid "corrupt patch for submodule %s"
+msgstr "하위 모듈 %s에 대해 손상된 패치"
+
+#: builtin/apply.c:4081
+#, c-format
+msgid "unable to stat newly created file '%s'"
+msgstr "새로 만든 파일 '%s'에 대해 stat()할 수 없습니다"
+
+#: builtin/apply.c:4086
+#, c-format
+msgid "unable to create backing store for newly created file %s"
+msgstr "새로 만든 파일 '%s'에 대해 예비 저장소를 만들 수 없습니다"
+
+#: builtin/apply.c:4089 builtin/apply.c:4197
+#, c-format
+msgid "unable to add cache entry for %s"
+msgstr "%s에 대해 캐시 항목을 추가할 수 없습니다"
+
+#: builtin/apply.c:4122
+#, c-format
+msgid "closing file '%s'"
+msgstr "'%s' 파일을 닫는 중입니다"
+
+#: builtin/apply.c:4171
+#, c-format
+msgid "unable to write file '%s' mode %o"
+msgstr "'%s' 파일에 쓸 수 없습니다 ('%o' 모드)"
+
+#: builtin/apply.c:4258
+#, c-format
+msgid "Applied patch %s cleanly."
+msgstr "%s 패치 깔끔하게 적용."
+
+#: builtin/apply.c:4266
+msgid "internal error"
+msgstr "내부 오류"
+
+#: builtin/apply.c:4269
+#, c-format
+msgid "Applying patch %%s with %d reject..."
+msgid_plural "Applying patch %%s with %d rejects..."
+msgstr[0] "%%s 패치를 (%d개 거부) 적용..."
+
+#: builtin/apply.c:4279
+#, c-format
+msgid "truncating .rej filename to %.*s.rej"
+msgstr "truncating .rej 파일 이름을 '%.*s.rej'(으)로 자름"
+
+#: builtin/apply.c:4300
+#, c-format
+msgid "Hunk #%d applied cleanly."
+msgstr "패치 부위 #%d 깔끔하게 적용."
+
+#: builtin/apply.c:4303
+#, c-format
+msgid "Rejected hunk #%d."
+msgstr "패치 부위 #%d 거부됨."
+
+#: builtin/apply.c:4393
+msgid "unrecognized input"
+msgstr "인식할 수 없는 입력"
+
+#: builtin/apply.c:4404
+msgid "unable to read index file"
+msgstr "인덱스 파일을 읽을 수 없습니다"
+
+#: builtin/apply.c:4517
+msgid "don't apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용하지 않습니다"
+
+#: builtin/apply.c:4520
+msgid "apply changes matching the given path"
+msgstr "주어진 경로에 해당하는 변경 사항을 적용합니다"
+
+#: builtin/apply.c:4523
+msgid "remove <num> leading slashes from traditional diff paths"
+msgstr "전통적인 diff 경로 앞의 <개수>개의 앞 슬래시(/)를 제거합니다"
+
+#: builtin/apply.c:4526
+msgid "ignore additions made by the patch"
+msgstr "패치에서 추가하는 파일을 무시합니다"
+
+#: builtin/apply.c:4528
+msgid "instead of applying the patch, output diffstat for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 diffstat을 출력합니다"
+
+#: builtin/apply.c:4532
+msgid "show number of added and deleted lines in decimal notation"
+msgstr "십진수로 추가 및 삭제한 줄 수를 표시합니다"
+
+#: builtin/apply.c:4534
+msgid "instead of applying the patch, output a summary for the input"
+msgstr "패치를 적용하는 대신, 입력에 대한 요약을 출력합니다"
+
+#: builtin/apply.c:4536
+msgid "instead of applying the patch, see if the patch is applicable"
+msgstr "패치를 적용하는 대신, 패치를 적용 가능한지 확인합니다"
+
+#: builtin/apply.c:4538
+msgid "make sure the patch is applicable to the current index"
+msgstr "현재 인덱스에서 패치가 적용 가능한지 확인합니다"
+
+#: builtin/apply.c:4540
+msgid "apply a patch without touching the working tree"
+msgstr "작업 폴더를 바꾸지 않고 패치를 적용합니다"
+
+#: builtin/apply.c:4542
+msgid "accept a patch that touches outside the working area"
+msgstr "작업 영역 밖의 파일을 바꾸는 패치를 허용합니다"
+
+#: builtin/apply.c:4544
+msgid "also apply the patch (use with --stat/--summary/--check)"
+msgstr "그리고 패치도 적용합니다 (--stat/--summary/--check 옵션과 같이 사용)"
+
+#: builtin/apply.c:4546
+msgid "attempt three-way merge if a patch does not apply"
+msgstr "패치를 적용하지 않으면 3-방향 병합을 시도합니다"
+
+#: builtin/apply.c:4548
+msgid "build a temporary index based on embedded index information"
+msgstr "내장 인덱스 정보를 사용해 임시 인덱스를 만듭니다"
+
+#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412
+msgid "paths are separated with NUL character"
+msgstr "경로를 NUL 문자로 구분합니다"
+
+#: builtin/apply.c:4553
+msgid "ensure at least <n> lines of context match"
+msgstr "최소한 <n>줄이 컨텍스트와 일치하는지 확인합니다"
+
+#: builtin/apply.c:4555
+msgid "detect new or modified lines that have whitespace errors"
+msgstr "공백 오류가 있는 추가됐거나 수정된 줄을 찾습니다"
+
+#: builtin/apply.c:4558 builtin/apply.c:4561
+msgid "ignore changes in whitespace when finding context"
+msgstr "컨텍스트를 찾을 때 공백 변경 사항을 무시합니다"
+
+#: builtin/apply.c:4564
+msgid "apply the patch in reverse"
+msgstr "패치를 반대 순서로 적용합니다"
+
+#: builtin/apply.c:4566
+msgid "don't expect at least one line of context"
+msgstr "최소한의 컨텍스트 한 줄도 없이 적용합니다"
+
+#: builtin/apply.c:4568
+msgid "leave the rejected hunks in corresponding *.rej files"
+msgstr "거부된 패치 부분을 대응되는 *.rej 파일에 남겨둡니다"
+
+#: builtin/apply.c:4570
+msgid "allow overlapping hunks"
+msgstr "패치 부분이 겹쳐도 허용합니다"
+
+#: builtin/apply.c:4573
+msgid "tolerate incorrectly detected missing new-line at the end of file"
+msgstr "파일 끝에 줄바꿈이 빠졌음을 잘못 검색한 경우에 무시합니다"
+
+#: builtin/apply.c:4576
+msgid "do not trust the line counts in the hunk headers"
+msgstr "패치 부분의 헤더의 줄 수를 신용하지 않습니다"
+
+#: builtin/apply.c:4579
+msgid "prepend <root> to all filenames"
+msgstr "모든 파일 이름에 <최상위>를 앞에 붙입니다"
+
+#: builtin/apply.c:4601
+msgid "--3way outside a repository"
+msgstr "저장소 밖에서 --3way 옵션 사용"
+
+#: builtin/apply.c:4609
+msgid "--index outside a repository"
+msgstr "저장소 밖에서 --index 옵션 사용"
+
+#: builtin/apply.c:4612
+msgid "--cached outside a repository"
+msgstr "저장소 밖에서 --cached 옵션 사용"
+
+#: builtin/apply.c:4631
+#, c-format
+msgid "can't open patch '%s'"
+msgstr "'%s' 패치를 열 수 없습니다"
+
+#: builtin/apply.c:4645
+#, c-format
+msgid "squelched %d whitespace error"
+msgid_plural "squelched %d whitespace errors"
+msgstr[0] "공백 오류 %d개를 넘어갑니다"
+
+#: builtin/apply.c:4651 builtin/apply.c:4661
+#, c-format
+msgid "%d line adds whitespace errors."
+msgid_plural "%d lines add whitespace errors."
+msgstr[0] "%d줄에서 공백 오류를 추가합니다."
+
+#: builtin/archive.c:17
+#, c-format
+msgid "could not create archive file '%s'"
+msgstr "'%s' 아카이브 파일을 만들 수 없습니다"
+
+#: builtin/archive.c:20
+msgid "could not redirect output"
+msgstr "출력 방향을 돌릴 수 없습니다"
+
+#: builtin/archive.c:37
+msgid "git archive: Remote with no URL"
+msgstr "git archive: URL 없는 리모트"
+
+#: builtin/archive.c:58
+msgid "git archive: expected ACK/NAK, got EOF"
+msgstr "git archive: ACK/NAK가 와야 하지만, EOF를 받았습니다"
+
+#: builtin/archive.c:61
+#, c-format
+msgid "git archive: NACK %s"
+msgstr "git archive: NACK %s"
+
+#: builtin/archive.c:63
+#, c-format
+msgid "remote error: %s"
+msgstr "리모트 오류: %s"
+
+#: builtin/archive.c:64
+msgid "git archive: protocol error"
+msgstr "git archive: 프로토콜 오류"
+
+#: builtin/archive.c:68
+msgid "git archive: expected a flush"
+msgstr "git archive: 파일 끝을 예상함"
+
+#: builtin/bisect--helper.c:7
+msgid "git bisect--helper --next-all [--no-checkout]"
+msgstr "git bisect--helper --next-all [--no-checkout]"
+
+#: builtin/bisect--helper.c:17
+msgid "perform 'git bisect next'"
+msgstr "'git bisect next'를 수행합니다"
+
+#: builtin/bisect--helper.c:19
+msgid "update BISECT_HEAD instead of checking out the current commit"
+msgstr "현재 커밋을 가져오는 대신 BISECT_HEAD를 업데이트합니다"
+
+#: builtin/blame.c:32
+msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"
+msgstr "git blame [<옵션>] [<리비전-옵션>] [<리비전>] [--] <파일>"
+
+#: builtin/blame.c:37
+msgid "<rev-opts> are documented in git-rev-list(1)"
+msgstr "<리비전-옵션>은 git-rev-list(1)에 설명되어 있습니다"
+
+#: builtin/blame.c:2519
+msgid "Show blame entries as we find them, incrementally"
+msgstr "blame 항목을 찾자마자 점진적으로 표시합니다"
+
+#: builtin/blame.c:2520
+msgid "Show blank SHA-1 for boundary commits (Default: off)"
+msgstr "가장자리 커밋에 대해 빈 SHA-1을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2521
+msgid "Do not treat root commits as boundaries (Default: off)"
+msgstr "최상위 커밋을 가장자리 커밋으로 취급하지 않습니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2522
+msgid "Show work cost statistics"
+msgstr "작업 비용 통계를 표시합니다"
+
+#: builtin/blame.c:2523
+msgid "Show output score for blame entries"
+msgstr "blame 항목에 대해 출력 점수를 표시합니다"
+
+#: builtin/blame.c:2524
+msgid "Show original filename (Default: auto)"
+msgstr "원래 파일 이름 표시 (기본값: 자동)"
+
+#: builtin/blame.c:2525
+msgid "Show original linenumber (Default: off)"
+msgstr "원래 줄 번호 표시 (기본값: 하지 않음)"
+
+#: builtin/blame.c:2526
+msgid "Show in a format designed for machine consumption"
+msgstr "컴퓨터 처리용으로 설계된 형식으로 표시합니다"
+
+#: builtin/blame.c:2527
+msgid "Show porcelain format with per-line commit information"
+msgstr "줄마다 커밋 정보가 표시되는 사용자용 형식으로 표시합니다"
+
+#: builtin/blame.c:2528
+msgid "Use the same output mode as git-annotate (Default: off)"
+msgstr "git-annotate와 동일한 형식을 사용합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2529
+msgid "Show raw timestamp (Default: off)"
+msgstr "내부 형식으로 시각을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2530
+msgid "Show long commit SHA1 (Default: off)"
+msgstr "길게 커밋 SHA1을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2531
+msgid "Suppress author name and timestamp (Default: off)"
+msgstr "작성자 이름과 시각을 표시하지 않습니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2532
+msgid "Show author email instead of name (Default: off)"
+msgstr "작성자 이름 대신에 전자메일을 표시합니다 (기본값: 꺼짐)"
+
+#: builtin/blame.c:2533
+msgid "Ignore whitespace differences"
+msgstr "공백 문자 차이점을 무시합니다"
+
+#: builtin/blame.c:2534
+msgid "Spend extra cycles to find better match"
+msgstr "더 일치하는 항목을 찾는데 더 시간을 소모합니다"
+
+#: builtin/blame.c:2535
+msgid "Use revisions from <file> instead of calling git-rev-list"
+msgstr "git-rev-list를 호출하는 대신 <파일>에서 리비전을 사용합니다"
+
+#: builtin/blame.c:2536
+msgid "Use <file>'s contents as the final image"
+msgstr "<파일>의 내용을 최종 이미지로 사용합니다"
+
+#: builtin/blame.c:2537 builtin/blame.c:2538
+msgid "score"
+msgstr "점수"
+
+#: builtin/blame.c:2537
+msgid "Find line copies within and across files"
+msgstr "파일 내부와 파일 사이의 복사된 줄을 찾습니다"
+
+#: builtin/blame.c:2538
+msgid "Find line movements within and across files"
+msgstr "파일 내부와 파일 사이의 옮겨진 줄을 찾습니다"
+
+#: builtin/blame.c:2539
+msgid "n,m"
+msgstr "n,m"
+
+#: builtin/blame.c:2539
+msgid "Process only line range n,m, counting from 1"
+msgstr "n,m줄 (1번 줄부터 시작) 사이의 범위만 처리"
+
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output.  For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2620
+msgid "4 years, 11 months ago"
+msgstr "4년 11달 전"
+
+#: builtin/branch.c:25
+msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]"
+msgstr "git branch [<옵션>] [-r | -a] [--merged | --no-merged]"
+
+#: builtin/branch.c:26
+msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"
+msgstr "git branch [<옵션>] [-l] [-f] <브랜치-이름> [<시작-지점>]"
+
+#: builtin/branch.c:27
+msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..."
+msgstr "git branch [<옵션>] [-r] (-d | -D) <브랜치-이름>..."
+
+#: builtin/branch.c:28
+msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"
+msgstr "git branch [<옵션>] (-m | -M) [<과거-브랜치>] <새-브랜치>"
+
+#: builtin/branch.c:29
+msgid "git branch [<options>] [-r | -a] [--points-at]"
+msgstr "git branch [<옵션>] [-r | -a] [--points-at]"
+
+#: builtin/branch.c:142
+#, c-format
+msgid ""
+"deleting branch '%s' that has been merged to\n"
+"         '%s', but not yet merged to HEAD."
+msgstr ""
+"'%s' 브랜치를 삭제합니다. 이 브랜치는 '%s'에\n"
+"         병합되었지만, HEAD에는 병합되지 않았습니다."
+
+#: builtin/branch.c:146
+#, c-format
+msgid ""
+"not deleting branch '%s' that is not yet merged to\n"
+"         '%s', even though it is merged to HEAD."
+msgstr ""
+"'%s' 브랜치를 삭제하지 않습니다. 이 브랜치는 '%s'에\n"
+"         병합되지 않았지만, HEAD에는 병합되었습니다."
+
+#: builtin/branch.c:160
+#, c-format
+msgid "Couldn't look up commit object for '%s'"
+msgstr "'%s'에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
+
+#: builtin/branch.c:164
+#, c-format
+msgid ""
+"The branch '%s' is not fully merged.\n"
+"If you are sure you want to delete it, run 'git branch -D %s'."
+msgstr ""
+"'%s' 브랜치가 완전히 병합되지 않았습니다.\n"
+"정말로 삭제하려면 'git branch -D %s' 명령을 실행하십시오."
+
+#: builtin/branch.c:177
+msgid "Update of config-file failed"
+msgstr "config-file 업데이트가 실패했습니다"
+
+#: builtin/branch.c:205
+msgid "cannot use -a with -d"
+msgstr "-a 옵션을 -d 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/branch.c:211
+msgid "Couldn't look up commit object for HEAD"
+msgstr "HEAD에 대한 커밋 오브젝트를 찾아볼 수 없습니다"
+
+#: builtin/branch.c:219
+#, c-format
+msgid "Cannot delete the branch '%s' which you are currently on."
+msgstr "'%s' 브랜치는 현재 위치한 브랜치이기 때문에 삭제할 수 없습니다."
+
+#: builtin/branch.c:235
+#, c-format
+msgid "remote-tracking branch '%s' not found."
+msgstr "리모트 추적 '%s' 브랜치가 없습니다."
+
+#: builtin/branch.c:236
+#, c-format
+msgid "branch '%s' not found."
+msgstr "'%s' 브랜치가 없습니다."
+
+#: builtin/branch.c:251
+#, c-format
+msgid "Error deleting remote-tracking branch '%s'"
+msgstr "리모트 추적 '%s' 브랜치를 삭제하는데 오류"
+
+#: builtin/branch.c:252
+#, c-format
+msgid "Error deleting branch '%s'"
+msgstr "'%s' 브랜치를 삭제하는데 오류"
+
+#: builtin/branch.c:259
+#, c-format
+msgid "Deleted remote-tracking branch %s (was %s).\n"
+msgstr "리모트 추적 '%s' 브랜치를 삭제합니다. (과거 %s)\n"
+
+#: builtin/branch.c:260
+#, c-format
+msgid "Deleted branch %s (was %s).\n"
+msgstr "%s 브랜치 삭제 (과거 %s).\n"
+
+#: builtin/branch.c:303
+#, c-format
+msgid "[%s: gone]"
+msgstr "[%s: 사라짐]"
+
+#: builtin/branch.c:308
+#, c-format
+msgid "[%s]"
+msgstr "[%s]"
+
+#: builtin/branch.c:313
+#, c-format
+msgid "[%s: behind %d]"
+msgstr "[%s: %d개 뒤]"
+
+#: builtin/branch.c:315
+#, c-format
+msgid "[behind %d]"
+msgstr "[%d개 뒤]"
+
+#: builtin/branch.c:319
+#, c-format
+msgid "[%s: ahead %d]"
+msgstr "[%s: %d개 앞]"
+
+#: builtin/branch.c:321
+#, c-format
+msgid "[ahead %d]"
+msgstr "[%d개 앞]"
+
+#: builtin/branch.c:324
+#, c-format
+msgid "[%s: ahead %d, behind %d]"
+msgstr "[%s: %d개 앞, %d개 뒤]"
+
+#: builtin/branch.c:327
+#, c-format
+msgid "[ahead %d, behind %d]"
+msgstr "[%d개 앞, %d개 뒤]"
+
+#: builtin/branch.c:340
+msgid " **** invalid ref ****"
+msgstr " **** 잘못된 레퍼런스 ****"
+
+#: builtin/branch.c:366
+#, c-format
+msgid "(no branch, rebasing %s)"
+msgstr "(브랜치 없음, %s 리베이스)"
+
+#: builtin/branch.c:369
+#, c-format
+msgid "(no branch, bisect started on %s)"
+msgstr "(브랜치 없음, 이등분 %s에서 시작)"
+
+#: builtin/branch.c:375
+#, c-format
+msgid "(HEAD detached at %s)"
+msgstr "(HEAD %s 위치에서 분리됨)"
+
+#: builtin/branch.c:378
+#, c-format
+msgid "(HEAD detached from %s)"
+msgstr "(HEAD %s(으)로부터 분리됨)"
+
+#: builtin/branch.c:382
+msgid "(no branch)"
+msgstr "(브랜치 없음)"
+
+#: builtin/branch.c:524
+msgid "cannot rename the current branch while not on any."
+msgstr "브랜치 위에 없으면서 현재 브랜치 이름을 바꿀 수 없습니다."
+
+#: builtin/branch.c:534
+#, c-format
+msgid "Invalid branch name: '%s'"
+msgstr "잘못된 브랜치 이름: '%s'"
+
+#: builtin/branch.c:549
+msgid "Branch rename failed"
+msgstr "브랜치 이름 바꾸기 실패"
+
+#: builtin/branch.c:553
+#, c-format
+msgid "Renamed a misnamed branch '%s' away"
+msgstr "이름이 잘못된 '%s' 브랜치의 이름을 다르게 바꿉니다"
+
+#: builtin/branch.c:557
+#, c-format
+msgid "Branch renamed to %s, but HEAD is not updated!"
+msgstr "브랜치 이름을 %s(으)로 바꾸지만, HEAD를 업데이트하지 않습니다!"
+
+#: builtin/branch.c:564
+msgid "Branch is renamed, but update of config-file failed"
+msgstr "브랜치의 이름을 바꾸지만, config-file 업데이트가 실패했습니다"
+
+#: builtin/branch.c:587
+#, c-format
+msgid "could not write branch description template: %s"
+msgstr "브랜치 설명 서식을 쓸 수 없습니다: %s"
+
+#: builtin/branch.c:616
+msgid "Generic options"
+msgstr "일반 옵션"
+
+# FIXME: give twice?
+#: builtin/branch.c:618
+msgid "show hash and subject, give twice for upstream branch"
+msgstr "해시와 제목을 표시하고, 업스트림 브랜치에 대한 위치를 표시합니다"
+
+#: builtin/branch.c:619
+msgid "suppress informational messages"
+msgstr "여러가지 안내 메시지를 표시하지 않습니다"
+
+#: builtin/branch.c:620
+msgid "set up tracking mode (see git-pull(1))"
+msgstr "추적 모드를 설정합니다 (git-pull(1) 참고)"
+
+#: builtin/branch.c:622
+msgid "change upstream info"
+msgstr "업스트림 정보를 바꿉니다"
+
+#: builtin/branch.c:626
+msgid "use colored output"
+msgstr "여러 색으로 출력합니다"
+
+#: builtin/branch.c:627
+msgid "act on remote-tracking branches"
+msgstr "리모트 추적 브랜치에 대해 동작합니다"
+
+#: builtin/branch.c:629 builtin/branch.c:630
+msgid "print only branches that contain the commit"
+msgstr "커밋이 있는 브랜치만 표시합니다"
+
+#: builtin/branch.c:633
+msgid "Specific git-branch actions:"
+msgstr "특정 git-branch 동작:"
+
+#: builtin/branch.c:634
+msgid "list both remote-tracking and local branches"
+msgstr "리모트와 로컬의 브랜치 목록을 모두 표시합니다"
+
+#: builtin/branch.c:636
+msgid "delete fully merged branch"
+msgstr "완전히 병합된 브랜치를 삭제합니다"
+
+#: builtin/branch.c:637
+msgid "delete branch (even if not merged)"
+msgstr "브랜치를 삭제합니다 (병합되지 않았더라도)"
+
+#: builtin/branch.c:638
+msgid "move/rename a branch and its reflog"
+msgstr "브랜치와 그 reflog를 옮기거나 이름을 바꿉니다"
+
+#: builtin/branch.c:639
+msgid "move/rename a branch, even if target exists"
+msgstr "대상이 이미 있더라도 브랜치를 옮기거나 이름을 바꿉니다"
+
+#: builtin/branch.c:640
+msgid "list branch names"
+msgstr "브랜치 이름 목록을 표시합니다"
+
+#: builtin/branch.c:641
+msgid "create the branch's reflog"
+msgstr "브랜치의 reflog를 만듭니다"
+
+#: builtin/branch.c:643
+msgid "edit the description for the branch"
+msgstr "브랜치의 설명을 편집합니다"
+
+#: builtin/branch.c:644
+msgid "force creation, move/rename, deletion"
+msgstr "강제로 만들고, 옮기거나 이름을 바꾸고, 삭제합니다"
+
+#: builtin/branch.c:645
+msgid "print only branches that are merged"
+msgstr "병합되는 브랜치만 표시합니다"
+
+#: builtin/branch.c:646
+msgid "print only branches that are not merged"
+msgstr "병합되지 않는 브랜치만 표시합니다"
+
+#: builtin/branch.c:647
+msgid "list branches in columns"
+msgstr "목록을 여러 열로 표시합니다"
+
+#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366
+msgid "key"
+msgstr "키"
+
+#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367
+msgid "field name to sort on"
+msgstr "정렬한 기준이 되는 필드 이름"
+
+#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398
+#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564
+#: builtin/tag.c:369
+msgid "object"
+msgstr "오브젝트"
+
+#: builtin/branch.c:652
+msgid "print only branches of the object"
+msgstr "해당 오브젝트의 브랜치만 표시합니다"
+
+#: builtin/branch.c:670
+msgid "Failed to resolve HEAD as a valid ref."
+msgstr "HEAD를 올바른 레퍼런스로 구해내는데 실패했습니다."
+
+#: builtin/branch.c:674 builtin/clone.c:697
+msgid "HEAD not found below refs/heads!"
+msgstr "레퍼런스/헤드 아래에 HEAD가 없습니다!"
+
+#: builtin/branch.c:694
+msgid "--column and --verbose are incompatible"
+msgstr "--column 및 --verbose 옵션은 호환되지 않습니다"
+
+#: builtin/branch.c:705 builtin/branch.c:747
+msgid "branch name required"
+msgstr "브랜치 이름이 필요합니다"
+
+#: builtin/branch.c:723
+msgid "Cannot give description to detached HEAD"
+msgstr "분리된 HEAD에 대한 설명을 부여할 수 없습니다"
+
+#: builtin/branch.c:728
+msgid "cannot edit description of more than one branch"
+msgstr "여러 브랜치에 대한 설명을 편집할 수 없습니다"
+
+#: builtin/branch.c:735
+#, c-format
+msgid "No commit on branch '%s' yet."
+msgstr "아직 '%s' 브랜치에 커밋이 없습니다."
+
+#: builtin/branch.c:738
+#, c-format
+msgid "No branch named '%s'."
+msgstr "이름이 '%s'인 브랜치가 없습니다."
+
+#: builtin/branch.c:753
+msgid "too many branches for a rename operation"
+msgstr "이름 바꾸기 작업에 대해 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:758
+msgid "too many branches to set new upstream"
+msgstr "새 업스트림을 설정하는데 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:762
+#, c-format
+msgid ""
+"could not set upstream of HEAD to %s when it does not point to any branch."
+msgstr "HEAD의 업스트림을 %s(으)로 설정할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
+
+#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808
+#, c-format
+msgid "no such branch '%s'"
+msgstr "그런 브랜치가 ('%s') 없습니다"
+
+#: builtin/branch.c:769
+#, c-format
+msgid "branch '%s' does not exist"
+msgstr "'%s' 브랜치가 없습니다"
+
+#: builtin/branch.c:781
+msgid "too many branches to unset upstream"
+msgstr "업스트림 설정을 해제하는데 브랜치가 너무 많습니다"
+
+#: builtin/branch.c:785
+msgid "could not unset upstream of HEAD when it does not point to any branch."
+msgstr "HEAD의 업스트림 설정을 해제할 수 없습니다. 어떤 브랜치도 가리키지 않습니다."
+
+#: builtin/branch.c:791
+#, c-format
+msgid "Branch '%s' has no upstream information"
+msgstr "'%s' 브랜치에 업스트림 정보가 없습니다"
+
+#: builtin/branch.c:805
+msgid "it does not make sense to create 'HEAD' manually"
+msgstr "'HEAD'를 수동으로 만드는 건 앞뒤가 맞지 않습니다"
+
+#: builtin/branch.c:811
+msgid "-a and -r options to 'git branch' do not make sense with a branch name"
+msgstr "'git branch'에 대해 -a 및 -r 옵션은 브랜치 이름과 같이 쓰면 앞뒤가 맞지 않습니다"
+
+#: builtin/branch.c:814
+#, c-format
+msgid ""
+"The --set-upstream flag is deprecated and will be removed. Consider using --"
+"track or --set-upstream-to\n"
+msgstr "--set-upstream 옵션은 더 이상 사용되지 않고 제거될 예정입니다. --track 또는 --set-upstream-to 옵션을 사용해 보십시오\n"
+
+#: builtin/branch.c:831
+#, c-format
+msgid ""
+"\n"
+"If you wanted to make '%s' track '%s', do this:\n"
+"\n"
+msgstr "\n'%s'을(를) 만들고 '%s'을(를) 추적하게 하려면, 다음을 하십시오:\n"
+
+#: builtin/branch.c:832
+#, c-format
+msgid "    git branch -d %s\n"
+msgstr "    git branch -d %s\n"
+
+#: builtin/branch.c:833
+#, c-format
+msgid "    git branch --set-upstream-to %s\n"
+msgstr "    git branch --set-upstream-to %s\n"
+
+#: builtin/bundle.c:51
+#, c-format
+msgid "%s is okay\n"
+msgstr "%s 정상입니다\n"
+
+#: builtin/bundle.c:64
+msgid "Need a repository to create a bundle."
+msgstr "번들을 만드려면 저장소가 필요합니다."
+
+#: builtin/bundle.c:68
+msgid "Need a repository to unbundle."
+msgstr "번들을 해제하려면 저장소가 필요합니다."
+
+#: builtin/cat-file.c:428
+msgid ""
+"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|"
+"<type>|--textconv) <object>"
+msgstr ""
+"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<종류"
+">|--textconv) <오브젝트>"
+
+#: builtin/cat-file.c:429
+msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]"
+
+#: builtin/cat-file.c:466
+msgid "<type> can be one of: blob, tree, commit, tag"
+msgstr "<종류>는 다음 중 하나가 될 수 있습니다: blob, tree, commit, tag"
+
+#: builtin/cat-file.c:467
+msgid "show object type"
+msgstr "오브젝트 종류를 봅니다"
+
+#: builtin/cat-file.c:468
+msgid "show object size"
+msgstr "오브젝트 크기를 봅니다"
+
+#: builtin/cat-file.c:470
+msgid "exit with zero when there's no error"
+msgstr "오류가 없을 때 0을 리턴하고 끝냅니다"
+
+#: builtin/cat-file.c:471
+msgid "pretty-print object's content"
+msgstr "오브젝트의 내용을 예쁘게 표시합니다"
+
+#: builtin/cat-file.c:473
+msgid "for blob objects, run textconv on object's content"
+msgstr "블롭 오브젝트에 대해서는, 오브젝트의 내용에 대해 textconv를 실행합니다"
+
+#: builtin/cat-file.c:475
+msgid "allow -s and -t to work with broken/corrupt objects"
+msgstr "-s 및 -t 옵션이 손상된 오브젝트에 대해 동작하도록 허용합니다"
+
+#: builtin/cat-file.c:476
+msgid "buffer --batch output"
+msgstr "--batch 출력에 대해 버퍼링합니다"
+
+#: builtin/cat-file.c:478
+msgid "show info and content of objects fed from the standard input"
+msgstr "표준 입력에서 입력된 오브젝트의 정보와 내용을 표시합니다"
+
+#: builtin/cat-file.c:481
+msgid "show info about objects fed from the standard input"
+msgstr "표준 입력에서 입력된 오브젝트의 정보를 표시합니다"
+
+#: builtin/cat-file.c:484
+msgid "follow in-tree symlinks (used with --batch or --batch-check)"
+msgstr "트리 내부의 심볼릭 링크를 따라갑니다 (--batch 또는 --batch-check와 같이 사용)"
+
+#: builtin/cat-file.c:486
+msgid "show all objects with --batch or --batch-check"
+msgstr "--batch 또는 --batch-check에서 모든 오브젝트를 표시합니다"
+
+#: builtin/check-attr.c:11
+msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..."
+msgstr "git check-attr [-a | --all | <속성>...] [--] <경로이름>..."
+
+#: builtin/check-attr.c:12
+msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]"
+msgstr "git check-attr --stdin [-z] [-a | --all | <속성>...]"
+
+#: builtin/check-attr.c:19
+msgid "report all attributes set on file"
+msgstr "파일에 설정된 모든 속성을 표시합니다"
+
+#: builtin/check-attr.c:20
+msgid "use .gitattributes only from the index"
+msgstr "인덱스에서만 .gitattributes를 사용합니다"
+
+#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:96
+msgid "read file names from stdin"
+msgstr "표준 입력에서 파일 이름을 읽습니다"
+
+#: builtin/check-attr.c:23 builtin/check-ignore.c:24
+msgid "terminate input and output records by a NUL character"
+msgstr "NUL 문자를 기준으로 자료 입력 및 출력을 멈춥니다"
+
+#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325
+msgid "suppress progress reporting"
+msgstr "진행 상황 표시를 하지 않습니다"
+
+#: builtin/check-ignore.c:26
+msgid "show non-matching input paths"
+msgstr "일치하지 않는 입력 경로를 표시합니다"
+
+#: builtin/check-ignore.c:28
+msgid "ignore index when checking"
+msgstr "검사할 때 인덱스를 무시합니다"
+
+#: builtin/check-ignore.c:154
+msgid "cannot specify pathnames with --stdin"
+msgstr "--stdin으로 경로 이름을 지정할 수 없습니다"
+
+#: builtin/check-ignore.c:157
+msgid "-z only makes sense with --stdin"
+msgstr "-z 옵션은 --stdin 옵션과 같이 써야만 의미가 있습니다"
+
+#: builtin/check-ignore.c:159
+msgid "no path specified"
+msgstr "경로를 지정하지 않았습니다"
+
+#: builtin/check-ignore.c:163
+msgid "--quiet is only valid with a single pathname"
+msgstr "--quiet 옵션은 하나의 경로 이름과 같이 써야 합니다"
+
+#: builtin/check-ignore.c:165
+msgid "cannot have both --quiet and --verbose"
+msgstr "--quiet 및 --verbose 옵션을 같이 쓸 수 없습니다"
+
+#: builtin/check-ignore.c:168
+msgid "--non-matching is only valid with --verbose"
+msgstr "--non-matching 옵션은 --verbose 옵션과 같이 써야 합니다"
+
+#: builtin/check-mailmap.c:8
+msgid "git check-mailmap [<options>] <contact>..."
+msgstr "git check-mailmap [<옵션>] <연락처>..."
+
+#: builtin/check-mailmap.c:13
+msgid "also read contacts from stdin"
+msgstr "또 연락처를 표준 입력에서 읽습니다"
+
+#: builtin/check-mailmap.c:24
+#, c-format
+msgid "unable to parse contact: %s"
+msgstr "연락처를 파싱할 수 없습니다: %s"
+
+#: builtin/check-mailmap.c:47
+msgid "no contacts specified"
+msgstr "연락처를 지정하지 않았습니다"
+
+#: builtin/checkout-index.c:126
+msgid "git checkout-index [<options>] [--] [<file>...]"
+msgstr "git checkout-index [<옵션>] [--] [<파일>...]"
+
+#: builtin/checkout-index.c:188
+msgid "check out all files in the index"
+msgstr "인덱스의 모든 파일을 가져옵니다"
+
+#: builtin/checkout-index.c:189
+msgid "force overwrite of existing files"
+msgstr "기존 파일을 강제로 덮어 씁니다"
+
+#: builtin/checkout-index.c:191
+msgid "no warning for existing files and files not in index"
+msgstr "기존 파일과 인덱스에 없는 파일에 대해 경고하지 않습니다"
+
+#: builtin/checkout-index.c:193
+msgid "don't checkout new files"
+msgstr "새 파일을 가져오지 않습니다"
+
+#: builtin/checkout-index.c:195
+msgid "update stat information in the index file"
+msgstr "인덱스 파일의 stat 정보를 업데이트합니다"
+
+#: builtin/checkout-index.c:201
+msgid "read list of paths from the standard input"
+msgstr "표준 입력에서 경로의 목록을 읽습니다"
+
+#: builtin/checkout-index.c:203
+msgid "write the content to temporary files"
+msgstr "내용을 임시 파일에 씁니다"
+
+#: builtin/checkout-index.c:204 builtin/column.c:30
+#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175
+#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181
+msgid "string"
+msgstr "문자열"
+
+#: builtin/checkout-index.c:205
+msgid "when creating files, prepend <string>"
+msgstr "파일을 만들 때, 앞에 <문자열>을 붙입니다"
+
+#: builtin/checkout-index.c:208
+msgid "copy out the files from named stage"
+msgstr "지정한 스테이지에서 파일을 복사해 옵니다"
+
+#: builtin/checkout.c:25
+msgid "git checkout [<options>] <branch>"
+msgstr "git checkout [<옵션>] <브랜치>"
+
+#: builtin/checkout.c:26
+msgid "git checkout [<options>] [<branch>] -- <file>..."
+msgstr "git checkout [<옵션>] [<브랜치>] -- <파일>..."
+
+#: builtin/checkout.c:134 builtin/checkout.c:167
+#, c-format
+msgid "path '%s' does not have our version"
+msgstr "'%s' 경로에 우리쪽 버전이 없습니다"
+
+#: builtin/checkout.c:136 builtin/checkout.c:169
+#, c-format
+msgid "path '%s' does not have their version"
+msgstr "'%s' 경로에 상대편 버전이 없습니다"
+
+#: builtin/checkout.c:152
+#, c-format
+msgid "path '%s' does not have all necessary versions"
+msgstr "'%s' 경로에 필요한 모든 버전이 없습니다"
+
+#: builtin/checkout.c:196
+#, c-format
+msgid "path '%s' does not have necessary versions"
+msgstr "'%s' 경로에 필요한 버전이 없습니다"
+
+#: builtin/checkout.c:213
+#, c-format
+msgid "path '%s': cannot merge"
+msgstr "'%s' 경로: 병합할 수 없습니다"
+
+#: builtin/checkout.c:230
+#, c-format
+msgid "Unable to add merge result for '%s'"
+msgstr "'%s'에 대한 병합 결과를 추가할 수 없습니다"
+
+#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257
+#: builtin/checkout.c:260
+#, c-format
+msgid "'%s' cannot be used with updating paths"
+msgstr "'%s' 옵션은 업데이트하는 경로에서 쓸 수 없습니다"
+
+#: builtin/checkout.c:263 builtin/checkout.c:266
+#, c-format
+msgid "'%s' cannot be used with %s"
+msgstr "'%s' 옵션은 %s 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/checkout.c:269
+#, c-format
+msgid "Cannot update paths and switch to branch '%s' at the same time."
+msgstr "경로를 업데이트하고 '%s' 브랜치로 전환하는 일은 동시에 할 수 없습니다."
+
+#: builtin/checkout.c:280 builtin/checkout.c:474
+msgid "corrupt index file"
+msgstr "손상된 인덱스 파일"
+
+#: builtin/checkout.c:340 builtin/checkout.c:347
+#, c-format
+msgid "path '%s' is unmerged"
+msgstr "'%s' 경로를 병합하지 않았습니다"
+
+#: builtin/checkout.c:496
+msgid "you need to resolve your current index first"
+msgstr "현재 인덱스를 먼저 해결해야 합니다"
+
+#: builtin/checkout.c:623
+#, c-format
+msgid "Can not do reflog for '%s': %s\n"
+msgstr "'%s'에 대해 reflog할 수 없습니다: %s\n"
+
+#: builtin/checkout.c:661
+msgid "HEAD is now at"
+msgstr "HEAD의 현재 위치는"
+
+#: builtin/checkout.c:668
+#, c-format
+msgid "Reset branch '%s'\n"
+msgstr "'%s' 브랜치 리셋\n"
+
+#: builtin/checkout.c:671
+#, c-format
+msgid "Already on '%s'\n"
+msgstr "이미 '%s'에 있습니다\n"
+
+#: builtin/checkout.c:675
+#, c-format
+msgid "Switched to and reset branch '%s'\n"
+msgstr "'%s' 브랜치로 전환하고 리셋합니다\n"
+
+#: builtin/checkout.c:677 builtin/checkout.c:1066
+#, c-format
+msgid "Switched to a new branch '%s'\n"
+msgstr "새로 만든 '%s' 브랜치로 전환합니다\n"
+
+#: builtin/checkout.c:679
+#, c-format
+msgid "Switched to branch '%s'\n"
+msgstr "'%s' 브랜치로 전환합니다\n"
+
+#: builtin/checkout.c:731
+#, c-format
+msgid " ... and %d more.\n"
+msgstr " ... 그리고 %d개 더.\n"
+
+#: builtin/checkout.c:737
+#, c-format
+msgid ""
+"Warning: you are leaving %d commit behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgid_plural ""
+"Warning: you are leaving %d commits behind, not connected to\n"
+"any of your branches:\n"
+"\n"
+"%s\n"
+msgstr[0] ""
+"경고: 브랜치 중에 아무것에도 연결되지 않은 커밋이 뒤에\n"
+"%d개 있습니다:\n"
+"\n"
+"%s\n"
+
+#: builtin/checkout.c:756
+#, c-format
+msgid ""
+"If you want to keep it by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgid_plural ""
+"If you want to keep them by creating a new branch, this may be a good time\n"
+"to do so with:\n"
+"\n"
+" git branch <new-branch-name> %s\n"
+"\n"
+msgstr[0] ""
+"새 브랜치를 만들어서 이 커밋을 저장하고 싶으면, 지금 다음과\n"
+"같이 할 수 있습니다:\n"
+"\n"
+" git branch <새-브랜치-이름> %s\n"
+"\n"
+
+#: builtin/checkout.c:792
+msgid "internal error in revision walk"
+msgstr "리비전 walk에 내부 오류"
+
+#: builtin/checkout.c:796
+msgid "Previous HEAD position was"
+msgstr "이전 HEAD 위치는"
+
+#: builtin/checkout.c:823 builtin/checkout.c:1061
+msgid "You are on a branch yet to be born"
+msgstr "현재 위치가 만들 예정인 브랜치에 있습니다"
+
+#: builtin/checkout.c:968
+#, c-format
+msgid "only one reference expected, %d given."
+msgstr "하나의 레퍼런스만 지정해야 하지만 %d개를 지정했습니다."
+
+#: builtin/checkout.c:1007 builtin/worktree.c:213
+#, c-format
+msgid "invalid reference: %s"
+msgstr "잘못된 레퍼런스: %s"
+
+#: builtin/checkout.c:1036
+#, c-format
+msgid "reference is not a tree: %s"
+msgstr "레퍼런스가 트리가 아닙니다: %s"
+
+#: builtin/checkout.c:1075
+msgid "paths cannot be used with switching branches"
+msgstr "브랜치를 전환하는데 경로를 사용할 수 없습니다"
+
+#: builtin/checkout.c:1078 builtin/checkout.c:1082
+#, c-format
+msgid "'%s' cannot be used with switching branches"
+msgstr "'%s' 옵션은 브랜치를 전환할 때 쓸 수 없습니다"
+
+#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094
+#: builtin/checkout.c:1097
+#, c-format
+msgid "'%s' cannot be used with '%s'"
+msgstr "'%s' 옵션은 '%s' 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/checkout.c:1102
+#, c-format
+msgid "Cannot switch branch to a non-commit '%s'"
+msgstr "브랜치를 커밋이 아닌 '%s'(으)로 전환할 수 없습니다"
+
+#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83
+#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320
+#: builtin/worktree.c:322
+msgid "branch"
+msgstr "브랜치"
+
+#: builtin/checkout.c:1136
+msgid "create and checkout a new branch"
+msgstr "새 브랜치를 만들고 가져옵니다"
+
+#: builtin/checkout.c:1138
+msgid "create/reset and checkout a branch"
+msgstr "브랜치를 만들거나 리셋하고 가져옵니다"
+
+#: builtin/checkout.c:1139
+msgid "create reflog for new branch"
+msgstr "새 브랜치에 대한 reflog를 만듭니다"
+
+#: builtin/checkout.c:1140
+msgid "detach the HEAD at named commit"
+msgstr "지정한 커밋에서 HEAD를 분리합니다"
+
+#: builtin/checkout.c:1141
+msgid "set upstream info for new branch"
+msgstr "새 브랜치에 대한 업스트림 정보를 설정합니다"
+
+#: builtin/checkout.c:1143
+msgid "new-branch"
+msgstr "새-브랜치"
+
+#: builtin/checkout.c:1143
+msgid "new unparented branch"
+msgstr "상위 브랜치가 없는 새 브랜치"
+
+#: builtin/checkout.c:1144
+msgid "checkout our version for unmerged files"
+msgstr "병합되지 않은 파일에 대해 우리쪽 버전을 가져옵니다"
+
+#: builtin/checkout.c:1146
+msgid "checkout their version for unmerged files"
+msgstr "병합되지 않은 파일에 대해 상대편 버전을 가져옵니다"
+
+#: builtin/checkout.c:1148
+msgid "force checkout (throw away local modifications)"
+msgstr "강제로 체크아웃합니다 (로컬에서 수정한 사항을 버립니다)"
+
+#: builtin/checkout.c:1149
+msgid "perform a 3-way merge with the new branch"
+msgstr "새 브랜치에 대해 3-방향 병합을 수행합니다"
+
+#: builtin/checkout.c:1150 builtin/merge.c:227
+msgid "update ignored files (default)"
+msgstr "무시하는 파일을 업데이트합니다 (기본값)"
+
+#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250
+msgid "style"
+msgstr "스타일"
+
+#: builtin/checkout.c:1152
+msgid "conflict style (merge or diff3)"
+msgstr "충돌 스타일 (merge 또는 diff3)"
+
+# FIXME: 의미 불명
+#: builtin/checkout.c:1155
+msgid "do not limit pathspecs to sparse entries only"
+msgstr "경로명세를 드문 항목에만 제한하지 않습니다"
+
+#: builtin/checkout.c:1157
+msgid "second guess 'git checkout <no-such-branch>'"
+msgstr "'git checkout <없는-브랜치>'에 대해 추측합니다"
+
+#: builtin/checkout.c:1159
+msgid "do not check if another worktree is holding the given ref"
+msgstr "다른 작업폴더에 주어진 레퍼런스가 있는지 확인하지 않습니다"
+
+#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112
+#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558
+#: builtin/send-pack.c:168
+msgid "force progress reporting"
+msgstr "강제로 진행 상황을 표시합니다"
+
+#: builtin/checkout.c:1191
+msgid "-b, -B and --orphan are mutually exclusive"
+msgstr "-b, -B 및 --orphan 옵션은 서로 호환되지 않습니다"
+
+#: builtin/checkout.c:1208
+msgid "--track needs a branch name"
+msgstr "--track 옵션은 브랜치 이름이 필요합니다"
+
+#: builtin/checkout.c:1213
+msgid "Missing branch name; try -b"
+msgstr "브랜치 이름이 없습니다. -b 옵션을 사용해 보십시오"
+
+#: builtin/checkout.c:1249
+msgid "invalid path specification"
+msgstr "경로 명세가 잘못되었습니다"
+
+#: builtin/checkout.c:1256
+#, c-format
+msgid ""
+"Cannot update paths and switch to branch '%s' at the same time.\n"
+"Did you intend to checkout '%s' which can not be resolved as commit?"
+msgstr ""
+"동시에 경로를 업데이트하고 '%s' 브랜치로 전환할 수 없습니다.\n"
+"커밋을 확인할 수 없는 '%s'을(를) 가져오려고 하셨습니까?"
+
+#: builtin/checkout.c:1261
+#, c-format
+msgid "git checkout: --detach does not take a path argument '%s'"
+msgstr "git checkout: --detach 옵션은 경로 인자를 받지 않습니다 '%s'"
+
+#: builtin/checkout.c:1265
+msgid ""
+"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
+"checking out of the index."
+msgstr ""
+"git checkout: --ours/--theirs, --force 및 --merge 옵션은 인덱스에서\n"
+"가져올 경우에는 서로 호환되지 않습니다."
+
+#: builtin/clean.c:25
+msgid ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..."
+msgstr ""
+"git clean [-d] [-f] [-i] [-n] [-q] [-e <패턴>] [-x | -X] [--] <경로>..."
+
+#: builtin/clean.c:29
+#, c-format
+msgid "Removing %s\n"
+msgstr "%s 제거\n"
+
+#: builtin/clean.c:30
+#, c-format
+msgid "Would remove %s\n"
+msgstr "%s 제거할 예정\n"
+
+#: builtin/clean.c:31
+#, c-format
+msgid "Skipping repository %s\n"
+msgstr "%s 저장소 건너뜀\n"
+
+#: builtin/clean.c:32
+#, c-format
+msgid "Would skip repository %s\n"
+msgstr "%s 저장소 건너뛸 예정\n"
+
+#: builtin/clean.c:33
+#, c-format
+msgid "failed to remove %s"
+msgstr "%s 제거에 실패했습니다"
+
+#: builtin/clean.c:315
+msgid ""
+"Prompt help:\n"
+"1          - select a numbered item\n"
+"foo        - select item based on unique prefix\n"
+"           - (empty) select nothing"
+msgstr ""
+"프롬프트 도움말:\n"
+"1          - 해당 번호의 항목을 선택\n"
+"foo        - 유일한 접두어에 해당하는 항목 선택\n"
+"           - (빈 입력) 선택하지 않음"
+
+#: builtin/clean.c:319
+msgid ""
+"Prompt help:\n"
+"1          - select a single item\n"
+"3-5        - select a range of items\n"
+"2-3,6-9    - select multiple ranges\n"
+"foo        - select item based on unique prefix\n"
+"-...       - unselect specified items\n"
+"*          - choose all items\n"
+"           - (empty) finish selecting"
+msgstr ""
+"프롬프트 도움말:\n"
+"1          - 해당 번호의 항목을 선택\n"
+"3-5        - 해당 범위의 항목을 선택\n"
+"2-3,6-9    - 여러 개 범위를 선택\n"
+"foo        - 유일한 접두어에 해당하는 항목 선택\n"
+"-...       - 해당 항목 선택 해제\n"
+"*          - 모든 항목 선택\n"
+"           - (빈 입력) 선택 마침"
+
+#: builtin/clean.c:535
+#, c-format
+msgid "Huh (%s)?"
+msgstr "어라라 (%s)?"
+
+#: builtin/clean.c:677
+#, c-format
+msgid "Input ignore patterns>> "
+msgstr "무시할 패턴을 입력하십시오>> "
+
+#: builtin/clean.c:714
+#, c-format
+msgid "WARNING: Cannot find items matched by: %s"
+msgstr "경고: 다음에 해당하는 항목을 찾을 수 없습니다: %s"
+
+#: builtin/clean.c:735
+msgid "Select items to delete"
+msgstr "삭제할 항목을 선택하십시오"
+
+#. TRANSLATORS: Make sure to keep [y/N] as is
+#: builtin/clean.c:776
+#, c-format
+msgid "Remove %s [y/N]? "
+msgstr "%s 제거합니까 [y/N]? "
+
+#: builtin/clean.c:801
+msgid "Bye."
+msgstr "끝."
+
+#: builtin/clean.c:809
+msgid ""
+"clean               - start cleaning\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - select items to be deleted by numbers\n"
+"ask each            - confirm each deletion (like \"rm -i\")\n"
+"quit                - stop cleaning\n"
+"help                - this screen\n"
+"?                   - help for prompt selection"
+msgstr ""
+"clean               - 지우기 시작\n"
+"filter by pattern   - exclude items from deletion\n"
+"select by numbers   - 삭제할 항목을 번호로 선택\n"
+"ask each            - 삭제 항목을 (\"rm -i\" 처럼) 하나하나 확인\n"
+"quit                - 지우기 중지\n"
+"help                - 이 화면 표시\n"
+"?                   - 프롬프트 선택 도움말"
+
+#: builtin/clean.c:836
+msgid "*** Commands ***"
+msgstr "*** 명령 ***"
+
+#: builtin/clean.c:837
+msgid "What now"
+msgstr "무엇을 할까요"
+
+#: builtin/clean.c:845
+msgid "Would remove the following item:"
+msgid_plural "Would remove the following items:"
+msgstr[0] "다음 항목을 제거할 예정입니다:"
+
+#: builtin/clean.c:862
+msgid "No more files to clean, exiting."
+msgstr "지울 파일이 이제 없으므로 끝냅니다."
+
+#: builtin/clean.c:893
+msgid "do not print names of files removed"
+msgstr "제거할 파일 이름을 표시하지 않습니다"
+
+#: builtin/clean.c:895
+msgid "force"
+msgstr "강제"
+
+#: builtin/clean.c:896
+msgid "interactive cleaning"
+msgstr "대화형 지우기"
+
+#: builtin/clean.c:898
+msgid "remove whole directories"
+msgstr "전체 디렉터리 제거"
+
+#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709
+#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182
+msgid "pattern"
+msgstr "패턴"
+
+#: builtin/clean.c:900
+msgid "add <pattern> to ignore rules"
+msgstr "규칙을 무시하려면 <패턴>을 추가하십시오"
+
+#: builtin/clean.c:901
+msgid "remove ignored files, too"
+msgstr "무시한 파일도 제거"
+
+#: builtin/clean.c:903
+msgid "remove only ignored files"
+msgstr "무시한 파일만 제거"
+
+#: builtin/clean.c:921
+msgid "-x and -X cannot be used together"
+msgstr "-x 및 -X 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/clean.c:925
+msgid ""
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
+"clean"
+msgstr "clean.requireForce가 true로 설정되었고 -i, -n, -f 옵션 중 하나도 쓰지 않았습니다. 지우지 않습니다"
+
+#: builtin/clean.c:928
+msgid ""
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
+"refusing to clean"
+msgstr "clean.requireForce 기본값이 true이고 -i, -n, -f 옵션 중 하나도 쓰지 않았습니다. 지우지 않습니다"
+
+#: builtin/clone.c:37
+msgid "git clone [<options>] [--] <repo> [<dir>]"
+msgstr "git clone [<옵션>] [--] <저장소> [<디렉터리>]"
+
+#: builtin/clone.c:59
+msgid "don't create a checkout"
+msgstr "체크아웃을 만들지 않습니다"
+
+#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469
+msgid "create a bare repository"
+msgstr "간략한 저장소를 만듭니다"
+
+#: builtin/clone.c:64
+msgid "create a mirror repository (implies bare)"
+msgstr "미러 저장소를 만듭니다 (간략한 저장소로 취급)"
+
+#: builtin/clone.c:66
+msgid "to clone from a local repository"
+msgstr "로컬 저장소에서 복제합니다"
+
+#: builtin/clone.c:68
+msgid "don't use local hardlinks, always copy"
+msgstr "로컬 하드링크를 사용하지 않고, 항상 복사합니다"
+
+#: builtin/clone.c:70
+msgid "setup as shared repository"
+msgstr "공유 저장소로 설정합니다"
+
+#: builtin/clone.c:72 builtin/clone.c:74
+msgid "initialize submodules in the clone"
+msgstr "복제한 결과물에서 하위 모듈을 초기화합니다"
+
+#: builtin/clone.c:75 builtin/init-db.c:466
+msgid "template-directory"
+msgstr "서식-디렉터리"
+
+#: builtin/clone.c:76 builtin/init-db.c:467
+msgid "directory from which templates will be used"
+msgstr "서식을 사용할 디렉터리 위치"
+
+#: builtin/clone.c:78 builtin/submodule--helper.c:179
+msgid "reference repository"
+msgstr "레퍼런스 저장소"
+
+#: builtin/clone.c:80
+msgid "use --reference only while cloning"
+msgstr "복제할 경우에만 --reference를 사용합니다"
+
+#: builtin/clone.c:81 builtin/column.c:26 builtin/merge-file.c:44
+msgid "name"
+msgstr "이름"
+
+#: builtin/clone.c:82
+msgid "use <name> instead of 'origin' to track upstream"
+msgstr "업스트림 추적에 'origin' 대신 <이름>을 사용합니다"
+
+#: builtin/clone.c:84
+msgid "checkout <branch> instead of the remote's HEAD"
+msgstr "리모트의 HEAD 대신 <브랜치>를 가져옵니다"
+
+#: builtin/clone.c:86
+msgid "path to git-upload-pack on the remote"
+msgstr "리모트의 git-upload-pack 경로"
+
+#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186
+msgid "depth"
+msgstr "깊이"
+
+#: builtin/clone.c:88
+msgid "create a shallow clone of that depth"
+msgstr "지정한 깊이의 얕은 복제를 만듭니다"
+
+#: builtin/clone.c:90
+msgid "clone only one branch, HEAD or --branch"
+msgstr "하나의 브랜치만 복제합니다 (HEAD 또는 --branch로 지정)"
+
+#: builtin/clone.c:91 builtin/init-db.c:475
+msgid "gitdir"
+msgstr "gitdir"
+
+#: builtin/clone.c:92 builtin/init-db.c:476
+msgid "separate git dir from working tree"
+msgstr "깃 디렉터리를 작업 폴더와 별개의 위치에 놓습니다"
+
+#: builtin/clone.c:93
+msgid "key=value"
+msgstr "키=값"
+
+#: builtin/clone.c:94
+msgid "set config inside the new repository"
+msgstr "새 저장소 안에서 설정합니다"
+
+#: builtin/clone.c:300
+#, c-format
+msgid "reference repository '%s' as a linked checkout is not supported yet."
+msgstr "레퍼런스 '%s' 저장소를 연결된 체크아웃으로 쓰기는 아직 지원하지 않습니다."
+
+#: builtin/clone.c:302
+#, c-format
+msgid "reference repository '%s' is not a local repository."
+msgstr "레퍼런스 '%s' 저장소가 로컬 저장소가 아닙니다."
+
+#: builtin/clone.c:307
+#, c-format
+msgid "reference repository '%s' is shallow"
+msgstr "레퍼런스 '%s' 저장소가 얕은 저장소입니다"
+
+#: builtin/clone.c:310
+#, c-format
+msgid "reference repository '%s' is grafted"
+msgstr "레퍼런스 '%s' 저장소가 붙어 있는 저장소입니다"
+
+#: builtin/clone.c:375 builtin/diff.c:84
+#, c-format
+msgid "failed to stat '%s'"
+msgstr "'%s'에 대해 stat()이 실패했습니다"
+
+#: builtin/clone.c:377
+#, c-format
+msgid "%s exists and is not a directory"
+msgstr "'%s'이(가) 있지만 디렉터리가 아닙니다"
+
+#: builtin/clone.c:391
+#, c-format
+msgid "failed to stat %s\n"
+msgstr "'%s'에 대해 stat()이 실패했습니다\n"
+
+#: builtin/clone.c:413
+#, c-format
+msgid "failed to create link '%s'"
+msgstr "'%s' 링크를 만드는데 실패했습니다"
+
+#: builtin/clone.c:417
+#, c-format
+msgid "failed to copy file to '%s'"
+msgstr "파일을 '%s'(으)로 복사하는데 실패했습니다"
+
+#: builtin/clone.c:442 builtin/clone.c:626
+#, c-format
+msgid "done.\n"
+msgstr "완료.\n"
+
+#: builtin/clone.c:454
+msgid ""
+"Clone succeeded, but checkout failed.\n"
+"You can inspect what was checked out with 'git status'\n"
+"and retry the checkout with 'git checkout -f HEAD'\n"
+msgstr ""
+"복제가 성공했지만, 체크아웃이 실패했습니다.\n"
+"'git status' 명령으로 무엇을 체크아웃했는지 살펴볼 수 있고\n"
+"'git checkout -f HEAD'로 체크아웃을 다시 할 수 있습니다\n"
+
+#: builtin/clone.c:531
+#, c-format
+msgid "Could not find remote branch %s to clone."
+msgstr "복제할 리모트의 %s 브랜치를 찾을 수 없습니다."
+
+#: builtin/clone.c:621
+#, c-format
+msgid "Checking connectivity... "
+msgstr "연결을 확인하는 중입니다..."
+
+#: builtin/clone.c:624
+msgid "remote did not send all necessary objects"
+msgstr "리모트에서 필요한 오브젝트를 모두 보내지 않았습니다"
+
+#: builtin/clone.c:688
+msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
+msgstr "리모트 HEAD가 없는 레퍼런스를 참고하므로, 체크아웃할 수 없습니다.\n"
+
+#: builtin/clone.c:719
+msgid "unable to checkout working tree"
+msgstr "작업 폴더를 체크아웃할 수 없습니다"
+
+#: builtin/clone.c:808
+msgid "cannot repack to clean up"
+msgstr "정리용으로 repack할 수 없습니다"
+
+#: builtin/clone.c:810
+msgid "cannot unlink temporary alternates file"
+msgstr "보조 임시 파일을 삭제할 수 없습니다"
+
+#: builtin/clone.c:842
+msgid "Too many arguments."
+msgstr "너무 인자가 많습니다."
+
+#: builtin/clone.c:846
+msgid "You must specify a repository to clone."
+msgstr "복제할 저장소를 지정해야 합니다."
+
+#: builtin/clone.c:857
+#, c-format
+msgid "--bare and --origin %s options are incompatible."
+msgstr "--bare 및 --origin %s 옵션은 호환되지 않습니다."
+
+#: builtin/clone.c:860
+msgid "--bare and --separate-git-dir are incompatible."
+msgstr "--bare 및 --separate-git-dir 옵션은 호환되지 않습니다."
+
+#: builtin/clone.c:873
+#, c-format
+msgid "repository '%s' does not exist"
+msgstr "'%s' 저장소가 없습니다"
+
+#: builtin/clone.c:879 builtin/fetch.c:1166
+#, c-format
+msgid "depth %s is not a positive number"
+msgstr "깊이가(%s) 0보다 큰 수가 아닙니다"
+
+#: builtin/clone.c:889
+#, c-format
+msgid "destination path '%s' already exists and is not an empty directory."
+msgstr "대상 경로가('%s') 이미 있고 빈 디렉터리가 아닙니다."
+
+#: builtin/clone.c:899
+#, c-format
+msgid "working tree '%s' already exists."
+msgstr "작업 폴더가('%s') 이미 있습니다."
+
+#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224
+#: builtin/worktree.c:221 builtin/worktree.c:248
+#, c-format
+msgid "could not create leading directories of '%s'"
+msgstr "'%s'의 앞 디렉터리를 만들 수 없습니다"
+
+#: builtin/clone.c:917
+#, c-format
+msgid "could not create work tree dir '%s'"
+msgstr "작업 디렉터리를('%s') 만들 수 없습니다"
+
+#: builtin/clone.c:935
+#, c-format
+msgid "Cloning into bare repository '%s'...\n"
+msgstr "간략한 저장소로('%s') 복제합니다...\n"
+
+#: builtin/clone.c:937
+#, c-format
+msgid "Cloning into '%s'...\n"
+msgstr "'%s'에 복제합니다...\n"
+
+#: builtin/clone.c:975
+msgid "--depth is ignored in local clones; use file:// instead."
+msgstr "--depth 옵션은 로컬 복제에서 무시됩니다. 대신에 'file://'을 사용하십시오."
+
+#: builtin/clone.c:978
+msgid "source repository is shallow, ignoring --local"
+msgstr "원본 저장소가 얕은 저장소이므로, --local 옵션을 무시합니다"
+
+#: builtin/clone.c:983
+msgid "--local is ignored"
+msgstr "--local 옵션은 무시됩니다"
+
+#: builtin/clone.c:987
+#, c-format
+msgid "Don't know how to clone %s"
+msgstr "%s의 복제 방법을 알지 못합니다"
+
+#: builtin/clone.c:1036 builtin/clone.c:1044
+#, c-format
+msgid "Remote branch %s not found in upstream %s"
+msgstr "리모트의 %s 브랜치가 업스트림 %s에 없습니다"
+
+#: builtin/clone.c:1047
+msgid "You appear to have cloned an empty repository."
+msgstr "빈 저장소를 복제한 것처럼 보입니다."
+
+#: builtin/column.c:9
+msgid "git column [<options>]"
+msgstr "git column [<옵션>]"
+
+#: builtin/column.c:26
+msgid "lookup config vars"
+msgstr "설정 변수를 찾아 봅니다"
+
+#: builtin/column.c:27 builtin/column.c:28
+msgid "layout to use"
+msgstr "사용할 배치"
+
+#: builtin/column.c:29
+msgid "Maximum width"
+msgstr "최대 너비"
+
+#: builtin/column.c:30
+msgid "Padding space on left border"
+msgstr "왼쪽 가장자리에 채울 공백"
+
+#: builtin/column.c:31
+msgid "Padding space on right border"
+msgstr "오른쪽 가장자리에 채울 공백"
+
+#: builtin/column.c:32
+msgid "Padding space between columns"
+msgstr "열 사이에 채울 공백"
+
+#: builtin/column.c:51
+msgid "--command must be the first argument"
+msgstr "--command는 첫 번째 인자여야 합니다"
+
+#: builtin/commit.c:38
+msgid "git commit [<options>] [--] <pathspec>..."
+msgstr "git commit [<옵션>] [--] <경로명세>..."
+
+#: builtin/commit.c:43
+msgid "git status [<options>] [--] <pathspec>..."
+msgstr "git status [<옵션>] [--] <경로명세>..."
+
+#: builtin/commit.c:48
+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 ""
+"이름과 전자메일 주소를 사용자 이름과 호스트 이름을 이용해서 자동으로\n"
+"설정했습니다. 이 정보가 맞는지 확인하십시오. 이 메시지를 보지 않으려면 정보"
+"를\n"
+"명시적으로 설정하십시오. 다음 명령어를 실행하고 편집기의 안내에 따라 설정\n"
+"파일을 편집하십시오:\n"
+"\n"
+"    git config --global --edit\n"
+"\n"
+"이렇게 한 다음, 이 커밋에 사용한 신원 정보를 다음과 같이 해서 바꿀 수 있습니"
+"다:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:61
+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 ""
+"이름과 전자메일 주소를 사용자 이름과 호스트 이름을 이용해서\n"
+"자동으로 설정했습니다. 이 정보가 맞는지 확인하십시오. 이 메시지를\n"
+"보지 않으려면 정보를 명시적으로 설정하십시오:\n"
+"\n"
+"    git config --global user.name \"내 이름\"\n"
+"    git config --global user.email you@example.com\n"
+"\n"
+"이렇게 한 다음, 이 커밋에 사용한 신원 정보를 다음과 같이 해서 바꿀 수 있습니"
+"다:\n"
+"\n"
+"    git commit --amend --reset-author\n"
+
+#: builtin/commit.c:73
+msgid ""
+"You asked to amend the most recent commit, but doing so would make\n"
+"it empty. You can repeat your command with --allow-empty, or you can\n"
+"remove the commit entirely with \"git reset HEAD^\".\n"
+msgstr ""
+"최초의 커밋을 바꾸려고 하지만, 그렇게 하면 커밋이 비어 있게 됩니다.\n"
+"--allow-empty 옵션과 같이 이 명령을 반복할 수도 있고, \"git reset HEAD\"\n"
+"명령으로 커밋을 완전히 제거할 수도 있습니다.\n"
+
+#: builtin/commit.c:78
+msgid ""
+"The previous cherry-pick is now empty, possibly due to conflict resolution.\n"
+"If you wish to commit it anyway, use:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+msgstr ""
+"이전 커맷 빼오기가 비어 있습니다. 아마도 충돌 해결 과정에서 그렇게 됐을\n"
+"것입니다. 그래도 커밋하려면 다음과 같이 하십시오:\n"
+"\n"
+"    git commit --allow-empty\n"
+"\n"
+
+#: builtin/commit.c:85
+msgid "Otherwise, please use 'git reset'\n"
+msgstr "아니면 'git reset'을 사용하십시오\n"
+
+#: builtin/commit.c:88
+msgid ""
+"If you wish to skip this commit, use:\n"
+"\n"
+"    git reset\n"
+"\n"
+"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
+"the remaining commits.\n"
+msgstr ""
+"이 커밋을 건너뛰려면, 다음을 사용하십시오:\n"
+"\n"
+"    git reset\n"
+"\n"
+"그 다음에 \"git cherry-pick --continue\"를 하면 나머지 커밋에\n"
+"대해 커밋 빼오기를 다시 시작합니다.\n"
+
+#: builtin/commit.c:305
+msgid "failed to unpack HEAD tree object"
+msgstr "HEAD 트리 오브젝트의 묶음을 푸는데 실패했습니다"
+
+#: builtin/commit.c:346
+msgid "unable to create temporary index"
+msgstr "임시 인덱스를 만들 수 없습니다"
+
+#: builtin/commit.c:352
+msgid "interactive add failed"
+msgstr "대화형 추가가 실패했습니다"
+
+#: builtin/commit.c:365
+msgid "unable to update temporary index"
+msgstr "임시 인덱스를 업데이트할 수 없습니다"
+
+#: builtin/commit.c:367
+msgid "Failed to update main cache tree"
+msgstr "주요 캐시 트리를 업데이트하는데 실패했습니다"
+
+#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463
+msgid "unable to write new_index file"
+msgstr "new_index 파일에 쓸 수 없습니다"
+
+#: builtin/commit.c:445
+msgid "cannot do a partial commit during a merge."
+msgstr "병합하는 중 부분 커밋을 할 수 없습니다."
+
+#: builtin/commit.c:447
+msgid "cannot do a partial commit during a cherry-pick."
+msgstr "커밋 빼오기를 하는 중 부분 커밋을 할 수 없습니다."
+
+#: builtin/commit.c:456
+msgid "cannot read the index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/commit.c:475
+msgid "unable to write temporary index file"
+msgstr "임시 인덱스 파일을 쓸 수 없습니다"
+
+#: builtin/commit.c:580
+#, c-format
+msgid "commit '%s' lacks author header"
+msgstr "'%s' 커밋에 작성자 헤더가 없습니다"
+
+#: builtin/commit.c:582
+#, c-format
+msgid "commit '%s' has malformed author line"
+msgstr "'%s' 커밋의 작성자 헤더 형식이 잘못되었습니다"
+
+#: builtin/commit.c:601
+msgid "malformed --author parameter"
+msgstr "--author 파라미터 형식이 잘못되었습니다"
+
+#: builtin/commit.c:609
+#, c-format
+msgid "invalid date format: %s"
+msgstr "시각 형식이 잘못되었습니다: %s"
+
+#: builtin/commit.c:653
+msgid ""
+"unable to select a comment character that is not used\n"
+"in the current commit message"
+msgstr ""
+"현재 커밋 메시지에서 사용되지 않는 주석 문자를\n"
+"선택할 수 없습니다"
+
+#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080
+#, c-format
+msgid "could not lookup commit %s"
+msgstr "%s 커밋을 찾아볼 수 없습니다"
+
+#: builtin/commit.c:702 builtin/shortlog.c:273
+#, c-format
+msgid "(reading log message from standard input)\n"
+msgstr "(표준 입력에서 로그 메시지를 읽음)\n"
+
+#: builtin/commit.c:704
+msgid "could not read log from standard input"
+msgstr "표준 입력에서 로그 메시지를 읽을 수 없습니다"
+
+#: builtin/commit.c:708
+#, c-format
+msgid "could not read log file '%s'"
+msgstr "'%s' 로그 파일을 읽을 수 없습니다"
+
+#: builtin/commit.c:730
+msgid "could not read MERGE_MSG"
+msgstr "MERGE_MSG를 읽을 수 없습니다"
+
+#: builtin/commit.c:734
+msgid "could not read SQUASH_MSG"
+msgstr "SQUASH_MSG를 읽을 수 없습니다"
+
+#: builtin/commit.c:785
+msgid "could not write commit template"
+msgstr "커밋 서식을 쓸 수 없습니다"
+
+#: builtin/commit.c:803
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a merge.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+"\n"
+"병합을 커밋하려는 것으로 보입니다.\n"
+"그렇지 않다면, 다음 파일을 지우고,\n"
+"\t%s\n"
+"다시 시도하십시오.\n"
+
+#: builtin/commit.c:808
+#, c-format
+msgid ""
+"\n"
+"It looks like you may be committing a cherry-pick.\n"
+"If this is not correct, please remove the file\n"
+"\t%s\n"
+"and try again.\n"
+msgstr ""
+"\n"
+"커밋 빼오기를 커밋하려는 것으로 보입니다.\n"
+"그렇지 않다면, 다음 파일을 지우고,\n"
+"\t%s\n"
+"다시 시도하십시오.\n"
+
+#: builtin/commit.c:821
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be ignored, and an empty message aborts the commit.\n"
+msgstr ""
+"변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
+"줄은 무시되고, 메시지를 입력하지 않으면 커밋이 중지됩니다.\n"
+
+#: builtin/commit.c:828
+#, c-format
+msgid ""
+"Please enter the commit message for your changes. Lines starting\n"
+"with '%c' will be kept; you may remove them yourself if you want to.\n"
+"An empty message aborts the commit.\n"
+msgstr ""
+"변경 사항에 대한 커밋 메시지를 입력하십시오. '%c' 문자로 시작하는\n"
+"줄은 보존되니, 필요하면 직접 제거하십시오. 메시지를 입력하지\n"
+"않으면 커밋이 중지됩니다.\n"
+
+#: builtin/commit.c:848
+#, c-format
+msgid "%sAuthor:    %.*s <%.*s>"
+msgstr "%s작성자:    %.*s <%.*s>"
+
+#: builtin/commit.c:856
+#, c-format
+msgid "%sDate:      %s"
+msgstr "%s시각:      %s"
+
+#: builtin/commit.c:863
+#, c-format
+msgid "%sCommitter: %.*s <%.*s>"
+msgstr "%s커미터: %.*s <%.*s>"
+
+#: builtin/commit.c:881
+msgid "Cannot read index"
+msgstr "인덱스를 읽을 수 없습니다"
+
+#: builtin/commit.c:938
+msgid "Error building trees"
+msgstr "트리를 만드는데 오류"
+
+#: builtin/commit.c:953 builtin/tag.c:266
+#, c-format
+msgid "Please supply the message using either -m or -F option.\n"
+msgstr "메시지를 -m 또는 -F 옵션으로 입력하십시오.\n"
+
+#: builtin/commit.c:1055
+#, c-format
+msgid "--author '%s' is not 'Name <email>' and matches no existing author"
+msgstr ""
+"--author '%s' 옵션이 '이름 <전자메일>' 형식이 아니고 기존 작성자에도 없습니다"
+
+#: builtin/commit.c:1070 builtin/commit.c:1310
+#, c-format
+msgid "Invalid untracked files mode '%s'"
+msgstr "추적되지 않는 파일 모드가 ('%s') 잘못되었습니다"
+
+#: builtin/commit.c:1107
+msgid "--long and -z are incompatible"
+msgstr "--long 및 -z 옵션은 호환되지 않습니다"
+
+#: builtin/commit.c:1137
+msgid "Using both --reset-author and --author does not make sense"
+msgstr "--reset-author 및 --author 옵션을 모두 사용하면 앞뒤가 맞지 않습니다"
+
+#: builtin/commit.c:1146
+msgid "You have nothing to amend."
+msgstr "바꿀 사항이 없습니다."
+
+#: builtin/commit.c:1149
+msgid "You are in the middle of a merge -- cannot amend."
+msgstr "병합 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
+
+#: builtin/commit.c:1151
+msgid "You are in the middle of a cherry-pick -- cannot amend."
+msgstr "커밋 빼오기 중에 있습니다 -- 커밋을 바꿀 수 없습니다."
+
+#: builtin/commit.c:1154
+msgid "Options --squash and --fixup cannot be used together"
+msgstr "--squash 및 --fixup 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/commit.c:1164
+msgid "Only one of -c/-C/-F/--fixup can be used."
+msgstr "-c/-C/-F/--fixup 옵션 중에 하나만 사용할 수 있습니다."
+
+#: builtin/commit.c:1166
+msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
+msgstr "-m 옵션은 -c/-C/-F/--fixup 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/commit.c:1174
+msgid "--reset-author can be used only with -C, -c or --amend."
+msgstr "--reset-author 옵션은 -C, -c 또는 --amend 옵션과 같이 써야 합니다."
+
+#: builtin/commit.c:1191
+msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
+msgstr ""
+"--include/--only/--all/--interactive/--patch 옵션 중 하나만 사용할 수 있습니"
+"다."
+
+#: builtin/commit.c:1193
+msgid "No paths with --include/--only does not make sense."
+msgstr "경로가 없이 --include/--only 옵션을 쓰면 앞뒤가 맞지 않습니다."
+
+#: builtin/commit.c:1195
+msgid "Clever... amending the last one with dirty index."
+msgstr "기발하네요... 마지막을 변경된 인덱스로 바꿉니다."
+
+#: builtin/commit.c:1197
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr "-i 또는 -o 없이 명시적인 경로를 지정했습니다. --only 경로를 가정합니다..."
+
+#: builtin/commit.c:1209 builtin/tag.c:475
+#, c-format
+msgid "Invalid cleanup mode %s"
+msgstr "잘못된 정리 모드 %s"
+
+#: builtin/commit.c:1214
+msgid "Paths with -a does not make sense."
+msgstr "-a 옵션과 경로를 같이 사용하면 앞뒤가 맞지 않습니다."
+
+#: builtin/commit.c:1324 builtin/commit.c:1605
+msgid "show status concisely"
+msgstr "상태를 간략하게 표시합니다"
+
+#: builtin/commit.c:1326 builtin/commit.c:1607
+msgid "show branch information"
+msgstr "브랜치 정보를 표시합니다"
+
+#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544
+#: builtin/worktree.c:423
+msgid "machine-readable output"
+msgstr "컴퓨터가 읽을 수 있는 형식"
+
+#: builtin/commit.c:1331 builtin/commit.c:1611
+msgid "show status in long format (default)"
+msgstr "긴 형식으로 상태를 표시합니다 (기본값)"
+
+#: builtin/commit.c:1334 builtin/commit.c:1614
+msgid "terminate entries with NUL"
+msgstr "NUL 문자로 항목을 끝냅니다"
+
+#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981
+#: builtin/fast-export.c:984 builtin/tag.c:353
+msgid "mode"
+msgstr "모드"
+
+#: builtin/commit.c:1337 builtin/commit.c:1617
+msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
+msgstr "추적되지 않는 파일을 표시합니다. 추가 옵션: all, normal, no (기본값: all)"
+
+#: builtin/commit.c:1340
+msgid "show ignored files"
+msgstr "무시되는 파일을 표시합니다"
+
+#: builtin/commit.c:1341 parse-options.h:155
+msgid "when"
+msgstr "언제"
+
+#: builtin/commit.c:1342
+msgid ""
+"ignore changes to submodules, optional when: all, dirty, untracked. "
+"(Default: all)"
+msgstr "하위 모듈의 변경을 무시합니다. 추가 옵션: all, dirty, untracked. (기본값: all)"
+
+#: builtin/commit.c:1344
+msgid "list untracked files in columns"
+msgstr "추적되지 않는 파일의 목록을 여러 열로 표시합니다"
+
+#: builtin/commit.c:1430
+msgid "couldn't look up newly created commit"
+msgstr "새로 만든 커밋을 찾아볼 수 없습니다"
+
+#: builtin/commit.c:1432
+msgid "could not parse newly created commit"
+msgstr "새로 만든 커밋을 파싱할 수 없습니다"
+
+#: builtin/commit.c:1477
+msgid "detached HEAD"
+msgstr "HEAD 분리됨"
+
+#: builtin/commit.c:1480
+msgid " (root-commit)"
+msgstr " (최상위-커밋)"
+
+#: builtin/commit.c:1575
+msgid "suppress summary after successful commit"
+msgstr "성공적인 커밋 후에 요약을 표시하지 않습니다"
+
+#: builtin/commit.c:1576
+msgid "show diff in commit message template"
+msgstr "커밋 메시지 서식에 diff를 표시합니다"
+
+#: builtin/commit.c:1578
+msgid "Commit message options"
+msgstr "커밋 메시지 옵션"
+
+#: builtin/commit.c:1579 builtin/tag.c:351
+msgid "read message from file"
+msgstr "파일에서 메시지를 읽습니다"
+
+#: builtin/commit.c:1580
+msgid "author"
+msgstr "작성자"
+
+#: builtin/commit.c:1580
+msgid "override author for commit"
+msgstr "커밋의 작성자를 지정합니다"
+
+#: builtin/commit.c:1581 builtin/gc.c:326
+msgid "date"
+msgstr "시각"
+
+#: builtin/commit.c:1581
+msgid "override date for commit"
+msgstr "커밋의 시각을 지정합니다"
+
+#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392
+#: builtin/notes.c:555 builtin/tag.c:349
+msgid "message"
+msgstr "메시지"
+
+#: builtin/commit.c:1582
+msgid "commit message"
+msgstr "커밋 메시지"
+
+#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585
+#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79
+msgid "commit"
+msgstr "커밋"
+
+#: builtin/commit.c:1583
+msgid "reuse and edit message from specified commit"
+msgstr "지정한 커밋의 메시지를 재사용하고 편집합니다"
+
+#: builtin/commit.c:1584
+msgid "reuse message from specified commit"
+msgstr "지정한 커밋에서 메시지를 재사용합니다"
+
+#: builtin/commit.c:1585
+msgid "use autosquash formatted message to fixup specified commit"
+msgstr "지정한 커밋을 수정하는데 autosquash 형식 메시지를 사용합니다"
+
+#: builtin/commit.c:1586
+msgid "use autosquash formatted message to squash specified commit"
+msgstr "지정한 커밋을 합치는데 autosquash 형식 메시지를 사용합니다"
+
+#: builtin/commit.c:1587
+msgid "the commit is authored by me now (used with -C/-c/--amend)"
+msgstr "커밋을 내가 작성한 것으로 만듭니다 (-C/-c/--amend와 같이 사용)"
+
+#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86
+msgid "add Signed-off-by:"
+msgstr "Signed-off-by: 줄을 추가합니다"
+
+#: builtin/commit.c:1589
+msgid "use specified template file"
+msgstr "지정한 서식 파일을 사용합니다"
+
+#: builtin/commit.c:1590
+msgid "force edit of commit"
+msgstr "커밋 편집을 강제합니다"
+
+#: builtin/commit.c:1591
+msgid "default"
+msgstr "기본값"
+
+#: builtin/commit.c:1591 builtin/tag.c:354
+msgid "how to strip spaces and #comments from message"
+msgstr "메시지에서 공백과 #주석을 지웁니다"
+
+#: builtin/commit.c:1592
+msgid "include status in commit message template"
+msgstr "커밋 메시지 서식에 상태를 포함합니다"
+
+#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156
+#: builtin/revert.c:93
+msgid "GPG sign commit"
+msgstr "GPG 서명 커밋"
+
+#: builtin/commit.c:1597
+msgid "Commit contents options"
+msgstr "커밋 내용 옵션"
+
+#: builtin/commit.c:1598
+msgid "commit all changed files"
+msgstr "변경된 파일을 모두 커밋합니다"
+
+#: builtin/commit.c:1599
+msgid "add specified files to index for commit"
+msgstr "지정한 파일을 커밋할 인덱스에 추가합니다"
+
+#: builtin/commit.c:1600
+msgid "interactively add files"
+msgstr "대화형으로 파일을 추가합니다"
+
+#: builtin/commit.c:1601
+msgid "interactively add changes"
+msgstr "대화형으로 변경 사항을 추가합니다"
+
+#: builtin/commit.c:1602
+msgid "commit only specified files"
+msgstr "지정한 파일만 커밋합니다"
+
+#: builtin/commit.c:1603
+msgid "bypass pre-commit hook"
+msgstr "커밋 전 후크를 건너뜁니다"
+
+#: builtin/commit.c:1604
+msgid "show what would be committed"
+msgstr "무엇을 커밋할지 표시합니다"
+
+#: builtin/commit.c:1615
+msgid "amend previous commit"
+msgstr "바로 앞 커밋을 바꿉니다"
+
+#: builtin/commit.c:1616
+msgid "bypass post-rewrite hook"
+msgstr "다시쓰기 후 후크를 건너뜁니다"
+
+#: builtin/commit.c:1621
+msgid "ok to record an empty change"
+msgstr "빈 변경 사항을 기록하도록 허용합니다"
+
+#: builtin/commit.c:1623
+msgid "ok to record a change with an empty message"
+msgstr "빈 메시지와 같이 변경 사항을 기록하도록 허용합니다"
+
+#: builtin/commit.c:1652
+msgid "could not parse HEAD commit"
+msgstr "HEAD 커밋을 파싱할 수 없습니다"
+
+#: builtin/commit.c:1698
+#, c-format
+msgid "Corrupt MERGE_HEAD file (%s)"
+msgstr "손상된 MERGE_HEAD 파일 (%s)"
+
+#: builtin/commit.c:1705
+msgid "could not read MERGE_MODE"
+msgstr "MERGE_MODE를 읽을 수 없습니다"
+
+#: builtin/commit.c:1724
+#, c-format
+msgid "could not read commit message: %s"
+msgstr "커밋 메시지를 읽을 수 없습니다: %s"
+
+#: builtin/commit.c:1735
+#, c-format
+msgid "Aborting commit; you did not edit the message.\n"
+msgstr "커밋을 중지합니다. 메시지를 편집하지 않았습니다.\n"
+
+#: builtin/commit.c:1740
+#, c-format
+msgid "Aborting commit due to empty commit message.\n"
+msgstr "커밋을 중지합니다. 커밋 메시지가 비어 있습니다.\n"
+
+#: builtin/commit.c:1788
+msgid ""
+"Repository has been updated, but unable to write\n"
+"new_index file. Check that disk is not full and quota is\n"
+"not exceeded, and then \"git reset HEAD\" to recover."
+msgstr ""
+"저장소를 업데이트했습니다. 하지만 new_index 파일을 쓸 수\n"
+"없습니다. 디스크가 꽉 차지 않았고 제한 용량을 넘어가지\n"
+"않았는지 확인하십시오. 그리고 'git reset HEAD'로 복구하십시오."
+
+#: builtin/config.c:8
+msgid "git config [<options>]"
+msgstr "git config [<옵션>]"
+
+#: builtin/config.c:54
+msgid "Config file location"
+msgstr "설정 파일 위치"
+
+#: builtin/config.c:55
+msgid "use global config file"
+msgstr "공통 설정 파일을 사용합니다"
+
+#: builtin/config.c:56
+msgid "use system config file"
+msgstr "시스템 설정 파일을 사용합니다"
+
+#: builtin/config.c:57
+msgid "use repository config file"
+msgstr "저장소 설정 파일을 사용합니다"
+
+#: builtin/config.c:58
+msgid "use given config file"
+msgstr "지정한 설정 파일을 사용합니다"
+
+#: builtin/config.c:59
+msgid "blob-id"
+msgstr "블롭-id"
+
+#: builtin/config.c:59
+msgid "read config from given blob object"
+msgstr "지정한 블롭 오브젝트에서 설정을 읽습니다"
+
+#: builtin/config.c:60
+msgid "Action"
+msgstr "동작"
+
+#: builtin/config.c:61
+msgid "get value: name [value-regex]"
+msgstr "값을 가져옵니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:62
+msgid "get all values: key [value-regex]"
+msgstr "모든 값을 가져옵니다: <키> [<값-정규식>]"
+
+#: builtin/config.c:63
+msgid "get values for regexp: name-regex [value-regex]"
+msgstr "정규식에 대한 값을 가져옵니다: <이름-정규식> [<값-정규식>]"
+
+#: builtin/config.c:64
+msgid "get value specific for the URL: section[.var] URL"
+msgstr "<URL>에 특정되는 값을 가져옵니다: <섹션>[.<변수>] <URL>"
+
+#: builtin/config.c:65
+msgid "replace all matching variables: name value [value_regex]"
+msgstr "해당하는 변수를 모두 제거합니다: <이름> <값> [<값-정규식>]"
+
+#: builtin/config.c:66
+msgid "add a new variable: name value"
+msgstr "새 변수를 추가합니다: <이름> <값>"
+
+#: builtin/config.c:67
+msgid "remove a variable: name [value-regex]"
+msgstr "변수를 제거합니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:68
+msgid "remove all matches: name [value-regex]"
+msgstr "해당하는 항목을 모두 제거합니다: <이름> [<값-정규식>]"
+
+#: builtin/config.c:69
+msgid "rename section: old-name new-name"
+msgstr "섹션의 이름을 바꿉니다: <옛-이름> <새-이름>"
+
+#: builtin/config.c:70
+msgid "remove a section: name"
+msgstr "섹션을 제거합니다: <이름>"
+
+#: builtin/config.c:71
+msgid "list all"
+msgstr "전체 목록을 표시합니다"
+
+#: builtin/config.c:72
+msgid "open an editor"
+msgstr "편집기를 엽니다"
+
+#: builtin/config.c:73
+msgid "find the color configured: slot [default]"
+msgstr "설정한 색을 찾습니다: slot [<기본값>]"
+
+#: builtin/config.c:74
+msgid "find the color setting: slot [stdout-is-tty]"
+msgstr "색 설정을 찾습니다: slot [<표준출력이-TTY인지-여부>]"
+
+#: builtin/config.c:75
+msgid "Type"
+msgstr "값 종류"
+
+#: builtin/config.c:76
+msgid "value is \"true\" or \"false\""
+msgstr "값이 \"true\" 또는 \"false\"입니다"
+
+#: builtin/config.c:77
+msgid "value is decimal number"
+msgstr "값이 십진수입니다"
+
+#: builtin/config.c:78
+msgid "value is --bool or --int"
+msgstr "값이 --bool 또는 --int입니다"
+
+#: builtin/config.c:79
+msgid "value is a path (file or directory name)"
+msgstr "값이 경로(파일 또는 디렉터리 이름)입니다"
+
+#: builtin/config.c:80
+msgid "Other"
+msgstr "기타"
+
+#: builtin/config.c:81
+msgid "terminate values with NUL byte"
+msgstr "값을 NUL 바이트로 끝냅니다"
+
+#: builtin/config.c:82
+msgid "show variable names only"
+msgstr "변수 이름만 표시합니다"
+
+#: builtin/config.c:83
+msgid "respect include directives on lookup"
+msgstr "찾아볼 때 include 지시어를 고려합니다"
+
+#: builtin/config.c:303
+msgid "unable to parse default color value"
+msgstr "기본 색 값을 파싱할 수 없습니다"
+
+#: builtin/config.c:441
+#, c-format
+msgid ""
+"# This is Git's per-user configuration file.\n"
+"[user]\n"
+"# Please adapt and uncomment the following lines:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
+msgstr ""
+"# 깃의 사용자별 설정 파일입니다.\n"
+"[user]\n"
+"# 다음 줄을 알맞게 고치고 앞의 주석을 제거하십시오:\n"
+"#\tname = %s\n"
+"#\temail = %s\n"
+
+#: builtin/config.c:575
+#, c-format
+msgid "cannot create configuration file %s"
+msgstr "%s 설정 파일을 만들 수 없습니다"
+
+#: builtin/count-objects.c:77
+msgid "git count-objects [-v] [-H | --human-readable]"
+msgstr "git count-objects [-v] [-H | --human-readable]"
+
+#: builtin/count-objects.c:87
+msgid "print sizes in human readable format"
+msgstr "사람이 읽기 좋은 형식으로 크기를 표시합니다"
+
+#: builtin/describe.c:17
+msgid "git describe [<options>] [<commit-ish>...]"
+msgstr "git describe [<옵션>] [<커밋-따위>...]"
+
+#: builtin/describe.c:18
+msgid "git describe [<options>] --dirty"
+msgstr "git describe [<옵션>] --dirty"
+
+#: builtin/describe.c:217
+#, c-format
+msgid "annotated tag %s not available"
+msgstr "주석 달린 %s 태그를 사용할 수 없습니다"
+
+#: builtin/describe.c:221
+#, c-format
+msgid "annotated tag %s has no embedded name"
+msgstr "주석 달린 %s 태그에 내장된 이름이 없습니다"
+
+#: builtin/describe.c:223
+#, c-format
+msgid "tag '%s' is really '%s' here"
+msgstr "'%s' 태그가 실제 여기 '%s'입니다"
+
+#: builtin/describe.c:250 builtin/log.c:459
+#, c-format
+msgid "Not a valid object name %s"
+msgstr "올바른 오브젝트 이름이 아닙니다 (%s)"
+
+#: builtin/describe.c:253
+#, c-format
+msgid "%s is not a valid '%s' object"
+msgstr "%s은(는) 올바른 '%s' 오브젝트가 아닙니다"
+
+#: builtin/describe.c:270
+#, c-format
+msgid "no tag exactly matches '%s'"
+msgstr "어떤 태그도 '%s'와(과) 정확히 일치하지 않습니다"
+
+#: builtin/describe.c:272
+#, c-format
+msgid "searching to describe %s\n"
+msgstr "%s 설명을 위해 검색하는 중\n"
+
+#: builtin/describe.c:319
+#, c-format
+msgid "finished search at %s\n"
+msgstr "%s에서 검색 마침\n"
+
+#: builtin/describe.c:346
+#, c-format
+msgid ""
+"No annotated tags can describe '%s'.\n"
+"However, there were unannotated tags: try --tags."
+msgstr ""
+"어떤 주석 달린 태그도 '%s'을(를) 설명하지 않습니다.\n"
+"하지만 주석 달리지 않은 태그가 있습니다: --tags 옵션을 해 보십시오."
+
+#: builtin/describe.c:350
+#, c-format
+msgid ""
+"No tags can describe '%s'.\n"
+"Try --always, or create some tags."
+msgstr ""
+"어떤 태그도 '%s'을(를) 설명할 수 없습니다.\n"
+"--always 옵션을 써 보거나, 태그를 만들어 보십시오."
+
+#: builtin/describe.c:371
+#, c-format
+msgid "traversed %lu commits\n"
+msgstr "커밋 %lu개를 가로질렀습니다\n"
+
+#: builtin/describe.c:374
+#, c-format
+msgid ""
+"more than %i tags found; listed %i most recent\n"
+"gave up search at %s\n"
+msgstr ""
+"태그를 %i개 넘게 찾았습니다. 가장 최근의 %i개 목록을\n"
+"표시합니다. %s 위치에서 검색을 중지합니다.\n"
+
+#: builtin/describe.c:396
+msgid "find the tag that comes after the commit"
+msgstr "커밋 다음에 오는 태그를 찾습니다"
+
+#: builtin/describe.c:397
+msgid "debug search strategy on stderr"
+msgstr "표준 오류에서 검색 전략을 디버깅합니다"
+
+#: builtin/describe.c:398
+msgid "use any ref"
+msgstr "모든 레퍼런스를 사용합니다"
+
+#: builtin/describe.c:399
+msgid "use any tag, even unannotated"
+msgstr "모든 태그를, 주석 달리지 않은 태그까지 사용합니다"
+
+#: builtin/describe.c:400
+msgid "always use long format"
+msgstr "항상 긴 형식을 사용합니다"
+
+#: builtin/describe.c:401
+msgid "only follow first parent"
+msgstr "첫 번째 이전 커밋만 따라갑니다"
+
+#: builtin/describe.c:404
+msgid "only output exact matches"
+msgstr "정확히 일치하는 항목만 출력합니다"
+
+#: builtin/describe.c:406
+msgid "consider <n> most recent tags (default: 10)"
+msgstr "<n>개의 가장 최근의 태그만 고려합니다 (기본값: 10)"
+
+#: builtin/describe.c:408
+msgid "only consider tags matching <pattern>"
+msgstr "<패턴>과 일치하는 태그만 고려합니다"
+
+#: builtin/describe.c:410 builtin/name-rev.c:314
+msgid "show abbreviated commit object as fallback"
+msgstr "대안으로 요약한 커밋 오브젝트를 표시합니다"
+
+#: builtin/describe.c:411
+msgid "mark"
+msgstr "표시"
+
+#: builtin/describe.c:412
+msgid "append <mark> on dirty working tree (default: \"-dirty\")"
+msgstr "변경된 작업 폴더에 <표시>를 뒤에 붙입니다 (기본값: \"-dirty\")"
+
+#: builtin/describe.c:430
+msgid "--long is incompatible with --abbrev=0"
+msgstr "--long 옵션은 --abbrev=0 옵션과 호환되지 않습니다"
+
+#: builtin/describe.c:456
+msgid "No names found, cannot describe anything."
+msgstr "이름이 없습니다. 아무것도 설명할 수 없습니다."
+
+#: builtin/describe.c:476
+msgid "--dirty is incompatible with commit-ishes"
+msgstr "--dirty 옵션은 커밋같은 항목과 호환되지 않았습니다"
+
+#: builtin/diff.c:86
+#, c-format
+msgid "'%s': not a regular file or symlink"
+msgstr "'%s': 일반 파일이나 심볼릭 링크가 아닙니다"
+
+#: builtin/diff.c:237
+#, c-format
+msgid "invalid option: %s"
+msgstr "잘못된 옵션: %s"
+
+#: builtin/diff.c:358
+msgid "Not a git repository"
+msgstr "깃 저장소가 아닙니다"
+
+#: builtin/diff.c:401
+#, c-format
+msgid "invalid object '%s' given."
+msgstr "잘못된 '%s' 오브젝트가 주어졌습니다."
+
+#: builtin/diff.c:410
+#, c-format
+msgid "more than two blobs given: '%s'"
+msgstr "두 개보다 많은 블롭이 주어졌습니다: '%s'"
+
+#: builtin/diff.c:417
+#, c-format
+msgid "unhandled object '%s' given."
+msgstr "처리하지 않은 '%s' 오브젝트가 주어졌습니다."
+
+#: builtin/fast-export.c:25
+msgid "git fast-export [rev-list-opts]"
+msgstr "git fast-export [rev-list-옵션]"
+
+#: builtin/fast-export.c:980
+msgid "show progress after <n> objects"
+msgstr "오브젝트 <n>개 뒤에 진행 상황을 표시합니다"
+
+#: builtin/fast-export.c:982
+msgid "select handling of signed tags"
+msgstr "서명한 태그의 처리 방식을 선택합니다"
+
+#: builtin/fast-export.c:985
+msgid "select handling of tags that tag filtered objects"
+msgstr "필터링한 오브젝트에 대한 태그의 처리 방식을 선택합니다"
+
+#: builtin/fast-export.c:988
+msgid "Dump marks to this file"
+msgstr "이 파일로 표시를 내보냅니다"
+
+#: builtin/fast-export.c:990
+msgid "Import marks from this file"
+msgstr "이 파일에서 표시를 가져옵니다"
+
+#: builtin/fast-export.c:992
+msgid "Fake a tagger when tags lack one"
+msgstr "태그에 태그붙인 사람이 없을 때 가짜로 만듭니다"
+
+#: builtin/fast-export.c:994
+msgid "Output full tree for each commit"
+msgstr "커밋 마다 전체 트리를 출력합니다"
+
+#: builtin/fast-export.c:996
+msgid "Use the done feature to terminate the stream"
+msgstr "스트림을 끝내는데 완료 기능을 사용합니다"
+
+#: builtin/fast-export.c:997
+msgid "Skip output of blob data"
+msgstr "블롭 데이터의 출력을 건너뜁니다"
+
+#: builtin/fast-export.c:998
+msgid "refspec"
+msgstr "레퍼런스명세"
+
+#: builtin/fast-export.c:999
+msgid "Apply refspec to exported refs"
+msgstr "레퍼런스명세를 내보낸 레퍼런스에 적용합니다"
+
+#: builtin/fast-export.c:1000
+msgid "anonymize output"
+msgstr "출력을 익명화합니다"
+
+#: builtin/fetch.c:20
+msgid "git fetch [<options>] [<repository> [<refspec>...]]"
+msgstr "git fetch [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/fetch.c:21
+msgid "git fetch [<options>] <group>"
+msgstr "git fetch [<옵션>] <그룹>"
+
+#: builtin/fetch.c:22
+msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
+msgstr "git fetch --multiple [<옵션>] [(<저장소> | <그룹>)...]"
+
+#: builtin/fetch.c:23
+msgid "git fetch --all [<options>]"
+msgstr "git fetch --all [<옵션>]"
+
+#: builtin/fetch.c:90 builtin/pull.c:162
+msgid "fetch from all remotes"
+msgstr "모든 리모트에서 가져옵니다"
+
+#: builtin/fetch.c:92 builtin/pull.c:165
+msgid "append to .git/FETCH_HEAD instead of overwriting"
+msgstr "덮어쓰지 말고 .git/FETCH_HEAD에 덧붙입니다"
+
+#: builtin/fetch.c:94 builtin/pull.c:168
+msgid "path to upload pack on remote end"
+msgstr "리모트 쪽에 묶음을 업로드할 경로"
+
+#: builtin/fetch.c:95 builtin/pull.c:170
+msgid "force overwrite of local branch"
+msgstr "로컬 브랜치를 강제로 덮어씁니다"
+
+#: builtin/fetch.c:97
+msgid "fetch from multiple remotes"
+msgstr "여러 리모트에서 가져옵니다"
+
+#: builtin/fetch.c:99 builtin/pull.c:172
+msgid "fetch all tags and associated objects"
+msgstr "모든 태그와 관련 오브젝트를 가져옵니다"
+
+#: builtin/fetch.c:101
+msgid "do not fetch all tags (--no-tags)"
+msgstr "모든 태그를 가져오지 않습니다 (--no-tags)"
+
+#: builtin/fetch.c:103 builtin/pull.c:175
+msgid "prune remote-tracking branches no longer on remote"
+msgstr "리모트에 이제 없는 리모트 추적 브랜치를 잘라냅니다"
+
+#: builtin/fetch.c:104 builtin/pull.c:178
+msgid "on-demand"
+msgstr "주문형"
+
+#: builtin/fetch.c:105 builtin/pull.c:179
+msgid "control recursive fetching of submodules"
+msgstr "하위 모듈 재귀적으로 가져오기 방식을 설정합니다"
+
+#: builtin/fetch.c:109 builtin/pull.c:184
+msgid "keep downloaded pack"
+msgstr "다운로드한 묶음을 보존합니다"
+
+#: builtin/fetch.c:111
+msgid "allow updating of HEAD ref"
+msgstr "HEAD 레퍼런스 업데이트를 허용합니다"
+
+#: builtin/fetch.c:114 builtin/pull.c:187
+msgid "deepen history of shallow clone"
+msgstr "얕은 복제의 커밋 내역을 깊게 만듭니다"
+
+#: builtin/fetch.c:116 builtin/pull.c:190
+msgid "convert to a complete repository"
+msgstr "완전한 저장소로 전환합니다"
+
+#: builtin/fetch.c:118 builtin/log.c:1233
+msgid "dir"
+msgstr "디렉터리"
+
+#: builtin/fetch.c:119
+msgid "prepend this to submodule path output"
+msgstr "하위 모듈 경로 출력의 앞에 이 디렉터리를 붙입니다"
+
+#: builtin/fetch.c:122
+msgid "default mode for recursion"
+msgstr "재귀 기본 모드"
+
+#: builtin/fetch.c:124 builtin/pull.c:193
+msgid "accept refs that update .git/shallow"
+msgstr ".git/shallow를 업데이트하는 레퍼런스를 허용합니다"
+
+#: builtin/fetch.c:125 builtin/pull.c:195
+msgid "refmap"
+msgstr "레퍼런스맵"
+
+#: builtin/fetch.c:126 builtin/pull.c:196
+msgid "specify fetch refmap"
+msgstr "레퍼런스맵 가져오기를 지정합니다"
+
+#: builtin/fetch.c:378
+msgid "Couldn't find remote ref HEAD"
+msgstr "리모트 레퍼런스 HEAD를 찾을 수 없습니다"
+
+#: builtin/fetch.c:458
+#, c-format
+msgid "object %s not found"
+msgstr "%s 오브젝트가 없습니다"
+
+#: builtin/fetch.c:463
+msgid "[up to date]"
+msgstr "[최신 상태]"
+
+#: builtin/fetch.c:477
+#, c-format
+msgid "! %-*s %-*s -> %s  (can't fetch in current branch)"
+msgstr "! %-*s %-*s -> %s  (현재 브랜치에서 가져올 수 없음)"
+
+#: builtin/fetch.c:478 builtin/fetch.c:566
+msgid "[rejected]"
+msgstr "[거부됨]"
+
+#: builtin/fetch.c:489
+msgid "[tag update]"
+msgstr "[태그 업데이트]"
+
+#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544
+msgid "  (unable to update local ref)"
+msgstr "  (로컬 레퍼런스를 업데이트할 수 없음)"
+
+#: builtin/fetch.c:509
+msgid "[new tag]"
+msgstr "[새로운 태그]"
+
+#: builtin/fetch.c:512
+msgid "[new branch]"
+msgstr "[새로운 브랜치]"
+
+#: builtin/fetch.c:515
+msgid "[new ref]"
+msgstr "[새로운 레퍼런스]"
+
+#: builtin/fetch.c:561
+msgid "unable to update local ref"
+msgstr "로컬 레퍼런스를 업데이트할 수 없습니다"
+
+#: builtin/fetch.c:561
+msgid "forced update"
+msgstr "강제 업데이트"
+
+#: builtin/fetch.c:568
+msgid "(non-fast-forward)"
+msgstr "(정방향 진행이 아님)"
+
+#: builtin/fetch.c:602 builtin/fetch.c:843
+#, c-format
+msgid "cannot open %s: %s\n"
+msgstr "%s을(를) 열 수 없습니다: %s\n"
+
+#: builtin/fetch.c:611
+#, c-format
+msgid "%s did not send all necessary objects\n"
+msgstr "%s이(가) 모든 필요한 오브젝트를 보내지 않았습니다\n"
+
+#: builtin/fetch.c:629
+#, c-format
+msgid "reject %s because shallow roots are not allowed to be updated"
+msgstr "얕은 최상위의 업데이트가 허용되지 않으므로 %s을(를) 거부합니다"
+
+#: builtin/fetch.c:716 builtin/fetch.c:808
+#, c-format
+msgid "From %.*s\n"
+msgstr "%.*s URL에서\n"
+
+#: builtin/fetch.c:727
+#, c-format
+msgid ""
+"some local refs could not be updated; try running\n"
+" 'git remote prune %s' to remove any old, conflicting branches"
+msgstr ""
+"업데이트할 수 없는 로컬 레퍼런스가 있습니다. 과거 충돌 브랜치를\n"
+" 제거하려면 'git remote prune %s' 명령을 실행해 보십시오"
+
+#: builtin/fetch.c:779
+#, c-format
+msgid "   (%s will become dangling)"
+msgstr "   (%s 레퍼런스가 연결이 끊어지게 됩니다)"
+
+#: builtin/fetch.c:780
+#, c-format
+msgid "   (%s has become dangling)"
+msgstr "   (%s 레퍼런스가 연결이 끊어졌습니다)"
+
+#: builtin/fetch.c:812
+msgid "[deleted]"
+msgstr "[삭제됨]"
+
+#: builtin/fetch.c:813 builtin/remote.c:1040
+msgid "(none)"
+msgstr "(없음)"
+
+#: builtin/fetch.c:833
+#, c-format
+msgid "Refusing to fetch into current branch %s of non-bare repository"
+msgstr "간략한 저장소가 아닌 저장소의 현재 %s 브랜치로 가져오기를 거절합니다"
+
+#: builtin/fetch.c:852
+#, c-format
+msgid "Option \"%s\" value \"%s\" is not valid for %s"
+msgstr "\"%s\" 옵션의 \"%s\" 값은 %s에 대해 올바르지 않습니다"
+
+#: builtin/fetch.c:855
+#, c-format
+msgid "Option \"%s\" is ignored for %s\n"
+msgstr "\"%s\" 옵션은 '%s'에 대해 무시됩니다\n"
+
+#: builtin/fetch.c:911
+#, c-format
+msgid "Don't know how to fetch from %s"
+msgstr "'%s'에서 가져오는 방법을 알 수 없습니다"
+
+#: builtin/fetch.c:1072
+#, c-format
+msgid "Fetching %s\n"
+msgstr "%s을(를) 가져오는 중\n"
+
+#: builtin/fetch.c:1074 builtin/remote.c:96
+#, c-format
+msgid "Could not fetch %s"
+msgstr "%s을(를) 가져올 수 없습니다"
+
+#: builtin/fetch.c:1092
+msgid ""
+"No remote repository specified.  Please, specify either a URL or a\n"
+"remote name from which new revisions should be fetched."
+msgstr ""
+"리모트 저장소를 지정하지 않았습니다. 새 리비전을 가져올 수 있는\n"
+"URL이나 리모트 이름을 지정하십시오."
+
+#: builtin/fetch.c:1115
+msgid "You need to specify a tag name."
+msgstr "태그 이름을 지정해야 합니다."
+
+#: builtin/fetch.c:1157
+msgid "--depth and --unshallow cannot be used together"
+msgstr "--depth 및 --unshallow 옵션은 같이 쓸 수 없습니다"
+
+#: builtin/fetch.c:1159
+msgid "--unshallow on a complete repository does not make sense"
+msgstr "완전한 저장소에 대해 --unshallow 옵션을 사용하는 건 앞뒤가 맞지 않습니다"
+
+#: builtin/fetch.c:1179
+msgid "fetch --all does not take a repository argument"
+msgstr "fetch --all 명령에 저장소 인자가 없습니다"
+
+#: builtin/fetch.c:1181
+msgid "fetch --all does not make sense with refspecs"
+msgstr "fetch --all 명령은 레퍼런스명세 인자와 같이 쓰면 앞뒤가 맞지 않습니다"
+
+#: builtin/fetch.c:1192
+#, c-format
+msgid "No such remote or remote group: %s"
+msgstr "그런 리모트나 리모트 그룹이 없습니다: %s"
+
+#: builtin/fetch.c:1200
+msgid "Fetching a group and specifying refspecs does not make sense"
+msgstr "그룹을 가져오고 레퍼런스명세를 지정하면 앞뒤가 맞지 않습니다"
+
+#: builtin/fmt-merge-msg.c:14
+msgid ""
+"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"
+msgstr ""
+"git fmt-merge-msg [-m <메시지>] [--log[=<n>] | --no-log] [--file <파일>]"
+
+#: builtin/fmt-merge-msg.c:667
+msgid "populate log with at most <n> entries from shortlog"
+msgstr "shortlog에서 최대 <n>개 로그를 표시합니다"
+
+#: builtin/fmt-merge-msg.c:670
+msgid "alias for --log (deprecated)"
+msgstr "--log와 동일 (없어질 예정)"
+
+#: builtin/fmt-merge-msg.c:673
+msgid "text"
+msgstr "텍스트"
+
+#: builtin/fmt-merge-msg.c:674
+msgid "use <text> as start of message"
+msgstr "<텍스트>를 시작 메시지로 사용합니다"
+
+#: builtin/fmt-merge-msg.c:675
+msgid "file to read from"
+msgstr "읽어들일 파일"
+
+#: builtin/for-each-ref.c:9
+msgid "git for-each-ref [<options>] [<pattern>]"
+msgstr "git for-each-ref [<옵션>] [<패턴>]"
+
+#: builtin/for-each-ref.c:10
+msgid "git for-each-ref [--points-at <object>]"
+msgstr "git for-each-ref [--points-at <오브젝트>]"
+
+#: builtin/for-each-ref.c:11
+msgid "git for-each-ref [(--merged | --no-merged) [<object>]]"
+msgstr "git for-each-ref [(--merged | --no-merged) [<오브젝트>]]"
+
+#: builtin/for-each-ref.c:12
+msgid "git for-each-ref [--contains [<object>]]"
+msgstr "git for-each-ref [--contains [<오브젝트>]]"
+
+#: builtin/for-each-ref.c:27
+msgid "quote placeholders suitably for shells"
+msgstr "셸에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:29
+msgid "quote placeholders suitably for perl"
+msgstr "펄에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:31
+msgid "quote placeholders suitably for python"
+msgstr "파이썬에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:33
+msgid "quote placeholders suitably for Tcl"
+msgstr "티클에 적합하게 플레이스홀더를 인용합니다"
+
+#: builtin/for-each-ref.c:36
+msgid "show only <n> matched refs"
+msgstr "<n>개의 해당하는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:37 builtin/tag.c:372
+msgid "format to use for the output"
+msgstr "출력에 사용할 형식"
+
+#: builtin/for-each-ref.c:41
+msgid "print only refs which points at the given object"
+msgstr "주어진 오브젝트를 가리키는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:43
+msgid "print only refs that are merged"
+msgstr "병합하는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:44
+msgid "print only refs that are not merged"
+msgstr "병합하지 않는 레퍼런스만 표시합니다"
+
+#: builtin/for-each-ref.c:45
+msgid "print only refs which contain the commit"
+msgstr "커밋이 포함된 레퍼런스만 표시합니다"
+
+#: builtin/fsck.c:156 builtin/prune.c:140
+msgid "Checking connectivity"
+msgstr "연결을 확인하는 중입니다"
+
+#: builtin/fsck.c:486
+msgid "Checking object directories"
+msgstr "오브젝트 디렉터리를 확인하는 중입니다"
+
+#: builtin/fsck.c:553
+msgid "git fsck [<options>] [<object>...]"
+msgstr "git fsck [<옵션>] [<오브젝트>...]"
+
+#: builtin/fsck.c:559
+msgid "show unreachable objects"
+msgstr "점근할 수 없는 오브젝트를 표시합니다"
+
+#: builtin/fsck.c:560
+msgid "show dangling objects"
+msgstr "연결이 끊어진 오브젝트를 표시합니다"
+
+#: builtin/fsck.c:561
+msgid "report tags"
+msgstr "태그를 알립니다"
+
+#: builtin/fsck.c:562
+msgid "report root nodes"
+msgstr "최상위 노드를 알립니다"
+
+#: builtin/fsck.c:563
+msgid "make index objects head nodes"
+msgstr "인덱스 오브젝트 헤드 노드를 만듭니다"
+
+#: builtin/fsck.c:564
+msgid "make reflogs head nodes (default)"
+msgstr "reflog 헤드 노드를 만듭니다 (기본값)"
+
+#: builtin/fsck.c:565
+msgid "also consider packs and alternate objects"
+msgstr "묶음과 보조 오브젝트도 만듭니다"
+
+#: builtin/fsck.c:566
+msgid "check only connectivity"
+msgstr "연결만 확인합니다"
+
+#: builtin/fsck.c:567
+msgid "enable more strict checking"
+msgstr "더 엄격하게 확인합니다"
+
+#: builtin/fsck.c:569
+msgid "write dangling objects in .git/lost-found"
+msgstr ".git/lost-found 안에 연결이 끊어진 오브젝트를 씁니다"
+
+#: builtin/fsck.c:570 builtin/prune.c:107
+msgid "show progress"
+msgstr "진행 상황을 표시합니다"
+
+#: builtin/fsck.c:631
+msgid "Checking objects"
+msgstr "오브젝트를 확인합니다"
+
+#: builtin/gc.c:25
+msgid "git gc [<options>]"
+msgstr "git gc [<옵션>]"
+
+#: builtin/gc.c:72
+#, c-format
+msgid "Invalid %s: '%s'"
+msgstr "잘못된 %s: '%s'"
+
+#: builtin/gc.c:139
+#, c-format
+msgid "insanely long object directory %.*s"
+msgstr "비정상적으로 긴 오브젝트 디렉터리 %.*s"
+
+#: builtin/gc.c:290
+#, c-format
+msgid ""
+"The last gc run reported the following. Please correct the root cause\n"
+"and remove %s.\n"
+"Automatic cleanup will not be performed until the file is removed.\n"
+"\n"
+"%s"
+msgstr ""
+"마지막 가비지컬렉터에서 다음을 알려왔습니다. 원인을 바로잡은\n"
+"다음 %s 파일을 제거하십시오.\n"
+"이 파일을 제거하기 전에는 자동 정리 작업을 수행하지 않습니다.\n"
+"\n"
+"%s"
+
+#: builtin/gc.c:327
+msgid "prune unreferenced objects"
+msgstr "레퍼런스하지 않는 오브젝트를 잘라냅니다"
+
+#: builtin/gc.c:329
+msgid "be more thorough (increased runtime)"
+msgstr "더 자세히 검사합니다 (실행 시간 늘어남)"
+
+#: builtin/gc.c:330
+msgid "enable auto-gc mode"
+msgstr "자동 가비지컬렉터 모드를 사용합니다"
+
+#: builtin/gc.c:331
+msgid "force running gc even if there may be another gc running"
+msgstr "이미 가비지컬렉터가 실행 중이더라도 강제로 가비지컬렉터를 실행합니다"
+
+#: builtin/gc.c:373
+#, c-format
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "최적 성능을 위해 백그라운드에서 자동으로 저장소의 묶음을 만듭니다.\n"
+
+#: builtin/gc.c:375
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "최적 성능을 위해 자동으로 저장소의 묶음을 만듭니다.\n"
+
+#: builtin/gc.c:376
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "수동 관리 작업은 \"git help gc\" 내용을 참고하십시오.\n"
+
+#: builtin/gc.c:397
+#, c-format
+msgid ""
+"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
+msgstr "가비지컬렉터가 이미 '%s' 컴퓨터에서 %<PRIuMAX> PID로 실행 중입니다 (아니면 --force를 사용하십시오)"
+
+#: builtin/gc.c:441
+msgid ""
+"There are too many unreachable loose objects; run 'git prune' to remove them."
+msgstr "느슨한 오브젝트가 너무 많습니다. 제거하려면 'git prune'을 실행하십시오."
+
+#: builtin/grep.c:23
+msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"
+msgstr "git grep [<옵션>] [-e] <패턴> [<리비전>...] [[--] <경로>...]"
+
+#: builtin/grep.c:218
+#, c-format
+msgid "grep: failed to create thread: %s"
+msgstr "grep: 스레드를 만드는데 실패했습니다: %s"
+
+#: builtin/grep.c:441 builtin/grep.c:476
+#, c-format
+msgid "unable to read tree (%s)"
+msgstr "트리를 읽을 수 없습니다 (%s)"
+
+#: builtin/grep.c:491
+#, c-format
+msgid "unable to grep from object of type %s"
+msgstr "종류가 %s인 오브젝트에서 grep을 할 수 없습니다"
+
+#: builtin/grep.c:547
+#, c-format
+msgid "switch `%c' expects a numerical value"
+msgstr "`%c' 옵션에는 숫자 값이 와야 합니다"
+
+#: builtin/grep.c:564
+#, c-format
+msgid "cannot open '%s'"
+msgstr "'%s'을(를) 열 수 없습니다"
+
+#: builtin/grep.c:633
+msgid "search in index instead of in the work tree"
+msgstr "작업 폴더 대신에 인덱스에서 검색합니다"
+
+#: builtin/grep.c:635
+msgid "find in contents not managed by git"
+msgstr "깃으로 관리하지 않은 내용에서 찾습니다"
+
+#: builtin/grep.c:637
+msgid "search in both tracked and untracked files"
+msgstr "추적되는 파일과 추적되지 않는 파일 모두에서 검색합니다"
+
+#: builtin/grep.c:639
+msgid "ignore files specified via '.gitignore'"
+msgstr "'.gitignore'로 지정한 파일을 무시합니다"
+
+#: builtin/grep.c:642
+msgid "show non-matching lines"
+msgstr "일치하지 않는 줄을 표시합니다"
+
+#: builtin/grep.c:644
+msgid "case insensitive matching"
+msgstr "대소문자 구별하지 않고 맞춥니다"
+
+#: builtin/grep.c:646
+msgid "match patterns only at word boundaries"
+msgstr "단어 경계 부분에 대해서만 패턴을 맞춥니다"
+
+#: builtin/grep.c:648
+msgid "process binary files as text"
+msgstr "바이너리 파일을 텍스트로 처리합니다"
+
+#: builtin/grep.c:650
+msgid "don't match patterns in binary files"
+msgstr "바이너리 파일에서 패턴을 맞추지 않습니다"
+
+#: builtin/grep.c:653
+msgid "process binary files with textconv filters"
+msgstr "textconv 필터를 사용해 바이너리 파일을 처리합니다"
+
+#: builtin/grep.c:655
+msgid "descend at most <depth> levels"
+msgstr "최대 <깊이> 단계만큼 내려갑니다"
+
+#: builtin/grep.c:659
+msgid "use extended POSIX regular expressions"
+msgstr "POSIX 확장 정규식을 사용합니다"
+
+#: builtin/grep.c:662
+msgid "use basic POSIX regular expressions (default)"
+msgstr "기본 POSIX 정규식을 사용합니다 (기본값)"
+
+#: builtin/grep.c:665
+msgid "interpret patterns as fixed strings"
+msgstr "패턴을 고정 문자열로 해석합니다"
+
+#: builtin/grep.c:668
+msgid "use Perl-compatible regular expressions"
+msgstr "펄과 호환되는 정규식을 사용합니다"
+
+#: builtin/grep.c:671
+msgid "show line numbers"
+msgstr "줄 번호를 표시합니다"
+
+#: builtin/grep.c:672
+msgid "don't show filenames"
+msgstr "파일 이름을 표시하지 않습니다"
+
+#: builtin/grep.c:673
+msgid "show filenames"
+msgstr "파일 이름을 표시합니다"
+
+#: builtin/grep.c:675
+msgid "show filenames relative to top directory"
+msgstr "파일 이름을 최상위 디렉터리 상대 경로로 표시합니다"
+
+#: builtin/grep.c:677
+msgid "show only filenames instead of matching lines"
+msgstr "일치하는 줄을 표시하지 않고 파일 이름만 표시합니다"
+
+#: builtin/grep.c:679
+msgid "synonym for --files-with-matches"
+msgstr "--files-with-matches 옵션과 동일"
+
+#: builtin/grep.c:682
+msgid "show only the names of files without match"
+msgstr "일치하지 않는 파일의 이름만 표시합니다"
+
+#: builtin/grep.c:684
+msgid "print NUL after filenames"
+msgstr "파일 이름 다음에 NUL을 출력합니다"
+
+#: builtin/grep.c:686
+msgid "show the number of matches instead of matching lines"
+msgstr "일치하는 줄을 표시하지 않고 일치하는 수를 표시합니다"
+
+#: builtin/grep.c:687
+msgid "highlight matches"
+msgstr "일치하는 부분을 강조합니다"
+
+#: builtin/grep.c:689
+msgid "print empty line between matches from different files"
+msgstr "다른 파일 사이에 일치하는 부분의 사이에 빈 줄을 출력합니다"
+
+#: builtin/grep.c:691
+msgid "show filename only once above matches from same file"
+msgstr "같은 파일에서 여러 개가 일치하면 파일 이름을 한 번만 표시합니다"
+
+#: builtin/grep.c:694
+msgid "show <n> context lines before and after matches"
+msgstr "일치하는 부분 앞뒤에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:697
+msgid "show <n> context lines before matches"
+msgstr "일치하는 부분 앞에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:699
+msgid "show <n> context lines after matches"
+msgstr "일치하는 부분 뒤에 컨텍스트를 <n>줄 표시합니다"
+
+#: builtin/grep.c:700
+msgid "shortcut for -C NUM"
+msgstr "-C NUM 옵션의 줄임"
+
+#: builtin/grep.c:703
+msgid "show a line with the function name before matches"
+msgstr "일치 항목 앞에 함수 이름 줄을 표시합니다"
+
+#: builtin/grep.c:705
+msgid "show the surrounding function"
+msgstr "들어 있는 함수를 표시합니다"
+
+#: builtin/grep.c:708
+msgid "read patterns from file"
+msgstr "파일에서 패턴을 읽습니다"
+
+#: builtin/grep.c:710
+msgid "match <pattern>"
+msgstr "<패턴>과 일치"
+
+#: builtin/grep.c:712
+msgid "combine patterns specified with -e"
+msgstr "-e 옵션으로 지정한 패턴을 결합합니다"
+
+#: builtin/grep.c:724
+msgid "indicate hit with exit status without output"
+msgstr "출력하지 않고 일치하는 항목을 exit() 상태 번호로 리턴합니다"
+
+#: builtin/grep.c:726
+msgid "show only matches from files that match all patterns"
+msgstr "모든 패턴과 일치하는 파일의 일치하는 부분만 표시합니다"
+
+#: builtin/grep.c:728
+msgid "show parse tree for grep expression"
+msgstr "grep 표현식에 대한 파싱 트리를 표시합니다"
+
+#: builtin/grep.c:732
+msgid "pager"
+msgstr "페이저"
+
+#: builtin/grep.c:732
+msgid "show matching files in the pager"
+msgstr "일치하는 파일을 페이저 프로그램에서 표시합니다"
+
+#: builtin/grep.c:735
+msgid "allow calling of grep(1) (ignored by this build)"
+msgstr "grep(1) 실행을 허용합니다 (이 빌드에서는 무시)"
+
+#: builtin/grep.c:793
+msgid "no pattern given."
+msgstr "패턴을 지정하지 않았습니다."
+
+#: builtin/grep.c:851
+msgid "--open-files-in-pager only works on the worktree"
+msgstr "--open-files-in-pager 옵션은 작업 폴더에서만 동작합니다"
+
+#: builtin/grep.c:877
+msgid "--cached or --untracked cannot be used with --no-index."
+msgstr "--cached 또는 --untracked 옵션은 --no-index 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/grep.c:882
+msgid "--no-index or --untracked cannot be used with revs."
+msgstr "--no-index 또는 --untracked 옵션은 리비전과 같이 쓸 수 없습니다."
+
+#: builtin/grep.c:885
+msgid "--[no-]exclude-standard cannot be used for tracked contents."
+msgstr "--[no-]exclude-standard 옵션은 추적되는 내용에 대해 쓸 수 없습니다."
+
+#: builtin/grep.c:893
+msgid "both --cached and trees are given."
+msgstr "--cached 옵션과 트리를 모두 지정했습니다."
+
+#: builtin/hash-object.c:80
+msgid ""
+"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] "
+"[--] <file>..."
+msgstr ""
+"git hash-object [-t <종류>] [-w] [--path=<파일> | --no-filters] [--stdin] "
+"[--] <파일>..."
+
+#: builtin/hash-object.c:81
+msgid "git hash-object  --stdin-paths"
+msgstr "git hash-object  --stdin-paths"
+
+#: builtin/hash-object.c:92
+msgid "type"
+msgstr "종류"
+
+#: builtin/hash-object.c:92
+msgid "object type"
+msgstr "오브젝트 종류"
+
+#: builtin/hash-object.c:93
+msgid "write the object into the object database"
+msgstr "오브젝트를 오브젝트 데이터베이스로 씁니다"
+
+#: builtin/hash-object.c:95
+msgid "read the object from stdin"
+msgstr "표준 입력에서 오브젝트를 읽습니다"
+
+#: builtin/hash-object.c:97
+msgid "store file as is without filters"
+msgstr "파일을 필터 없이 그대로 저장합니다"
+
+#: builtin/hash-object.c:98
+msgid ""
+"just hash any random garbage to create corrupt objects for debugging Git"
+msgstr "임의의 쓰레기 데이터를 해시해 손상된 오브젝트를 만듭니다 (디버깅용)"
+
+#: builtin/hash-object.c:99
+msgid "process file as it were from this path"
+msgstr "파일이 이 경로에서 온 것처럼 처리합니다"
+
+#: builtin/help.c:41
+msgid "print all available commands"
+msgstr "사용 가능한 모든 명령의 목록을 표시합니다"
+
+#: builtin/help.c:42
+msgid "print list of useful guides"
+msgstr "유용한 안내서 목록을 표시합니다"
+
+#: builtin/help.c:43
+msgid "show man page"
+msgstr "맨 페이지를 표시합니다"
+
+#: builtin/help.c:44
+msgid "show manual in web browser"
+msgstr "웹 브라우저에서 설명서를 표시합니다"
+
+#: builtin/help.c:46
+msgid "show info page"
+msgstr "인포 페이지를 표시합니다"
+
+#: builtin/help.c:52
+msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]"
+msgstr "git help [--all] [--guides] [--man | --web | --info] [<명령>]"
+
+#: builtin/help.c:64
+#, c-format
+msgid "unrecognized help format '%s'"
+msgstr "'%s' 도움말 포맷을 인식할 수 없습니다"
+
+#: builtin/help.c:91
+msgid "Failed to start emacsclient."
+msgstr "emacsclient 시작에 실패했습니다."
+
+#: builtin/help.c:104
+msgid "Failed to parse emacsclient version."
+msgstr "emacsclient 버전 파싱에 실패했습니다."
+
+#: builtin/help.c:112
+#, c-format
+msgid "emacsclient version '%d' too old (< 22)."
+msgstr "emacsclient '%d' 버전은 너무 과거 (< 22) 버전입니다."
+
+#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168
+#, c-format
+msgid "failed to exec '%s': %s"
+msgstr "실행 실패: '%s': %s"
+
+#: builtin/help.c:208
+#, c-format
+msgid ""
+"'%s': path for unsupported man viewer.\n"
+"Please consider using 'man.<tool>.cmd' instead."
+msgstr ""
+"'%s': 지원하지 않는 맨 페이지 보기 프로그램 경로.\n"
+"대신에 'man.<도구>.cmd' 옵션을 사용해 보십시오."
+
+#: builtin/help.c:220
+#, c-format
+msgid ""
+"'%s': cmd for supported man viewer.\n"
+"Please consider using 'man.<tool>.path' instead."
+msgstr ""
+"'%s': 지원하지 않는 맨 페이지 보기 프로그램 명령.\n"
+"대신에 'man.<도구>.path' 옵션을 사용해 보십시오."
+
+#: builtin/help.c:337
+#, c-format
+msgid "'%s': unknown man viewer."
+msgstr "'%s': 알 수 없는 맨 페이지 보기 프로그램."
+
+#: builtin/help.c:354
+msgid "no man viewer handled the request"
+msgstr "요청을 처리한 맨 페이지 보기 프로그램이 없습니다"
+
+#: builtin/help.c:362
+msgid "no info viewer handled the request"
+msgstr "요청을 처리한 인포 페이지 보기 프로그램이 없습니다"
+
+#: builtin/help.c:411
+msgid "Defining attributes per path"
+msgstr "경로마다 속성 정의하기"
+
+#: builtin/help.c:412
+msgid "Everyday Git With 20 Commands Or So"
+msgstr "매일매일 사용하는 20개 내외의 깃 명령"
+
+#: builtin/help.c:413
+msgid "A Git glossary"
+msgstr "깃 용어 사전"
+
+#: builtin/help.c:414
+msgid "Specifies intentionally untracked files to ignore"
+msgstr "의도적으로 추적하지 않는 파일을 무시하게 지정하기"
+
+#: builtin/help.c:415
+msgid "Defining submodule properties"
+msgstr "하위 모듈 속성 정의하기"
+
+#: builtin/help.c:416
+msgid "Specifying revisions and ranges for Git"
+msgstr "깃의 리비전 및 범위를 지정하기"
+
+#: builtin/help.c:417
+msgid "A tutorial introduction to Git (for version 1.5.1 or newer)"
+msgstr "깃 따라하기 안내서 (버전 1.5.1 이후)"
+
+#: builtin/help.c:418
+msgid "An overview of recommended workflows with Git"
+msgstr "추천하는 깃 활용 작업 순서의 개요"
+
+#: builtin/help.c:430
+msgid "The common Git guides are:\n"
+msgstr "자주 사용하는 깃 안내서는 다음과 같습니다:\n"
+
+#: builtin/help.c:451 builtin/help.c:468
+#, c-format
+msgid "usage: %s%s"
+msgstr "사용법: %s%s"
+
+#: builtin/help.c:484
+#, c-format
+msgid "`git %s' is aliased to `%s'"
+msgstr "`git %s' 명령은 `%s' 명령의 단축입니다"
+
+#: builtin/index-pack.c:152
+#, c-format
+msgid "unable to open %s"
+msgstr "%s을(를) 열 수 없습니다"
+
+#: builtin/index-pack.c:202
+#, c-format
+msgid "object type mismatch at %s"
+msgstr "오브젝트 종류가 맞지 않습니다 (%s)"
+
+#: builtin/index-pack.c:222
+#, c-format
+msgid "did not receive expected object %s"
+msgstr "예상한 %s 오브젝트를 받지 않았습니다"
+
+#: builtin/index-pack.c:225
+#, c-format
+msgid "object %s: expected type %s, found %s"
+msgstr "%s 오브젝트: 예상한 종류 %s, 실제 %s"
+
+#: builtin/index-pack.c:267
+#, c-format
+msgid "cannot fill %d byte"
+msgid_plural "cannot fill %d bytes"
+msgstr[0] "%d 바이트를 채울 수 없습니다"
+
+#: builtin/index-pack.c:277
+msgid "early EOF"
+msgstr "너무 빨리 파일이 끝남"
+
+#: builtin/index-pack.c:278
+msgid "read error on input"
+msgstr "입력에 읽기 오류"
+
+#: builtin/index-pack.c:290
+msgid "used more bytes than were available"
+msgstr "있는 바이트보다 더 많이 사용합니다"
+
+#: builtin/index-pack.c:297
+msgid "pack too large for current definition of off_t"
+msgstr "현재 정의된 off_t에 비해 묶음이 너무 큽니다"
+
+#: builtin/index-pack.c:313
+#, c-format
+msgid "unable to create '%s'"
+msgstr "'%s'을(를) 만들 수 없습니다"
+
+#: builtin/index-pack.c:318
+#, c-format
+msgid "cannot open packfile '%s'"
+msgstr "'%s' 묶음 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:332
+msgid "pack signature mismatch"
+msgstr "묶음 서명이 맞지 않습니다"
+
+#: builtin/index-pack.c:334
+#, c-format
+msgid "pack version %<PRIu32> unsupported"
+msgstr "묶음의 %<PRIu32> 버전을 지원하지 않습니다"
+
+#: builtin/index-pack.c:352
+#, c-format
+msgid "pack has bad object at offset %lu: %s"
+msgstr "묶음의 %lu 오프셋에 잘못된 오브젝트가 있습니다: %s"
+
+#: builtin/index-pack.c:473
+#, c-format
+msgid "inflate returned %d"
+msgstr "inflate가 %d번을 리턴했습니다"
+
+#: builtin/index-pack.c:522
+msgid "offset value overflow for delta base object"
+msgstr "델타 베이스 오브젝트에 대해 오프셋 값이 오버플로우"
+
+#: builtin/index-pack.c:530
+msgid "delta base offset is out of bound"
+msgstr "델타 베이스 오프셋이 범위를 벗어났습니다"
+
+#: builtin/index-pack.c:538
+#, c-format
+msgid "unknown object type %d"
+msgstr "알 수 없는 오브젝트 종류 %d번"
+
+#: builtin/index-pack.c:569
+msgid "cannot pread pack file"
+msgstr "묶음 파일에 대해 pread를 할 수 없습니다"
+
+#: builtin/index-pack.c:571
+#, c-format
+msgid "premature end of pack file, %lu byte missing"
+msgid_plural "premature end of pack file, %lu bytes missing"
+msgstr[0] "묶음 파일이 너무 일찍 끝남. %lu 바이트 부족"
+
+#: builtin/index-pack.c:597
+msgid "serious inflate inconsistency"
+msgstr "심각한 inflate 부조화"
+
+#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772
+#: builtin/index-pack.c:806 builtin/index-pack.c:815
+#, c-format
+msgid "SHA1 COLLISION FOUND WITH %s !"
+msgstr "SHA1 충돌이 %s에서 발견되었습니다!"
+
+#: builtin/index-pack.c:746 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
+#, c-format
+msgid "unable to read %s"
+msgstr "%s을(를) 읽을 수 없습니다"
+
+#: builtin/index-pack.c:812
+#, c-format
+msgid "cannot read existing object %s"
+msgstr "기존 %s 오브젝트를 읽을 수 없습니다"
+
+#: builtin/index-pack.c:826
+#, c-format
+msgid "invalid blob object %s"
+msgstr "잘못된 블롭 오브젝트 %s"
+
+#: builtin/index-pack.c:840
+#, c-format
+msgid "invalid %s"
+msgstr "잘못된 %s"
+
+#: builtin/index-pack.c:843
+msgid "Error in object"
+msgstr "오브젝트에 오류"
+
+#: builtin/index-pack.c:845
+#, c-format
+msgid "Not all child objects of %s are reachable"
+msgstr "%s의 모든 하위 오브젝트에 접근할 수 없습니다"
+
+#: builtin/index-pack.c:917 builtin/index-pack.c:948
+msgid "failed to apply delta"
+msgstr "델타를 적용하는데 실패했습니다"
+
+#: builtin/index-pack.c:1118
+msgid "Receiving objects"
+msgstr "오브젝트를 받는 중"
+
+#: builtin/index-pack.c:1118
+msgid "Indexing objects"
+msgstr "오브젝트 인덱스를 만드는 중"
+
+#: builtin/index-pack.c:1150
+msgid "pack is corrupted (SHA1 mismatch)"
+msgstr "묶음이 손상되었습니다 (SHA1 일치하지 않음)"
+
+#: builtin/index-pack.c:1155
+msgid "cannot fstat packfile"
+msgstr "묶음 파일에 대해 fstat()할 수 없습니다"
+
+#: builtin/index-pack.c:1158
+msgid "pack has junk at the end"
+msgstr "묶음의 끝에 쓰레기 데이터가 있습니다"
+
+#: builtin/index-pack.c:1169
+msgid "confusion beyond insanity in parse_pack_objects()"
+msgstr "parse_pack_objects()에서 극심한 혼란"
+
+#: builtin/index-pack.c:1194
+msgid "Resolving deltas"
+msgstr "델타를 알아내는 중"
+
+#: builtin/index-pack.c:1205
+#, c-format
+msgid "unable to create thread: %s"
+msgstr "스레드를 만들 수 없습니다: %s"
+
+#: builtin/index-pack.c:1247
+msgid "confusion beyond insanity"
+msgstr "극심한 혼란"
+
+#: builtin/index-pack.c:1253
+#, c-format
+msgid "completed with %d local objects"
+msgstr "로컬 오브젝트 %d개 마침"
+
+#: builtin/index-pack.c:1263
+#, c-format
+msgid "Unexpected tail checksum for %s (disk corruption?)"
+msgstr "%s에 대해 예상치 못한 테일 체크섬 (디스크 손상?)"
+
+#: builtin/index-pack.c:1267
+#, c-format
+msgid "pack has %d unresolved delta"
+msgid_plural "pack has %d unresolved deltas"
+msgstr[0] "묶음에 알아내지 못한 델타 %d개가 있습니다"
+
+#: builtin/index-pack.c:1291
+#, c-format
+msgid "unable to deflate appended object (%d)"
+msgstr "추가한 오브젝트를 deflate할 수 없습니다 (%d)"
+
+#: builtin/index-pack.c:1367
+#, c-format
+msgid "local object %s is corrupt"
+msgstr "%s 로컬 오브젝트가 손상되었습니다"
+
+#: builtin/index-pack.c:1391
+msgid "error while closing pack file"
+msgstr "묶음 파일을 닫는데 오류"
+
+#: builtin/index-pack.c:1404
+#, c-format
+msgid "cannot write keep file '%s'"
+msgstr "'%s' 보존 파일을 쓸 수 없습니다"
+
+#: builtin/index-pack.c:1412
+#, c-format
+msgid "cannot close written keep file '%s'"
+msgstr "쓴 '%s' 보존 파일을 닫지 못했습니다"
+
+#: builtin/index-pack.c:1425
+msgid "cannot store pack file"
+msgstr "묶음 파일을 저장할 수 없습니다"
+
+#: builtin/index-pack.c:1436
+msgid "cannot store index file"
+msgstr "인덱스 파일을 저장할 수 없습니다"
+
+#: builtin/index-pack.c:1469
+#, c-format
+msgid "bad pack.indexversion=%<PRIu32>"
+msgstr "잘못된 pack.indexversion=%<PRIu32>"
+
+#: builtin/index-pack.c:1475
+#, c-format
+msgid "invalid number of threads specified (%d)"
+msgstr "잘못된 스레드 수를 지정했습니다 (%d)"
+
+#: builtin/index-pack.c:1479 builtin/index-pack.c:1663
+#, c-format
+msgid "no threads support, ignoring %s"
+msgstr "스레드 기능이 없습니다. %s 무시"
+
+#: builtin/index-pack.c:1537
+#, c-format
+msgid "Cannot open existing pack file '%s'"
+msgstr "기존 '%s' 묶음 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:1539
+#, c-format
+msgid "Cannot open existing pack idx file for '%s'"
+msgstr "'%s'에 대한 기존 묶음 idx 파일을 열 수 없습니다"
+
+#: builtin/index-pack.c:1586
+#, c-format
+msgid "non delta: %d object"
+msgid_plural "non delta: %d objects"
+msgstr[0] "델타 아님: 오브젝트 %d개"
+
+#: builtin/index-pack.c:1593
+#, c-format
+msgid "chain length = %d: %lu object"
+msgid_plural "chain length = %d: %lu objects"
+msgstr[0] "체인 길이 = %d: 오브젝트 %lu개"
+
+#: builtin/index-pack.c:1623
+msgid "Cannot come back to cwd"
+msgstr "현재 디렉터리로 돌아올 수 없습니다"
+
+#: builtin/index-pack.c:1675 builtin/index-pack.c:1678
+#: builtin/index-pack.c:1690 builtin/index-pack.c:1694
+#, c-format
+msgid "bad %s"
+msgstr "잘못된 %s"
+
+#: builtin/index-pack.c:1708
+msgid "--fix-thin cannot be used without --stdin"
+msgstr "--fix-thin 옵션은 --stdin 옵션과 같이 쓸 수 없습니다"
+
+#: builtin/index-pack.c:1712 builtin/index-pack.c:1721
+#, c-format
+msgid "packfile name '%s' does not end with '.pack'"
+msgstr "'%s' 묶음파일 이름이 '.pack'으로 끝나지 않습니다"
+
+#: builtin/index-pack.c:1729
+msgid "--verify with no packfile name given"
+msgstr "--verify 옵션에 묶음파일 이름을 지정하지 않았습니다"
+
+#: builtin/init-db.c:55
+#, c-format
+msgid "cannot stat '%s'"
+msgstr "'%s'을(를) stat()할 수 없습니다"
+
+#: builtin/init-db.c:61
+#, c-format
+msgid "cannot stat template '%s'"
+msgstr "'%s' 서식을 stat()할 수 없습니다"
+
+#: builtin/init-db.c:66
+#, c-format
+msgid "cannot opendir '%s'"
+msgstr "'%s'을(를) opendir()할 수 없습니다"
+
+#: builtin/init-db.c:77
+#, c-format
+msgid "cannot readlink '%s'"
+msgstr "'%s'을(를) readlink()할 수 없습니다"
+
+#: builtin/init-db.c:79
+#, c-format
+msgid "cannot symlink '%s' '%s'"
+msgstr "'%s'을(를) '%s'에 symlink()할 수 없습니다"
+
+#: builtin/init-db.c:85
+#, c-format
+msgid "cannot copy '%s' to '%s'"
+msgstr "'%s'을(를) '%s'에 복사할 수 없습니다"
+
+#: builtin/init-db.c:89
+#, c-format
+msgid "ignoring template %s"
+msgstr "%s 서식을 무시합니다"
+
+#: builtin/init-db.c:118
+#, c-format
+msgid "templates not found %s"
+msgstr "%s에 서식이 없습니다"
+
+#: builtin/init-db.c:131
+#, c-format
+msgid "not copying templates of a wrong format version %d from '%s'"
+msgstr "'%2$s'에서 잘못된 형식 버전 %1$d의 서식을 복사하지 않습니다"
+
+#: builtin/init-db.c:309 builtin/init-db.c:312
+#, c-format
+msgid "%s already exists"
+msgstr "%s 파일이 이미 있습니다"
+
+#: builtin/init-db.c:340
+#, c-format
+msgid "unable to handle file type %d"
+msgstr "파일 종류 %d번을 처리할 수 없습니다"
+
+#: builtin/init-db.c:343
+#, c-format
+msgid "unable to move %s to %s"
+msgstr "%s을(를) %s(으)로 옮길 수 없습니다"
+
+#. TRANSLATORS: The first '%s' is either "Reinitialized
+#. existing" or "Initialized empty", the second " shared" or
+#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:399
+#, c-format
+msgid "%s%s Git repository in %s%s\n"
+msgstr "%s%s 깃 저장소, 위치 %s%s\n"
+
+#: builtin/init-db.c:400
+msgid "Reinitialized existing"
+msgstr "다시 초기화: 기존"
+
+#: builtin/init-db.c:400
+msgid "Initialized empty"
+msgstr "초기화: 빈"
+
+#: builtin/init-db.c:401
+msgid " shared"
+msgstr " 공유"
+
+#: builtin/init-db.c:448
+msgid ""
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
+"shared[=<permissions>]] [<directory>]"
+msgstr ""
+"git init [-q | --quiet] [--bare] [--template=<서식-디렉터리>] [--shared[=<권"
+"한>]] [<디렉터리>]"
+
+#: builtin/init-db.c:471
+msgid "permissions"
+msgstr "권한"
+
+#: builtin/init-db.c:472
+msgid "specify that the git repository is to be shared amongst several users"
+msgstr "깃 저장소를 다른 사용자가 공유할 수 있게 지정"
+
+#: builtin/init-db.c:506 builtin/init-db.c:511
+#, c-format
+msgid "cannot mkdir %s"
+msgstr "%s에 대해 mkdir를 할 수 없습니다"
+
+#: builtin/init-db.c:515
+#, c-format
+msgid "cannot chdir to %s"
+msgstr "%s에 대해 chdir를 할 수 없습니다"
+
+#: builtin/init-db.c:536
+#, c-format
+msgid ""
+"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
+"dir=<directory>)"
+msgstr ""
+"%s (또는 --work-tree=<디렉터리>) 허용되지 않음. %s (또는 --git-"
+"dir=<directory>) 지정이 없으면"
+
+#: builtin/init-db.c:564
+#, c-format
+msgid "Cannot access work tree '%s'"
+msgstr "작업 폴더 '%s'에 접근할 수 없습니다"
+
+#: builtin/interpret-trailers.c:15
+msgid ""
+"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] "
+"[<file>...]"
+msgstr ""
+"git interpret-trailers [--trim-empty] [(--trailer <토큰>[(=|:)<값>])...] [<파"
+"일>...]"
+
+#: builtin/interpret-trailers.c:25
+msgid "trim empty trailers"
+msgstr "빈 트레일러를 잘라냅니다"
+
+#: builtin/interpret-trailers.c:26
+msgid "trailer"
+msgstr "트레일러"
+
+#: builtin/interpret-trailers.c:27
+msgid "trailer(s) to add"
+msgstr "추가할 트레일러"
+
+#: builtin/log.c:43
+msgid "git log [<options>] [<revision-range>] [[--] <path>...]"
+msgstr "git log [<옵션>] [<리비전-범위>] [[--] <경로>...]"
+
+#: builtin/log.c:44
+msgid "git show [<options>] <object>..."
+msgstr "git show [<옵션>] <오브젝트>..."
+
+#: builtin/log.c:83
+#, c-format
+msgid "invalid --decorate option: %s"
+msgstr "잘못된 --decorate 옵션: %s"
+
+#: builtin/log.c:131
+msgid "suppress diff output"
+msgstr "diff를 출력하지 않습니다"
+
+#: builtin/log.c:132
+msgid "show source"
+msgstr "소스를 표시합니다"
+
+#: builtin/log.c:133
+msgid "Use mail map file"
+msgstr "메일 맵 파일을 사용합니다"
+
+#: builtin/log.c:134
+msgid "decorate options"
+msgstr "꾸미기 옵션"
+
+#: builtin/log.c:137
+msgid "Process line range n,m in file, counting from 1"
+msgstr "파일에서 n,m 범위의 줄을 처리합니다 (1부터 시작)"
+
+#: builtin/log.c:233
+#, c-format
+msgid "Final output: %d %s\n"
+msgstr "최종 출력: %d %s\n"
+
+#: builtin/log.c:465
+#, c-format
+msgid "git show %s: bad file"
+msgstr "git show %s: 잘못된 파일"
+
+#: builtin/log.c:479 builtin/log.c:572
+#, c-format
+msgid "Could not read object %s"
+msgstr "%s 오브젝트를 읽을 수 없습니다"
+
+#: builtin/log.c:596
+#, c-format
+msgid "Unknown type: %d"
+msgstr "알 수 없는 종류: %d"
+
+#: builtin/log.c:714
+msgid "format.headers without value"
+msgstr "format.headers 설정에 값이 없음"
+
+#: builtin/log.c:798
+msgid "name of output directory is too long"
+msgstr "출력 디렉터리의 이름이 너무 깁니다"
+
+#: builtin/log.c:813
+#, c-format
+msgid "Cannot open patch file %s"
+msgstr "%s 패치 파일을 열 수 없습니다"
+
+#: builtin/log.c:827
+msgid "Need exactly one range."
+msgstr "정확히 하나의 범위가 필요합니다."
+
+#: builtin/log.c:837
+msgid "Not a range."
+msgstr "범위가 아닙니다."
+
+#: builtin/log.c:943
+msgid "Cover letter needs email format"
+msgstr "커버레터는 전자메일 형식이어야 합니다"
+
+#: builtin/log.c:1022
+#, c-format
+msgid "insane in-reply-to: %s"
+msgstr "정신나간 in-reply-to 헤더: %s"
+
+#: builtin/log.c:1050
+msgid "git format-patch [<options>] [<since> | <revision-range>]"
+msgstr "git format-patch [<옵션>] [<시작시각> | <리비전-범위>]"
+
+#: builtin/log.c:1095
+msgid "Two output directories?"
+msgstr "출력 디렉터리가 두개?"
+
+#: builtin/log.c:1211
+msgid "use [PATCH n/m] even with a single patch"
+msgstr "하나의 패치에 대해서도 [PATCh n/m]을 붙입니다"
+
+#: builtin/log.c:1214
+msgid "use [PATCH] even with multiple patches"
+msgstr "여러 개 패치에 대해서도 [PATCH]를 붙입니다"
+
+#: builtin/log.c:1218
+msgid "print patches to standard out"
+msgstr "패치를 표준 출력으로 표시합니다"
+
+#: builtin/log.c:1220
+msgid "generate a cover letter"
+msgstr "커버레터를 만듭니다"
+
+#: builtin/log.c:1222
+msgid "use simple number sequence for output file names"
+msgstr "출력 파일 이름에 간단한 일련 번호를 사용합니다"
+
+#: builtin/log.c:1223
+msgid "sfx"
+msgstr "확장자"
+
+#: builtin/log.c:1224
+msgid "use <sfx> instead of '.patch'"
+msgstr "'.patch' 대신 <확장자>를 사용합니다"
+
+#: builtin/log.c:1226
+msgid "start numbering patches at <n> instead of 1"
+msgstr "패치 번호를 1 대신 <n>에서 시작합니다"
+
+#: builtin/log.c:1228
+msgid "mark the series as Nth re-roll"
+msgstr "시리즈를 N번째 re-roll로 표시합니다"
+
+#: builtin/log.c:1230
+msgid "Use [<prefix>] instead of [PATCH]"
+msgstr "[PATCH] 대신 [<접두어>]를 사용합니다"
+
+#: builtin/log.c:1233
+msgid "store resulting files in <dir>"
+msgstr "결과 파일을 <디렉터리>에 저장합니다"
+
+#: builtin/log.c:1236
+msgid "don't strip/add [PATCH]"
+msgstr "[PATCH]를 자르거나 추가하지 않습니다"
+
+#: builtin/log.c:1239
+msgid "don't output binary diffs"
+msgstr "바이너리 diff를 만들지 않습니다"
+
+#: builtin/log.c:1241
+msgid "output all-zero hash in From header"
+msgstr "From 헤더에서 모두 0인 해시를 출력합니다"
+
+#: builtin/log.c:1243
+msgid "don't include a patch matching a commit upstream"
+msgstr "업스트림에 있는 패치를 포함하지 않습니다"
+
+#: builtin/log.c:1245
+msgid "show patch format instead of default (patch + stat)"
+msgstr "기본값 (패치 + 통계) 대신 패치 형식을 표시합니다"
+
+#: builtin/log.c:1247
+msgid "Messaging"
+msgstr "메시징"
+
+#: builtin/log.c:1248
+msgid "header"
+msgstr "헤더"
+
+#: builtin/log.c:1249
+msgid "add email header"
+msgstr "전자메일 헤더"
+
+#: builtin/log.c:1250 builtin/log.c:1252
+msgid "email"
+msgstr "전자메일"
+
+#: builtin/log.c:1250
+msgid "add To: header"
+msgstr "To: 헤더를 추가합니다"
+
+#: builtin/log.c:1252
+msgid "add Cc: header"
+msgstr "Cc: 헤더를 추가합니다"
+
+#: builtin/log.c:1254
+msgid "ident"
+msgstr "신원"
+
+#: builtin/log.c:1255
+msgid "set From address to <ident> (or committer ident if absent)"
+msgstr "<신원>에서 From 주소를 설정합니다 (없으면 커미터 주소 신원 사용)"
+
+#: builtin/log.c:1257
+msgid "message-id"
+msgstr "메시지-ID"
+
+#: builtin/log.c:1258
+msgid "make first mail a reply to <message-id>"
+msgstr "첫 메일을 <메시지-ID>에 대한 답장 메일로 만듭니다"
+
+#: builtin/log.c:1259 builtin/log.c:1262
+msgid "boundary"
+msgstr "경계"
+
+#: builtin/log.c:1260
+msgid "attach the patch"
+msgstr "패치를 첨부합니다"
+
+#: builtin/log.c:1263
+msgid "inline the patch"
+msgstr "패치를 본문에 포함합니다"
+
+#: builtin/log.c:1267
+msgid "enable message threading, styles: shallow, deep"
+msgstr "메시지에 스레드를 사용, 스타일: shallow, deep"
+
+#: builtin/log.c:1269
+msgid "signature"
+msgstr "서명"
+
+#: builtin/log.c:1270
+msgid "add a signature"
+msgstr "서명을 추가합니다"
+
+#: builtin/log.c:1272
+msgid "add a signature from a file"
+msgstr "파일에서 서명을 추가합니다"
+
+#: builtin/log.c:1273
+msgid "don't print the patch filenames"
+msgstr "패치 파일 이름을 표시하지 않습니다"
+
+#: builtin/log.c:1362
+msgid "-n and -k are mutually exclusive."
+msgstr "-n 및 -k 옵션은 하나만 써야 합니다."
+
+#: builtin/log.c:1364
+msgid "--subject-prefix and -k are mutually exclusive."
+msgstr "--subject-prefix 및 -k 옵션은 하나만 써야 합니다."
+
+#: builtin/log.c:1372
+msgid "--name-only does not make sense"
+msgstr "--name-only 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1374
+msgid "--name-status does not make sense"
+msgstr "--name-status 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1376
+msgid "--check does not make sense"
+msgstr "--check 옵션은 앞뒤가 맞지 않습니다"
+
+#: builtin/log.c:1401
+msgid "standard output, or directory, which one?"
+msgstr "표준 출력이나 디렉터리 중에 하나만 지정해야 합니다."
+
+#: builtin/log.c:1403
+#, c-format
+msgid "Could not create directory '%s'"
+msgstr "'%s' 디렉터리를 만들 수 없습니다"
+
+#: builtin/log.c:1500
+#, c-format
+msgid "unable to read signature file '%s'"
+msgstr "'%s' 서명 파일을 읽을 수 없습니다"
+
+#: builtin/log.c:1563
+msgid "Failed to create output files"
+msgstr "출력 파일을 만드는데 실패했습니다"
+
+#: builtin/log.c:1611
+msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
+msgstr "git cherry [-v] [<업스트림> [<헤드> [<한계값>]]]"
+
+#: builtin/log.c:1665
+#, c-format
+msgid ""
+"Could not find a tracked remote branch, please specify <upstream> manually.\n"
+msgstr "추적되는 리모트 브랜치를 찾을 수 없습니다. <업스트림>을 수동으로 지정하십시오.\n"
+
+#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690
+#, c-format
+msgid "Unknown commit %s"
+msgstr "알 수 없는 커밋 %s"
+
+#: builtin/ls-files.c:358
+msgid "git ls-files [<options>] [<file>...]"
+msgstr "git ls-files [<옵션>] [<파일>...]"
+
+#: builtin/ls-files.c:415
+msgid "identify the file status with tags"
+msgstr "파일 상태를 태그와 같이 표시합니다"
+
+#: builtin/ls-files.c:417
+msgid "use lowercase letters for 'assume unchanged' files"
+msgstr "'변경되지 않았다고 가정' 파일에 소문자를 사용합니다"
+
+#: builtin/ls-files.c:419
+msgid "show cached files in the output (default)"
+msgstr "출력에 캐시된 파일을 표시합니다 (기본값)"
+
+#: builtin/ls-files.c:421
+msgid "show deleted files in the output"
+msgstr "출력에 삭제된 파일을 표시합니다"
+
+#: builtin/ls-files.c:423
+msgid "show modified files in the output"
+msgstr "출력에 수정된 파일을 표시합니다"
+
+#: builtin/ls-files.c:425
+msgid "show other files in the output"
+msgstr "출력에 기타 파일을 표시합니다"
+
+#: builtin/ls-files.c:427
+msgid "show ignored files in the output"
+msgstr "출력에 무시된 파일을 표시합니다"
+
+#: builtin/ls-files.c:430
+msgid "show staged contents' object name in the output"
+msgstr "출력에 커밋 표시된 내용의 오브젝트 이름을 표시합니다"
+
+#: builtin/ls-files.c:432
+msgid "show files on the filesystem that need to be removed"
+msgstr "파일 시스템에서 제거해야 하는 파일을 표시합니다"
+
+#: builtin/ls-files.c:434
+msgid "show 'other' directories' names only"
+msgstr "기타 디렉터리의 이름만 표시합니다"
+
+#: builtin/ls-files.c:437
+msgid "don't show empty directories"
+msgstr "빈 디렉터리 표시하지 않기"
+
+#: builtin/ls-files.c:440
+msgid "show unmerged files in the output"
+msgstr "출력에 병합하지 않은 파일을 표시합니다"
+
+#: builtin/ls-files.c:442
+msgid "show resolve-undo information"
+msgstr "resolve-undo 정보를 표시합니다"
+
+#: builtin/ls-files.c:444
+msgid "skip files matching pattern"
+msgstr "패턴에 일치하는 파일을 건너뜁니다"
+
+#: builtin/ls-files.c:447
+msgid "exclude patterns are read from <file>"
+msgstr "제외할 패턴을 <파일>에서 읽습니다"
+
+#: builtin/ls-files.c:450
+msgid "read additional per-directory exclude patterns in <file>"
+msgstr "<파일>에서 추가적인 디렉토리별 제외 패턴을 읽습니다"
+
+#: builtin/ls-files.c:452
+msgid "add the standard git exclusions"
+msgstr "표준 깃 제외 패턴을 추가합니다"
+
+#: builtin/ls-files.c:455
+msgid "make the output relative to the project top directory"
+msgstr "최상위 디렉토리 상대 경로로 출력합니다"
+
+#: builtin/ls-files.c:458
+msgid "if any <file> is not in the index, treat this as an error"
+msgstr "<파일>이 인덱스 안에 없으면 오류로 취급합니다"
+
+#: builtin/ls-files.c:459
+msgid "tree-ish"
+msgstr "트리-따위"
+
+#: builtin/ls-files.c:460
+msgid "pretend that paths removed since <tree-ish> are still present"
+msgstr "<트리-따위> 뒤로 제거한 경로가 있다고 가정합니다"
+
+#: builtin/ls-files.c:462
+msgid "show debugging data"
+msgstr "디버깅 데이터를 표시합니다"
+
+#: builtin/ls-tree.c:28
+msgid "git ls-tree [<options>] <tree-ish> [<path>...]"
+msgstr "git ls-tree [<옵션>] <트리-따위> [<경로>...]"
+
+#: builtin/ls-tree.c:128
+msgid "only show trees"
+msgstr "트리만 표시"
+
+#: builtin/ls-tree.c:130
+msgid "recurse into subtrees"
+msgstr "하위 트리로 재귀적으로 적용"
+
+#: builtin/ls-tree.c:132
+msgid "show trees when recursing"
+msgstr "재귀적으로 적용할 때 트리 표시"
+
+#: builtin/ls-tree.c:135
+msgid "terminate entries with NUL byte"
+msgstr "항목을 NUL 바이트로 끝냅니다"
+
+#: builtin/ls-tree.c:136
+msgid "include object size"
+msgstr "오브젝트 크기 포함"
+
+#: builtin/ls-tree.c:138 builtin/ls-tree.c:140
+msgid "list only filenames"
+msgstr "파일 이름만 목록 표시"
+
+#: builtin/ls-tree.c:143
+msgid "use full path names"
+msgstr "전체 경로 이름 사용"
+
+#: builtin/ls-tree.c:145
+msgid "list entire tree; not just current directory (implies --full-name)"
+msgstr "전체 트리 목록 표시, 현재 디렉터리만 아니라 (--full-name 옵션 포함)"
+
+#: builtin/merge.c:45
+msgid "git merge [<options>] [<commit>...]"
+msgstr "git merge [<옵션>] [<커밋>...]"
+
+#: builtin/merge.c:46
+msgid "git merge [<options>] <msg> HEAD <commit>"
+msgstr "git merge [<옵션>] <메시지> HEAD <커밋>"
+
+#: builtin/merge.c:47
+msgid "git merge --abort"
+msgstr "git merge --abort"
+
+#: builtin/merge.c:100
+msgid "switch `m' requires a value"
+msgstr "`m' 옵션에는 값이 필요합니다"
+
+#: builtin/merge.c:137
+#, c-format
+msgid "Could not find merge strategy '%s'.\n"
+msgstr "'%s' 병합 전략을 찾을 수 없습니다.\n"
+
+#: builtin/merge.c:138
+#, c-format
+msgid "Available strategies are:"
+msgstr "사용 가능한 전략은:"
+
+#: builtin/merge.c:143
+#, c-format
+msgid "Available custom strategies are:"
+msgstr "사용 가능한 사용자 설정 전략은:"
+
+#: builtin/merge.c:193 builtin/pull.c:119
+msgid "do not show a diffstat at the end of the merge"
+msgstr "병합이 끝날 때 diffstat을 표시하지 않습니다"
+
+#: builtin/merge.c:196 builtin/pull.c:122
+msgid "show a diffstat at the end of the merge"
+msgstr "병합이 끝날 때 diffstat을 표시합니다"
+
+#: builtin/merge.c:197 builtin/pull.c:125
+msgid "(synonym to --stat)"
+msgstr "(--stat 옵션과 동일)"
+
+#: builtin/merge.c:199 builtin/pull.c:128
+msgid "add (at most <n>) entries from shortlog to merge commit message"
+msgstr "병합 커밋의 메시지에 shortlog 항목을 (최대 <n>개) 추가합니다"
+
+#: builtin/merge.c:202 builtin/pull.c:131
+msgid "create a single commit instead of doing a merge"
+msgstr "병합하는 대신 하나의 커밋을 만듭니다"
+
+#: builtin/merge.c:204 builtin/pull.c:134
+msgid "perform a commit if the merge succeeds (default)"
+msgstr "병합이 성공하면 커밋을 합니다 (기본값)"
+
+#: builtin/merge.c:206 builtin/pull.c:137
+msgid "edit message before committing"
+msgstr "커밋 전에 메시지를 편집합니다"
+
+#: builtin/merge.c:207
+msgid "allow fast-forward (default)"
+msgstr "정방향 진행을 허용합니다 (기본값)"
+
+#: builtin/merge.c:209 builtin/pull.c:143
+msgid "abort if fast-forward is not possible"
+msgstr "정방향 진행이 불가능하면 중지합니다"
+
+#: builtin/merge.c:213
+msgid "Verify that the named commit has a valid GPG signature"
+msgstr "이름 붙인 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+
+#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148
+#: builtin/revert.c:89
+msgid "strategy"
+msgstr "전략"
+
+#: builtin/merge.c:215 builtin/pull.c:149
+msgid "merge strategy to use"
+msgstr "사용할 병합 전략"
+
+#: builtin/merge.c:216 builtin/pull.c:152
+msgid "option=value"
+msgstr "옵션=값"
+
+#: builtin/merge.c:217 builtin/pull.c:153
+msgid "option for selected merge strategy"
+msgstr "선택한 병합 전략에 대한 옵션"
+
+#: builtin/merge.c:219
+msgid "merge commit message (for a non-fast-forward merge)"
+msgstr "병합 커밋 메시지 (정방향이 아닌 병합에 대해)"
+
+#: builtin/merge.c:223
+msgid "abort the current in-progress merge"
+msgstr "현재 진행 중인 병합을 중지합니다"
+
+#: builtin/merge.c:251
+msgid "could not run stash."
+msgstr "stash를 실행할 수 없습니다."
+
+#: builtin/merge.c:256
+msgid "stash failed"
+msgstr "stash 실패"
+
+#: builtin/merge.c:261
+#, c-format
+msgid "not a valid object: %s"
+msgstr "올바른 오브젝트가 아닙니다: %s"
+
+#: builtin/merge.c:280 builtin/merge.c:297
+msgid "read-tree failed"
+msgstr "read-tree 실패"
+
+#: builtin/merge.c:327
+msgid " (nothing to squash)"
+msgstr " (합칠 내용이 없습니다)"
+
+#: builtin/merge.c:340
+#, c-format
+msgid "Squash commit -- not updating HEAD\n"
+msgstr "커밋 합치기 -- HEAD를 업데이트하지 않습니다\n"
+
+#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975
+#: builtin/merge.c:988
+#, c-format
+msgid "Could not write to '%s'"
+msgstr "'%s'에 쓸 수 없습니다"
+
+#: builtin/merge.c:372
+msgid "Writing SQUASH_MSG"
+msgstr "SQUASH_MSG를 쓰는 중"
+
+#: builtin/merge.c:374
+msgid "Finishing SQUASH_MSG"
+msgstr "SQUASH_MSG를 마치는 중"
+
+#: builtin/merge.c:397
+#, c-format
+msgid "No merge message -- not updating HEAD\n"
+msgstr "병합 메시지가 없습니다 -- HEAD를 업데이트하지 않습니다\n"
+
+#: builtin/merge.c:447
+#, c-format
+msgid "'%s' does not point to a commit"
+msgstr "'%s'이(가) 커밋을 가리키지 않습니다"
+
+#: builtin/merge.c:537
+#, c-format
+msgid "Bad branch.%s.mergeoptions string: %s"
+msgstr "잘못된 branch.%s.mergeoptions 문자열: %s"
+
+#: builtin/merge.c:656
+msgid "Not handling anything other than two heads merge."
+msgstr "두 개의 헤드 병합 외에는 처리하지 않습니다."
+
+#: builtin/merge.c:670
+#, c-format
+msgid "Unknown option for merge-recursive: -X%s"
+msgstr "merge-recursive에 대해 알 수 없는 옵션: -X%s"
+
+#: builtin/merge.c:683
+#, c-format
+msgid "unable to write %s"
+msgstr "%s에 쓸 수 없습니다"
+
+#: builtin/merge.c:772
+#, c-format
+msgid "Could not read from '%s'"
+msgstr "'%s'에서 읽을 수 없습니다"
+
+#: builtin/merge.c:781
+#, c-format
+msgid "Not committing merge; use 'git commit' to complete the merge.\n"
+msgstr "병합을 커밋하지 않습니다. 병합을 마치려면 'git commit'을 사용하십시오.\n"
+
+#: builtin/merge.c:787
+#, c-format
+msgid ""
+"Please enter a commit message to explain why this merge is necessary,\n"
+"especially if it merges an updated upstream into a topic branch.\n"
+"\n"
+"Lines starting with '%c' will be ignored, and an empty message aborts\n"
+"the commit.\n"
+msgstr ""
+"왜 이 병합이 필요한지를 설명하는 커밋 메시지를 입력하십시오. 특히\n"
+"업스트림 업데이트를 어떤 목적용 브랜치로 병합할 때는 반드시 그렇게\n"
+"하십시오.\n"
+"\n"
+"'%c' 문자로 시작하는 줄은 무시되고, 메시지가 비어 있으면 커밋을\n"
+"중지합니다.\n"
+
+#: builtin/merge.c:811
+msgid "Empty commit message."
+msgstr "빈 커밋 메시지."
+
+#: builtin/merge.c:823
+#, c-format
+msgid "Wonderful.\n"
+msgstr "훌륭합니다.\n"
+
+#: builtin/merge.c:878
+#, c-format
+msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
+msgstr "자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.\n"
+
+#: builtin/merge.c:894
+#, c-format
+msgid "'%s' is not a commit"
+msgstr "'%s'은(는) 커밋이 아닙니다"
+
+#: builtin/merge.c:935
+msgid "No current branch."
+msgstr "현재 브랜치가 없습니다."
+
+#: builtin/merge.c:937
+msgid "No remote for the current branch."
+msgstr "현재 브랜치에 대한 리모트가 없습니다."
+
+#: builtin/merge.c:939
+msgid "No default upstream defined for the current branch."
+msgstr "현재 브랜치에 대해 기본 업스트림을 지정하지 않았습니다."
+
+#: builtin/merge.c:944
+#, c-format
+msgid "No remote-tracking branch for %s from %s"
+msgstr "리모트 %2$s에서 %1$s에 대한 리모트 추적 브랜치가 없습니다"
+
+#: builtin/merge.c:1079
+#, c-format
+msgid "could not close '%s'"
+msgstr "'%s'을(를) 닫을 수 없습니다"
+
+#: builtin/merge.c:1206
+msgid "There is no merge to abort (MERGE_HEAD missing)."
+msgstr "중지할 병합 작업이 없습니다. (MERGE_HEAD가 없음)"
+
+#: builtin/merge.c:1222
+msgid ""
+"You have not concluded your merge (MERGE_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"병합을 마치지 않았습니다. (MERGE_HEAD 있음)\n"
+"병합하기 전에 변경 사항을 커밋하십시오."
+
+#: builtin/merge.c:1229
+msgid ""
+"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
+"Please, commit your changes before you merge."
+msgstr ""
+"커밋 빼오기를 마치지 않았습니다. (COMMIT_PICK_HEAD 있음)\n"
+"병합하기 전에 변경 사항을 커밋하십시오."
+
+#: builtin/merge.c:1232
+msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
+msgstr "커밋 빼오기를 마치지 않았습니다. (CHERRY_PICK_HEAD 있음)"
+
+#: builtin/merge.c:1241
+msgid "You cannot combine --squash with --no-ff."
+msgstr "--squash 옵션을 --no-ff 옵션과 같이 쓸 수 없습니다."
+
+#: builtin/merge.c:1249
+msgid "No commit specified and merge.defaultToUpstream not set."
+msgstr "커밋을 지정하지 않았고  merge.defaultToUpstream를 설정하지 않았습니다."
+
+#: builtin/merge.c:1266
+msgid "Squash commit into empty head not supported yet"
+msgstr "빈 헤드로 커밋을 합치기는 지원하지 않습니다"
+
+#: builtin/merge.c:1268
+msgid "Non-fast-forward commit does not make sense into an empty head"
+msgstr "정방향이 아닌 커밋은 빈 헤드에서는 앞뒤가 맞지 않습니다"
+
+#: builtin/merge.c:1274
+#, c-format
+msgid "%s - not something we can merge"
+msgstr "%s - 병합할 수 있는 항목이 아닙니다"
+
+#: builtin/merge.c:1276
+msgid "Can merge only exactly one commit into empty head"
+msgstr "빈 헤드에는 정확히 하나의 커밋만 병합할 수 있습니다"
+
+#: builtin/merge.c:1331
+#, c-format
+msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
+msgstr "%s 커밋에 신뢰하지 않는 (서명자가 %s라고 하는) GPG 서명이 있습니다."
+
+#: builtin/merge.c:1334
+#, c-format
+msgid "Commit %s has a bad GPG signature allegedly by %s."
+msgstr "%s 커밋에 잘못된 (서명자가 %s라고 하는) GPG 서명이 있습니다."
+
+#: builtin/merge.c:1337
+#, c-format
+msgid "Commit %s does not have a GPG signature."
+msgstr "%s 커밋에 GPG 서명이 없습니다."
+
+#: builtin/merge.c:1340
+#, c-format
+msgid "Commit %s has a good GPG signature by %s\n"
+msgstr "%s 커밋에 %s의 올바른 GPG 서명이 없습니다\n"
+
+#: builtin/merge.c:1423
+#, c-format
+msgid "Updating %s..%s\n"
+msgstr "업데이트 중 %s..%s\n"
+
+#: builtin/merge.c:1460
+#, c-format
+msgid "Trying really trivial in-index merge...\n"
+msgstr "아주 간단한 인덱스 내부 병합을 시도합니다...\n"
+
+#: builtin/merge.c:1467
+#, c-format
+msgid "Nope.\n"
+msgstr "아님.\n"
+
+#: builtin/merge.c:1499
+msgid "Not possible to fast-forward, aborting."
+msgstr "정방향이 불가능하므로, 중지합니다."
+
+#: builtin/merge.c:1522 builtin/merge.c:1601
+#, c-format
+msgid "Rewinding the tree to pristine...\n"
+msgstr "트리를 본래 위치로 되돌립니다...\n"
+
+#: builtin/merge.c:1526
+#, c-format
+msgid "Trying merge strategy %s...\n"
+msgstr "병합 전략 %s 시도...\n"
+
+#: builtin/merge.c:1592
+#, c-format
+msgid "No merge strategy handled the merge.\n"
+msgstr "병합을 처리한 전략이 없습니다.\n"
+
+#: builtin/merge.c:1594
+#, c-format
+msgid "Merge with strategy %s failed.\n"
+msgstr "전략 %s(으)로 병합이 실패했습니다.\n"
+
+#: builtin/merge.c:1603
+#, c-format
+msgid "Using the %s to prepare resolving by hand.\n"
+msgstr "수동 해결의 준비를 위해 %s 전략을 사용합니다.\n"
+
+#: builtin/merge.c:1615
+#, c-format
+msgid "Automatic merge went well; stopped before committing as requested\n"
+msgstr "자동 병합이 잘 진행되었습니다. 요청한대로 커밋 전에 중지합니다\n"
+
+#: builtin/merge-base.c:29
+msgid "git merge-base [-a | --all] <commit> <commit>..."
+msgstr "git merge-base [-a | --all] <커밋> <커밋>..."
+
+#: builtin/merge-base.c:30
+msgid "git merge-base [-a | --all] --octopus <commit>..."
+msgstr "git merge-base [-a | --all] --octopus <커밋>..."
+
+#: builtin/merge-base.c:31
+msgid "git merge-base --independent <commit>..."
+msgstr "git merge-base --independent <커밋>..."
+
+#: builtin/merge-base.c:32
+msgid "git merge-base --is-ancestor <commit> <commit>"
+msgstr "git merge-base --is-ancestor <커밋> <커밋>"
+
+#: builtin/merge-base.c:33
+msgid "git merge-base --fork-point <ref> [<commit>]"
+msgstr "git merge-base --fork-point <레퍼런스> [<커밋>]"
+
+#: builtin/merge-base.c:214
+msgid "output all common ancestors"
+msgstr "모든 과거 공통 커밋을 출력합니다"
+
+#: builtin/merge-base.c:216
+msgid "find ancestors for a single n-way merge"
+msgstr "하나의 n-방향 병합에 대한 과거 커밋을 찾습니다"
+
+#: builtin/merge-base.c:218
+msgid "list revs not reachable from others"
+msgstr "다른 곳에서 접근 불가능한 리비전 목록을 출력합니다"
+
+#: builtin/merge-base.c:220
+msgid "is the first one ancestor of the other?"
+msgstr "첫번째가 다른 것의 과거 커밋인지 여부?"
+
+#: builtin/merge-base.c:222
+msgid "find where <commit> forked from reflog of <ref>"
+msgstr "<레퍼런스>의 reflog에서 <커밋>이 분리된 위치를 찾습니다"
+
+#: builtin/merge-file.c:8
+msgid ""
+"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> "
+"<orig-file> <file2>"
+msgstr "git merge-file [<옵션>] [-L <이름1> [-L <orig> [-L <이름2>]]] <파일1> <본래-파일> <파일2>"
+
+#: builtin/merge-file.c:33
+msgid "send results to standard output"
+msgstr "결과를 표준 출력으로 보냅니다"
+
+#: builtin/merge-file.c:34
+msgid "use a diff3 based merge"
+msgstr "diff3 기반 병합을 사용합니다"
+
+#: builtin/merge-file.c:35
+msgid "for conflicts, use our version"
+msgstr "충돌이 발생하면, 우리쪽 버전을 사용합니다"
+
+#: builtin/merge-file.c:37
+msgid "for conflicts, use their version"
+msgstr "충돌이 발생하면, 상대편 버전을 사용합니다"
+
+#: builtin/merge-file.c:39
+msgid "for conflicts, use a union version"
+msgstr "충돌이 발생하면, 합친 버전을 사용합니다"
+
+#: builtin/merge-file.c:42
+msgid "for conflicts, use this marker size"
+msgstr "충돌이 발생하면, 이 크기로 표시합니다"
+
+#: builtin/merge-file.c:43
+msgid "do not warn about conflicts"
+msgstr "충돌에 대해 경고하지 않습니다"
+
+#: builtin/merge-file.c:45
+msgid "set labels for file1/orig-file/file2"
+msgstr "<파일1>/<본래-파일>/<파일2>에 대한 레이블을 설정합니다"
+
+#: builtin/mktree.c:64
+msgid "git mktree [-z] [--missing] [--batch]"
+msgstr "git mktree [-z] [--missing] [--batch]"
+
+#: builtin/mktree.c:150
+msgid "input is NUL terminated"
+msgstr "입력이 NUL로 끝납니다"
+
+#: builtin/mktree.c:151 builtin/write-tree.c:24
+msgid "allow missing objects"
+msgstr "없는 오브젝트를 허용합니다"
+
+#: builtin/mktree.c:152
+msgid "allow creation of more than one tree"
+msgstr "여러개 트리 만들기를 허용합니다"
+
+#: builtin/mv.c:15
+msgid "git mv [<options>] <source>... <destination>"
+msgstr "git mv [<옵션>] <원본>... <대상>"
+
+#: builtin/mv.c:69
+#, c-format
+msgid "Directory %s is in index and no submodule?"
+msgstr "%s 디렉터리가 인덱스에 있고 하위 모듈이 없습니다?"
+
+#: builtin/mv.c:71
+msgid "Please stage your changes to .gitmodules or stash them to proceed"
+msgstr "계속하려면 .gitmodules의 변경 사항을 스테이지에 넣거나 stash 하십시오"
+
+#: builtin/mv.c:89
+#, c-format
+msgid "%.*s is in index"
+msgstr "%.*s이(가) 인덱스에 있습니다"
+
+#: builtin/mv.c:111
+msgid "force move/rename even if target exists"
+msgstr "대상이 이미 있어도 강제로 옮기기/이름 바꾸기를 합니다"
+
+#: builtin/mv.c:112
+msgid "skip move/rename errors"
+msgstr "옮기기/이름 바꾸기 오류를 건너 뜁니다"
+
+#: builtin/mv.c:151
+#, c-format
+msgid "destination '%s' is not a directory"
+msgstr "대상이 ('%s') 디렉터리가 아닙니다"
+
+#: builtin/mv.c:162
+#, c-format
+msgid "Checking rename of '%s' to '%s'\n"
+msgstr "'%s'을(를) '%s'(으)로 이름 바꾸기합니다\n"
+
+#: builtin/mv.c:166
+msgid "bad source"
+msgstr "잘못된 원본"
+
+#: builtin/mv.c:169
+msgid "can not move directory into itself"
+msgstr "디렉터리를 자기 자신으로 옮길 수 없습니다"
+
+#: builtin/mv.c:172
+msgid "cannot move directory over file"
+msgstr "디렉터리를 파일로 옮길 수 없습니다"
+
+#: builtin/mv.c:181
+msgid "source directory is empty"
+msgstr "원본 디렉터리가 비어 있습니다"
+
+#: builtin/mv.c:206
+msgid "not under version control"
+msgstr "버전 컨트롤 중이 아닙니다"
+
+#: builtin/mv.c:209
+msgid "destination exists"
+msgstr "대상이 있습니다"
+
+#: builtin/mv.c:217
+#, c-format
+msgid "overwriting '%s'"
+msgstr "'%s' 덮어쓰기"
+
+#: builtin/mv.c:220
+msgid "Cannot overwrite"
+msgstr "덮어쓸 수 없습니다"
+
+#: builtin/mv.c:223
+msgid "multiple sources for the same target"
+msgstr "동일한 대상에 대해 여러 개 원본"
+
+#: builtin/mv.c:225
+msgid "destination directory does not exist"
+msgstr "대상 디렉터리가 없습니다"
+
+#: builtin/mv.c:232
+#, c-format
+msgid "%s, source=%s, destination=%s"
+msgstr "%s, 원본=%s, 대상=%s"
+
+#: builtin/mv.c:253
+#, c-format
+msgid "Renaming %s to %s\n"
+msgstr "이름 바꾸기, '%s'에서 '%s'(으)로\n"
+
+#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365
+#, c-format
+msgid "renaming '%s' failed"
+msgstr "'%s'의 이름 바꾸기가 실패했습니다"
+
+#: builtin/name-rev.c:251
+msgid "git name-rev [<options>] <commit>..."
+msgstr "git name-rev [<옵션>] <커밋>..."
+
+#: builtin/name-rev.c:252
+msgid "git name-rev [<options>] --all"
+msgstr "git name-rev [<옵션>] --all"
+
+#: builtin/name-rev.c:253
+msgid "git name-rev [<options>] --stdin"
+msgstr "git name-rev [<옵션>] --stdin"
+
+#: builtin/name-rev.c:305
+msgid "print only names (no SHA-1)"
+msgstr "이름만 표시 (SHA-1 없이)"
+
+#: builtin/name-rev.c:306
+msgid "only use tags to name the commits"
+msgstr "커밋을 지정할 때 태그만 사용합니다"
+
+#: builtin/name-rev.c:308
+msgid "only use refs matching <pattern>"
+msgstr "<패턴>과 일치하는 레퍼런스만 사용합니다"
+
+#: builtin/name-rev.c:310
+msgid "list all commits reachable from all refs"
+msgstr "모든 레퍼런스에서 접근 가능한 모든 커밋 목록을 표시합니다"
+
+#: builtin/name-rev.c:311
+msgid "read from stdin"
+msgstr "표준입력에서 읽습니다"
+
+#: builtin/name-rev.c:312
+msgid "allow to print `undefined` names (default)"
+msgstr "`정의되지 않은' 이름 표시를 허용합니다 (기본값)"
+
+#: builtin/name-rev.c:318
+msgid "dereference tags in the input (internal use)"
+msgstr "입력의 태그 레퍼런스를 따라갑니다 (내부 사용)"
+
+#: builtin/notes.c:25
+msgid "git notes [--ref <notes-ref>] [list [<object>]]"
+msgstr "git notes [--ref <노트-레퍼런스>] [list [<오브젝트>]]"
+
+#: builtin/notes.c:26
+msgid ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> "
+"| (-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <메시지> | -F <파"
+"일> | (-c | -C) <오브젝트>] [<오브젝트>]"
+
+#: builtin/notes.c:27
+msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"
+msgstr "git notes [--ref <노트-레퍼런스>] copy [-f] <원본-오브젝트> <대상-오브젝트>"
+
+#: builtin/notes.c:28
+msgid ""
+"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | "
+"(-c | -C) <object>] [<object>]"
+msgstr ""
+"git notes [--ref <쪽지-레퍼런스>] append [--allow-empty] [-m <메시지> | -F <"
+"파일> | (-c | -C) <오브젝트>] [<오브젝트>]"
+
+#: builtin/notes.c:29
+msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"
+msgstr "git notes [--ref <쪽지-레퍼런스>] edit [--allow-empty] [<오브젝트>]"
+
+#: builtin/notes.c:30
+msgid "git notes [--ref <notes-ref>] show [<object>]"
+msgstr "git notes [--ref <notes-ref>] show [<오브젝트>]"
+
+#: builtin/notes.c:31
+msgid ""
+"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"
+msgstr "git notes [--ref <노트-레퍼런스>] merge [-v | -q] [-s <전략>] <노트-레퍼런스>"
+
+#: builtin/notes.c:32
+msgid "git notes merge --commit [-v | -q]"
+msgstr "git notes merge --commit [-v | -q]"
+
+#: builtin/notes.c:33
+msgid "git notes merge --abort [-v | -q]"
+msgstr "git notes merge --abort [-v | -q]"
+
+#: builtin/notes.c:34
+msgid "git notes [--ref <notes-ref>] remove [<object>...]"
+msgstr "git notes [--ref <노트-레퍼런스>] remove [<오브젝트>...]"
+
+#: builtin/notes.c:35
+msgid "git notes [--ref <notes-ref>] prune [-n | -v]"
+msgstr "git notes [--ref <노트-레퍼런스>] prune [-n | -v]"
+
+#: builtin/notes.c:36
+msgid "git notes [--ref <notes-ref>] get-ref"
+msgstr "git notes [--ref <노트-레퍼런스>] get-ref"
+
+#: builtin/notes.c:41
+msgid "git notes [list [<object>]]"
+msgstr "git notes [list [<오브젝트>]]"
+
+#: builtin/notes.c:46
+msgid "git notes add [<options>] [<object>]"
+msgstr "git notes add [<옵션>] [<오브젝트>]"
+
+#: builtin/notes.c:51
+msgid "git notes copy [<options>] <from-object> <to-object>"
+msgstr "git notes copy [<옵션>] <원본-오브젝트> <대상-오브젝트>"
+
+#: builtin/notes.c:52
+msgid "git notes copy --stdin [<from-object> <to-object>]..."
+msgstr "git notes copy --stdin [<원본-오브젝트> <대상-오브젝트>]..."
+
+#: builtin/notes.c:57
+msgid "git notes append [<options>] [<object>]"
+msgstr "git notes append [<옵션>] [<오브젝트>]"
+
+#: builtin/notes.c:62
+msgid "git notes edit [<object>]"
+msgstr "git notes edit [<오브젝트>]"
+
+#: builtin/notes.c:67
+msgid "git notes show [<object>]"
+msgstr "git notes show [<오브젝트>]"
+
+#: builtin/notes.c:72
+msgid "git notes merge [<options>] <notes-ref>"
+msgstr "git notes merge [<옵션>] <쪽지-레퍼런스>"
+
+#: builtin/notes.c:73
+msgid "git notes merge --commit [<options>]"
+msgstr "git notes merge --commit [<옵션>]"
+
+#: builtin/notes.c:74
+msgid "git notes merge --abort [<options>]"
+msgstr "git notes merge --abort [<옵션>]"
+
+#: builtin/notes.c:79
+msgid "git notes remove [<object>]"
+msgstr "git notes remove [<오브젝트>]"
+
+#: builtin/notes.c:84
+msgid "git notes prune [<options>]"
+msgstr "git notes prune [<옵션>]"
+
+#: builtin/notes.c:89
+msgid "git notes get-ref"
+msgstr "git notes get-ref"
+
+#: builtin/notes.c:147
+#, c-format
+msgid "unable to start 'show' for object '%s'"
+msgstr "'%s' 오브젝트에 대해 'show'를 시작할 수 없습니다"
+
+#: builtin/notes.c:151
+msgid "could not read 'show' output"
+msgstr "'show' 출력을 읽을 수 없습니다"
+
+#: builtin/notes.c:159
+#, c-format
+msgid "failed to finish 'show' for object '%s'"
+msgstr "오브젝트 '%s'에 대해 'show'를 마치는데 실패했습니다"
+
+#: builtin/notes.c:174 builtin/tag.c:248
+#, c-format
+msgid "could not create file '%s'"
+msgstr "'%s' 파일을 만들 수 없습니다"
+
+#: builtin/notes.c:193
+msgid "Please supply the note contents using either -m or -F option"
+msgstr "노트 내용을 -m 또는 -F 옵션으로 입력하십시오"
+
+#: builtin/notes.c:202
+msgid "unable to write note object"
+msgstr "노트 오브젝트를 쓸 수 없습니다"
+
+#: builtin/notes.c:204
+#, c-format
+msgid "The note contents have been left in %s"
+msgstr "노트 내용은 %s에 남습니다"
+
+#: builtin/notes.c:232 builtin/tag.c:440
+#, c-format
+msgid "cannot read '%s'"
+msgstr "'%s'을(를) 읽을 수 없습니다"
+
+#: builtin/notes.c:234 builtin/tag.c:443
+#, c-format
+msgid "could not open or read '%s'"
+msgstr "'%s'을(를) 열거나 읽을 수 없습니다"
+
+#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306
+#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507
+#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653
+#: builtin/notes.c:877 builtin/tag.c:456
+#, c-format
+msgid "Failed to resolve '%s' as a valid ref."
+msgstr "'%s'을(를) 올바른 레퍼런스로 알아내는데 실패했습니다."
+
+#: builtin/notes.c:256
+#, c-format
+msgid "Failed to read object '%s'."
+msgstr "'%s' 오브젝트 읽기에 실패했습니다."
+
+#: builtin/notes.c:260
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "블롭이 아닌 '%s' 오브젝트에 대해 노트 데이터를 읽을 수 없습니다."
+
+#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490
+#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646
+#: builtin/notes.c:942
+msgid "too many parameters"
+msgstr "파라미터가 너무 많습니다"
+
+#: builtin/notes.c:372 builtin/notes.c:659
+#, c-format
+msgid "No note found for object %s."
+msgstr "%s 오브젝트에 대해 노트가 없습니다."
+
+#: builtin/notes.c:393 builtin/notes.c:556
+msgid "note contents as a string"
+msgstr "문자열로 노트 내용"
+
+#: builtin/notes.c:396 builtin/notes.c:559
+msgid "note contents in a file"
+msgstr "파일 안에 노트 내용"
+
+#: builtin/notes.c:399 builtin/notes.c:562
+msgid "reuse and edit specified note object"
+msgstr "지정한 노트 오브젝트를 재사용하고 편집합니다"
+
+#: builtin/notes.c:402 builtin/notes.c:565
+msgid "reuse specified note object"
+msgstr "지정한 노트 오브젝트를 재사용합니다"
+
+#: builtin/notes.c:405 builtin/notes.c:568
+msgid "allow storing empty note"
+msgstr "빈 노트 저장을 허용합니다"
+
+#: builtin/notes.c:406 builtin/notes.c:477
+msgid "replace existing notes"
+msgstr "기존 노트를 바꿉니다"
+
+#: builtin/notes.c:431
+#, c-format
+msgid ""
+"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr "노트를 추가할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트를 덮어쓰려면 '-f' 옵션을 사용하십시오"
+
+#: builtin/notes.c:446 builtin/notes.c:525
+#, c-format
+msgid "Overwriting existing notes for object %s\n"
+msgstr "%s 오브젝트에 대한 기존 노트를 덮어씁니다\n"
+
+#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882
+#, c-format
+msgid "Removing note for object %s\n"
+msgstr "%s 오브젝트에 대한 노트를 제거합니다\n"
+
+#: builtin/notes.c:478
+msgid "read objects from stdin"
+msgstr "표준 입력에서 오브젝트를 읽습니다"
+
+#: builtin/notes.c:480
+msgid "load rewriting config for <command> (implies --stdin)"
+msgstr "<명령>에 대한 다시쓰기 설정을 읽어들입니다 (--stdin 옵션 포함)"
+
+#: builtin/notes.c:498
+msgid "too few parameters"
+msgstr "파라미터가 너무 적습니다"
+
+#: builtin/notes.c:519
+#, c-format
+msgid ""
+"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
+"existing notes"
+msgstr "노트를 복사할 수 없습니다. %s 오브젝트에 대한 기존 노트가 있습니다. 기존 노트를 덮어쓰려면 '-f' 옵션을 사용하십시오"
+
+#: builtin/notes.c:531
+#, c-format
+msgid "Missing notes on source object %s. Cannot copy."
+msgstr "원본 %s 오브젝트에 대한 노트가 없습니다. 복사할 수 없습니다."
+
+#: builtin/notes.c:583
+#, c-format
+msgid ""
+"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
+"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
+msgstr ""
+"-m/-F/-c/-C 옵션은 'edit' 하위 명령에 대해 사용을 권하지 않습니다.\n"
+"대신에 'git notes add -f -m/-F/-c/-C' 명령을 사용하십시오.\n"
+
+#: builtin/notes.c:764
+msgid "General options"
+msgstr "일반 옵션"
+
+#: builtin/notes.c:766
+msgid "Merge options"
+msgstr "병합 옵션"
+
+#: builtin/notes.c:768
+msgid ""
+"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
+"cat_sort_uniq)"
+msgstr "주어진 전략을 사용해 노트 충돌을 해결합니다 (manual/ours/theirs/union/cat_sort_uniq)"
+
+#: builtin/notes.c:770
+msgid "Committing unmerged notes"
+msgstr "병합하지 않은 노트 커밋"
+
+#: builtin/notes.c:772
+msgid "finalize notes merge by committing unmerged notes"
+msgstr "병합하지 않은 노트를 커밋해 노트 병합을 마칩니다"
+
+#: builtin/notes.c:774
+msgid "Aborting notes merge resolution"
+msgstr "노트 병합 해결 중지"
+
+#: builtin/notes.c:776
+msgid "abort notes merge"
+msgstr "노트 병합을 중지합니다"
+
+#: builtin/notes.c:853
+#, c-format
+msgid "A notes merge into %s is already in-progress at %s"
+msgstr "%s 위치로 노트 병합이 이미 %s에서 진행중입니다"
+
+#: builtin/notes.c:880
+#, c-format
+msgid "Object %s has no note\n"
+msgstr "%s 오브젝트에 노트가 없습니다\n"
+
+#: builtin/notes.c:892
+msgid "attempt to remove non-existent note is not an error"
+msgstr "없는 노트를 제거하려는 시도를 오류가 아닌 것으로 취급합니다"
+
+#: builtin/notes.c:895
+msgid "read object names from the standard input"
+msgstr "표준 입력에서 오브젝트 이름을 읽습니다"
+
+#: builtin/notes.c:976
+msgid "notes-ref"
+msgstr "노트-레퍼런스"
+
+#: builtin/notes.c:977
+msgid "use notes from <notes-ref>"
+msgstr "<노트-레퍼런스>에서 노트를 사용합니다"
+
+#: builtin/notes.c:1012 builtin/remote.c:1647
+#, c-format
+msgid "Unknown subcommand: %s"
+msgstr "알 수 없는 하위 명령: %s"
+
+#: builtin/pack-objects.c:28
+msgid ""
+"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects --stdout [<옵션>...] [< <레퍼런스목록> | < <오브젝트목록>]"
+
+#: builtin/pack-objects.c:29
+msgid ""
+"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"
+msgstr ""
+"git pack-objects [<옵션>...] <베이스이름> [< <레퍼런스목록> | < <오브젝트목록"
+">]"
+
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
+#, c-format
+msgid "deflate error (%d)"
+msgstr "deflate 오류 (%d)"
+
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "오브젝트 쓰는 중"
+
+#: builtin/pack-objects.c:1011
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "묶음에 들어있지 않은 오브젝트가 있으므로, 비트맵 쓰기를 하지 않습니다"
+
+#: builtin/pack-objects.c:2171
+msgid "Compressing objects"
+msgstr "오브젝트 압축하는 중"
+
+#: builtin/pack-objects.c:2568
+#, c-format
+msgid "unsupported index version %s"
+msgstr "지원하지 않는 인덱스 버전 %s"
+
+#: builtin/pack-objects.c:2572
+#, c-format
+msgid "bad index version '%s'"
+msgstr "잘못된 인덱스 버전 '%s'"
+
+#: builtin/pack-objects.c:2602
+msgid "do not show progress meter"
+msgstr "진행률을 표시하지 않습니다"
+
+#: builtin/pack-objects.c:2604
+msgid "show progress meter"
+msgstr "진행률을 표시합니다"
+
+#: builtin/pack-objects.c:2606
+msgid "show progress meter during object writing phase"
+msgstr "오브젝트 쓰기 단계에서 진행률을 표시합니다"
+
+#: builtin/pack-objects.c:2609
+msgid "similar to --all-progress when progress meter is shown"
+msgstr "진행률이 표시될 때 --all-progress와 비슷합니다"
+
+#: builtin/pack-objects.c:2610
+msgid "version[,offset]"
+msgstr "버전[,오프셋]"
+
+#: builtin/pack-objects.c:2611
+msgid "write the pack index file in the specified idx format version"
+msgstr "지정한 버전의 인덱스 형식에 따라 묶음 인덱스 파일을 씁니다"
+
+#: builtin/pack-objects.c:2614
+msgid "maximum size of each output pack file"
+msgstr "출력 묶음 파일의 최대 크기"
+
+#: builtin/pack-objects.c:2616
+msgid "ignore borrowed objects from alternate object store"
+msgstr "보조 오브젝트 저장소에서 빌려온 오브젝트를 무시합니다"
+
+#: builtin/pack-objects.c:2618
+msgid "ignore packed objects"
+msgstr "묶음 오브젝트를 무시합니다"
+
+#: builtin/pack-objects.c:2620
+msgid "limit pack window by objects"
+msgstr "묶음 윈도우를 오브젝트 단위로 제한합니다"
+
+#: builtin/pack-objects.c:2622
+msgid "limit pack window by memory in addition to object limit"
+msgstr "묶음 윈도우를 오브젝트 단위에 추가로 메모리 단위로 제한합니다"
+
+#: builtin/pack-objects.c:2624
+msgid "maximum length of delta chain allowed in the resulting pack"
+msgstr "결과물 묶음에서 허용되는 최대 길이의 델타 체인"
+
+#: builtin/pack-objects.c:2626
+msgid "reuse existing deltas"
+msgstr "기존 델타를 재사용합니다"
+
+#: builtin/pack-objects.c:2628
+msgid "reuse existing objects"
+msgstr "기존 오브젝트를 재사용합니다"
+
+#: builtin/pack-objects.c:2630
+msgid "use OFS_DELTA objects"
+msgstr "OFS_DELTA 오브젝트를 사용합니다"
+
+#: builtin/pack-objects.c:2632
+msgid "use threads when searching for best delta matches"
+msgstr "최상의 델타 일치를 검색하는데 스레드를 사용합니다"
+
+#: builtin/pack-objects.c:2634
+msgid "do not create an empty pack output"
+msgstr "빈 묶음 출력을 만들지 않습니다"
+
+#: builtin/pack-objects.c:2636
+msgid "read revision arguments from standard input"
+msgstr "표준 입력에서 리비전 인자를 읽습니다"
+
+#: builtin/pack-objects.c:2638
+msgid "limit the objects to those that are not yet packed"
+msgstr "묶지 않는 오브젝트 수를 제한합니다"
+
+#: builtin/pack-objects.c:2641
+msgid "include objects reachable from any reference"
+msgstr "모든 레퍼런스에서 접근 가능한 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2644
+msgid "include objects referred by reflog entries"
+msgstr "reflog 항목에서 레퍼런스할 수 있는 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2647
+msgid "include objects referred to by the index"
+msgstr "인덱스에서< 레퍼런스하는 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2650
+msgid "output pack to stdout"
+msgstr "묶음을 표준 출력으로 출력합니다"
+
+#: builtin/pack-objects.c:2652
+msgid "include tag objects that refer to objects to be packed"
+msgstr "묶음에 들어갈 오브젝트를 레퍼런스하는 태그 오브젝트를 포함합니다"
+
+#: builtin/pack-objects.c:2654
+msgid "keep unreachable objects"
+msgstr "접근 불가능 오브젝트를 보존합니다"
+
+#: builtin/pack-objects.c:2655 parse-options.h:142
+msgid "time"
+msgstr "시각"
+
+#: builtin/pack-objects.c:2656
+msgid "unpack unreachable objects newer than <time>"
+msgstr "<시각>보다 새로운 접근 불가능 오브젝트의 묶음을 풉니다"
+
+#: builtin/pack-objects.c:2659
+msgid "create thin packs"
+msgstr "얇은 묶음을 만듭니다"
+
+#: builtin/pack-objects.c:2661
+msgid "create packs suitable for shallow fetches"
+msgstr "얕은 가져오기에 적합한 묶음을 만듭니다"
+
+#: builtin/pack-objects.c:2663
+msgid "ignore packs that have companion .keep file"
+msgstr "해당하는 .keep 파일이 있는 묶음을 무시합니다"
+
+#: builtin/pack-objects.c:2665
+msgid "pack compression level"
+msgstr "묶음 압축 단계"
+
+# FIXME: graft?
+#: builtin/pack-objects.c:2667
+msgid "do not hide commits by grafts"
+msgstr "붙어 있는 커밋을 숨기지 않습니다"
+
+#: builtin/pack-objects.c:2669
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "가능하면 비트맵 인덱스를 사용해 오브젝트 세기 속도를 높입니다"
+
+#: builtin/pack-objects.c:2671
+msgid "write a bitmap index together with the pack index"
+msgstr "묶음 인덱스와 같이 비트맵 인덱스를 씁니다"
+
+#: builtin/pack-objects.c:2762
+msgid "Counting objects"
+msgstr "오브젝트 개수 세는 중"
+
+#: builtin/pack-refs.c:6
+msgid "git pack-refs [<options>]"
+msgstr "git pack-refs [<옵션>]"
+
+#: builtin/pack-refs.c:14
+msgid "pack everything"
+msgstr "모두 묶습니다"
+
+#: builtin/pack-refs.c:15
+msgid "prune loose refs (default)"
+msgstr "느슨한 레퍼런스를 잘라냅니다 (기본값)"
+
+#: builtin/prune-packed.c:7
+msgid "git prune-packed [-n | --dry-run] [-q | --quiet]"
+msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]"
+
+#: builtin/prune-packed.c:40
+msgid "Removing duplicate objects"
+msgstr "중복된 오브젝트 제거"
+
+#: builtin/prune.c:11
+msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
+msgstr "git prune [-n] [-v] [--expire <시각>] [--] [<헤드>...]"
+
+#: builtin/prune.c:105 builtin/worktree.c:124
+msgid "do not remove, show only"
+msgstr "제거하지 않고, 보여주기만 합니다"
+
+#: builtin/prune.c:106 builtin/worktree.c:125
+msgid "report pruned objects"
+msgstr "잘라낸 오브젝트를 알립니다"
+
+#: builtin/prune.c:109 builtin/worktree.c:127
+msgid "expire objects older than <time>"
+msgstr "<시각>보다 오래 된 오브젝트가 만료됩니다"
+
+#: builtin/prune.c:123
+msgid "cannot prune in a precious-objects repo"
+msgstr "precious-objects 저장소에서 잘라낼 수 없습니다"
+
+#: builtin/pull.c:69
+msgid "git pull [<options>] [<repository> [<refspec>...]]"
+msgstr "git pull [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/pull.c:113
+msgid "Options related to merging"
+msgstr "병합 관련 옵션"
+
+#: builtin/pull.c:116
+msgid "incorporate changes by rebasing rather than merging"
+msgstr "변경 사항을 적용할 때 병합하는 대신 리베이스합니다"
+
+#: builtin/pull.c:140 builtin/revert.c:105
+msgid "allow fast-forward"
+msgstr "정방향 진행을 허용합니다"
+
+#: builtin/pull.c:146
+msgid "verify that the named commit has a valid GPG signature"
+msgstr "지정한 커밋에 올바른 GPG 서명이 있는지 검증합니다"
+
+#: builtin/pull.c:160
+msgid "Options related to fetching"
+msgstr "가져오기 관련 옵션"
+
+#: builtin/pull.c:268
+#, c-format
+msgid "Invalid value for pull.ff: %s"
+msgstr "pull.ff에 대해 잘못된 값: %s"
+
+#: builtin/pull.c:352
+msgid "Cannot pull with rebase: You have unstaged changes."
+msgstr "리베이스로 풀을 할 수 없습니다: 스테이징하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:358
+msgid "Additionally, your index contains uncommitted changes."
+msgstr "추가로, 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:360
+msgid "Cannot pull with rebase: Your index contains uncommitted changes."
+msgstr "리베이스로 풀을 할 수 없습니다: 인덱스에 커밋하지 않은 변경 사항이 있습니다."
+
+#: builtin/pull.c:436
+msgid ""
+"There is no candidate for rebasing against among the refs that you just "
+"fetched."
+msgstr "가져온 레퍼런스 중에 리베이스할 대상 후보가 없습니다."
+
+#: builtin/pull.c:438
+msgid ""
+"There are no candidates for merging among the refs that you just fetched."
+msgstr "가져온 레퍼런스 중에 병합할 대상 후보가 없습니다."
+
+#: builtin/pull.c:439
+msgid ""
+"Generally this means that you provided a wildcard refspec which had no\n"
+"matches on the remote end."
+msgstr ""
+"보통 이런 경우는 리모트 쪽에는 없는 와일드카드 레퍼런스명세가\n"
+"주어졌을 때 일어납니다."
+
+#: builtin/pull.c:442
+#, c-format
+msgid ""
+"You asked to pull from the remote '%s', but did not specify\n"
+"a branch. Because this is not the default configured remote\n"
+"for your current branch, you must specify a branch on the command line."
+msgstr ""
+"리모트 '%s'에서 풀을 요청했지만, 브랜치를 지정하지 않았습니다.\n"
+"이 리모트는 현재 브랜치에 대해 기본으로 설정된 리모트가\n"
+"아니기 때문에, 명령행에서 브랜치를 지정해야 합니다."
+
+#: builtin/pull.c:447
+msgid "You are not currently on a branch."
+msgstr "현재 어떤 브랜치 위에도 있지 않습니다."
+
+#: builtin/pull.c:449 builtin/pull.c:464
+msgid "Please specify which branch you want to rebase against."
+msgstr "어떤 브랜치를 대상으로 리베이스할지 지정하십시오."
+
+#: builtin/pull.c:451 builtin/pull.c:466
+msgid "Please specify which branch you want to merge with."
+msgstr "어떤 브랜치를 대상으로 병합할지 지정하십시오."
+
+#: builtin/pull.c:452 builtin/pull.c:467
+msgid "See git-pull(1) for details."
+msgstr "자세한 정보는 git-pull(1) 페이지를 참고하십시오."
+
+#: builtin/pull.c:462
+msgid "There is no tracking information for the current branch."
+msgstr "현재 브랜치에 추적 정보가 없습니다."
+
+#: builtin/pull.c:471
+#, c-format
+msgid ""
+"If you wish to set tracking information for this branch you can do so with:\n"
+"\n"
+"    git branch --set-upstream-to=%s/<branch> %s\n"
+msgstr ""
+"이 브랜치에 대한 추적 정보를 설정하려면 다음과 같이 할 수 있습니다:\n"
+"\n"
+"    git branch --set-upstream-to=%s/<브랜치> %s\n"
+
+#: builtin/pull.c:476
+#, c-format
+msgid ""
+"Your configuration specifies to merge with the ref '%s'\n"
+"from the remote, but no such ref was fetched."
+msgstr ""
+"설정에서 리모트의 '%s' 레퍼런스와 병합하도록 지정했지만,\n"
+"그런 레퍼런스를 가져오지 않았습니다."
+
+#: builtin/pull.c:830
+msgid "Updating an unborn branch with changes added to the index."
+msgstr "만들어지지 않은 브랜치를 인덱스에 추가된 변경 사항으로 업데이트합니다."
+
+#: builtin/pull.c:859
+#, c-format
+msgid ""
+"fetch updated the current branch head.\n"
+"fast-forwarding your working tree from\n"
+"commit %s."
+msgstr ""
+"현재 브랜치 헤드를 업데이트했습니다.\n"
+"작업 폴더를 %s 커밋에서 정방향\n"
+"진행합니다."
+
+#: builtin/pull.c:864
+#, c-format
+msgid ""
+"Cannot fast-forward your working tree.\n"
+"After making sure that you saved anything precious from\n"
+"$ git diff %s\n"
+"output, run\n"
+"$ git reset --hard\n"
+"to recover."
+msgstr ""
+"작업 폴더를 정방향 진행할 수 없습니다.\n"
+"다음 명령 출력에서 중요한 사항을 저장한 다음,\n"
+"$ git diff %s\n"
+"다음을 실행하면\n"
+"$ git reset --hard\n"
+"복구됩니다."
+
+#: builtin/pull.c:879
+msgid "Cannot merge multiple branches into empty head."
+msgstr "여러 브랜치를 빈 헤드로 병합할 수 없습니다."
+
+#: builtin/pull.c:883
+msgid "Cannot rebase onto multiple branches."
+msgstr "여러 브랜치로 리베이스할 수 없습니다."
+
+#: builtin/push.c:16
+msgid "git push [<options>] [<repository> [<refspec>...]]"
+msgstr "git push [<옵션>] [<저장소> [<레퍼런스명세>...]]"
+
+#: builtin/push.c:88
+msgid "tag shorthand without <tag>"
+msgstr "<태그> 없이 태그 줄임"
+
+#: builtin/push.c:98
+msgid "--delete only accepts plain target ref names"
+msgstr "--delete 옵션은 일반 대상 레퍼런스 이름만 받습니다"
+
+#: builtin/push.c:142
+msgid ""
+"\n"
+"To choose either option permanently, see push.default in 'git help config'."
+msgstr "\n어느 한 쪽 옵션만 계속 선택하려면, 'git help config'에서 push.default를 참고하십시오."
+
+#: builtin/push.c:145
+#, c-format
+msgid ""
+"The upstream branch of your current branch does not match\n"
+"the name of your current branch.  To push to the upstream branch\n"
+"on the remote, use\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"To push to the branch of the same name on the remote, use\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+msgstr ""
+"현재 브랜치의 업스트림 브랜치가 현재 브랜치의 이름과\n"
+"같지 않습니다. 리모트의 업스트림 브랜치로 푸시하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push %s HEAD:%s\n"
+"\n"
+"리모트의 같은 이름으로 푸시하려면 다음과 같이 하십시오.\n"
+"\n"
+"    git push %s %s\n"
+"%s"
+
+#: builtin/push.c:160
+#, c-format
+msgid ""
+"You are not currently on a branch.\n"
+"To push the history leading to the current (detached HEAD)\n"
+"state now, use\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
+msgstr ""
+"현재 어떤 브랜치 위에도 있지 않습니다.\n"
+"지금 현재 (HEAD 분리) 상태까지의 커밋 내역을 푸시하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push %s HEAD:<name-of-remote-branch>\n"
+
+#: builtin/push.c:174
+#, c-format
+msgid ""
+"The current branch %s has no upstream branch.\n"
+"To push the current branch and set the remote as upstream, use\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+msgstr ""
+"현재 브랜치 %s에 업스트림 브랜치가 없습니다.\n"
+"현재 브랜치를 푸시하고 해당 리모트를 업스트림으로 지정하려면\n"
+"다음과 같이 하십시오.\n"
+"\n"
+"    git push --set-upstream %s %s\n"
+
+#: builtin/push.c:182
+#, c-format
+msgid "The current branch %s has multiple upstream branches, refusing to push."
+msgstr "현재 브랜치  %s에 여러 업스트림 브랜치가 있습니다. 푸시를 거절합니다."
+
+#: builtin/push.c:185
+#, c-format
+msgid ""
+"You are pushing to remote '%s', which is not the upstream of\n"
+"your current branch '%s', without telling me what to push\n"
+"to update which remote branch."
+msgstr ""
+"'%s' 리모트로 푸시하는 중입니다. 하지만 이 리모트는 현재\n"
+"'%s' 브랜치의 업스트림이 아닙니다. 어떤 리모트 브랜치에 무엇을\n"
+"푸시할지 설정하지 않았습니다."
+
+#: builtin/push.c:208
+msgid ""
+"push.default is unset; its implicit value has changed in\n"
+"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
+"and maintain the traditional behavior, use:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"To squelch this message and adopt the new behavior now, use:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"When push.default is set to 'matching', git will push local branches\n"
+"to the remote branches that already exist with the same name.\n"
+"\n"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
+"behavior, which only pushes the current branch to the corresponding\n"
+"remote branch that 'git pull' uses to update the current branch.\n"
+"\n"
+"See 'git help config' and search for 'push.default' for further "
+"information.\n"
+"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
+"'current' instead of 'simple' if you sometimes use older versions of Git)"
+msgstr ""
+"push.default를 설정하지 않았습니다. 묵시적 값은 깃 2.0에서\n"
+"'matching'에서 'simple'로 바뀌었습니다. 이 메시지를 표시하지\n"
+"않고 과거의 동작을 유지하려면 다음과 같이 하십시오:\n"
+"\n"
+"  git config --global push.default matching\n"
+"\n"
+"이 메시지를 표시하지 않고 새 동작을 받아들이려면 다음과 같이\n"
+"하십시오:\n"
+"\n"
+"  git config --global push.default simple\n"
+"\n"
+"push.default가 'matching'으로 설정되면, 로컬 브랜치를 이미 같은 이름이\n"
+"있는 리모트 브랜치로 푸시합니다.\n"
+"\n"
+"깃 2.0부터 더 보수적인 'simple' 동작이 기본값입니다. 여기서는 현재\n"
+"브랜치를 'git pull'에서 현재 브랜치를 업데이트할 때 사용하는 해당\n"
+"리모트 브랜치로 푸시합니다.\n"
+"\n"
+"더 자세한 정보는 'git help config'에서 'push.default' 설명을 보십시오.\n"
+"('simple' 모드는 깃 1.7.11에 추가되었습니다. 과거 버전의 깃을 사용하게\n"
+"되면 비슷한 'current' 모드를 사용하십시오.)"
+
+#: builtin/push.c:275
+msgid ""
+"You didn't specify any refspecs to push, and push.default is \"nothing\"."
+msgstr "푸시할 레퍼런스명세를 지정하지 않았고, push.default 값이 'nothing'입니다."
+
+#: builtin/push.c:282
+msgid ""
+"Updates were rejected because the tip of your current branch is behind\n"
+"its remote counterpart. Integrate the remote changes (e.g.\n"
+"'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"현재 브랜치의 끝이 리모트 브랜치보다 뒤에 있으므로 업데이트가\n"
+"거부되었습니다. 푸시하기 전에 ('git pull ...' 등 명령으로) 리모트\n"
+"변경 사항을 포함하십시오.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:288
+msgid ""
+"Updates were rejected because a pushed branch tip is behind its remote\n"
+"counterpart. Check out this branch and integrate the remote changes\n"
+"(e.g. 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"현재 브랜치의 끝이 리모트 브랜치보다 뒤에 있으므로 업데이트가\n"
+"거부되었습니다. 이 브랜치를 체크아웃하고 푸시하기 전에\n"
+"('git pull ...' 등 명령으로) 리모트 변경 사항을 포함하십시오.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:294
+msgid ""
+"Updates were rejected because the remote contains work that you do\n"
+"not have locally. This is usually caused by another repository pushing\n"
+"to the same ref. You may want to first integrate the remote changes\n"
+"(e.g., 'git pull ...') before pushing again.\n"
+"See the 'Note about fast-forwards' in 'git push --help' for details."
+msgstr ""
+"리모트에 로컬에 없는 사항이 들어 있으므로 업데이트가\n"
+"거부되었습니다. 이 상황은 보통 또 다른 저장소에서 같은\n"
+"저장소로 푸시할 때 발생합니다.  푸시하기 전에\n"
+"('git pull ...' 등 명령으로) 리모트 변경 사항을 먼저\n"
+"포함해야 합니다.\n"
+"자세한 정보는 'git push --help'의 \"Note about fast-forwards' 부분을\n"
+"참고하십시오."
+
+#: builtin/push.c:301
+msgid "Updates were rejected because the tag already exists in the remote."
+msgstr "리모트에 태그가 이미 있기 때문에 업데이트가 거부되었습니다."
+
+#: builtin/push.c:304
+msgid ""
+"You cannot update a remote ref that points at a non-commit object,\n"
+"or update a remote ref to make it point at a non-commit object,\n"
+"without using the '--force' option.\n"
+msgstr ""
+"'--force' 옵션이 없이 커밋이 아닌 오브젝트를 가리키는 리모트\n"
+"레퍼런스를 업데이트하거나, 커밋이 아닌 오브젝트를 가리키도록\n"
+"업데이트할 수 없습니다.\n"
+
+#: builtin/push.c:363
+#, c-format
+msgid "Pushing to %s\n"
+msgstr "다음에 푸시: %s\n"
+
+#: builtin/push.c:367
+#, c-format
+msgid "failed to push some refs to '%s'"
+msgstr "레퍼런스를 '%s'에 푸시하는데 실패했습니다"
+
+#: builtin/push.c:397
+#, c-format
+msgid "bad repository '%s'"
+msgstr "잘못된 저장소 '%s'"
+
+#: builtin/push.c:398
+msgid ""
+"No configured push destination.\n"
+"Either specify the URL from the command-line or configure a remote "
+"repository using\n"
+"\n"
+"    git remote add <name> <url>\n"
+"\n"
+"and then push using the remote name\n"
+"\n"
+"    git push <name>\n"
+msgstr ""
+"푸시 대상을 설정하지 않았습니다.\n"
+"명령해에서 URL을 지정하거나 다음을 사용해 리모트 저장소를 설정하십시오\n"
+"\n"
+"    git remote add <이름> <URL>\n"
+"\n"
+"그리고 이 리모트 이름을 사용해 푸시하십시오\n"
+"\n"
+"    git push <name>\n"
+
+#: builtin/push.c:413
+msgid "--all and --tags are incompatible"
+msgstr "--all 및 --tags 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:414
+msgid "--all can't be combined with refspecs"
+msgstr "--all 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
+
+#: builtin/push.c:419
+msgid "--mirror and --tags are incompatible"
+msgstr "--mirror 및 --tags 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:420
+msgid "--mirror can't be combined with refspecs"
+msgstr "--mirror 옵션은 레퍼런스명세와 같이 쓸 수 없습니다"
+
+#: builtin/push.c:425
+msgid "--all and --mirror are incompatible"
+msgstr "--all 및 --mirror 옵션은 호환되지 않습니다"
+
+#: builtin/push.c:537
+msgid "repository"
+msgstr "저장소"
+
+#: builtin/push.c:538 builtin/send-pack.c:161
+msgid "push all refs"
+msgstr "모든 레퍼런스 푸시하기"
+
+#: builtin/push.c:539 builtin/send-pack.c:163
+msgid "mirror all refs"
+msgstr "모든 레퍼런스 미러"
+
+#: builtin/push.c:541
+msgid "delete refs"
+msgstr "레퍼런스 삭제"
+
+#: builtin/push.c:542
+msgid "push tags (can't be used with --all or --mirror)"
+msgstr "태그 푸시하기 (--all 또는 --mirror 옵션과 같이 쓸 수 없음)"
+
+#: builtin/push.c:545 builtin/send-pack.c:164
+msgid "force updates"
+msgstr "강제로 업데이트"
+
+#: builtin/push.c:547 builtin/send-pack.c:175
+msgid "refname>:<expect"
+msgstr "레퍼런스이름>:<예상"
+
+#: builtin/push.c:548 builtin/send-pack.c:176
+msgid "require old value of ref to be at this value"
+msgstr "레퍼런스의 과거 값이 이 값이어야 합니다"
+
+#: builtin/push.c:550
+msgid "check|on-demand|no"
+msgstr "check|on-demand|no"
+
+#: builtin/push.c:551
+msgid "control recursive pushing of submodules"
+msgstr "재귀적 하위 모듈 푸시 방식을 설정합니다"
+
+#: builtin/push.c:553 builtin/send-pack.c:169
+msgid "use thin pack"
+msgstr "얇은 묶음을 사용합니다"
+
+#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158
+#: builtin/send-pack.c:159
+msgid "receive pack program"
+msgstr "receive pack 프로그램"
+
+#: builtin/push.c:556
+msgid "set upstream for git pull/status"
+msgstr "git pull/status에 대한 업스트림을 설정합니다"
+
+#: builtin/push.c:559
+msgid "prune locally removed refs"
+msgstr "로컬에서 제거한 레퍼런스를 잘라냅니다"
+
+#: builtin/push.c:561
+msgid "bypass pre-push hook"
+msgstr "푸시 전 후크를 건너뜁니다"
+
+#: builtin/push.c:562
+msgid "push missing but relevant tags"
+msgstr "빠졌지만 관련된 태그를 푸시합니다"
+
+#: builtin/push.c:565 builtin/send-pack.c:166
+msgid "GPG sign the push"
+msgstr "푸시에 GPG 서명"
+
+#: builtin/push.c:567 builtin/send-pack.c:170
+msgid "request atomic transaction on remote side"
+msgstr "리모트 쪽에 원자 트랜잭션을 요청합니다"
+
+#: builtin/push.c:577
+msgid "--delete is incompatible with --all, --mirror and --tags"
+msgstr "--delete 옵션은 --all, --mirror, --tags 옵션과 호환되지 않습니다"
+
+#: builtin/push.c:579
+msgid "--delete doesn't make sense without any refs"
+msgstr "--delete 옵션은 레퍼런스 없이 앞뒤가 맞지 않습니다"
+
+#: builtin/read-tree.c:37
+msgid ""
+"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
+"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
+"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
+msgstr "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<접두어>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<파일>] (--empty | <트리-따위> [<트리-따위2> [<트리-따위3>]])"
+
+#: builtin/read-tree.c:110
+msgid "write resulting index to <file>"
+msgstr "결과 인덱스를 <파일>에 씁니다"
+
+#: builtin/read-tree.c:113
+msgid "only empty the index"
+msgstr "인덱스를 비우기만 합니다"
+
+#: builtin/read-tree.c:115
+msgid "Merging"
+msgstr "병합하기"
+
+#: builtin/read-tree.c:117
+msgid "perform a merge in addition to a read"
+msgstr "읽은 다음 병합을 수행합니다"
+
+#: builtin/read-tree.c:119
+msgid "3-way merge if no file level merging required"
+msgstr "파일 단위 병합이 필요하지 않으면 3-방향 병합을 합니다"
+
+#: builtin/read-tree.c:121
+msgid "3-way merge in presence of adds and removes"
+msgstr "추가와 제거가 있을 때 3-방향 병합을 합니다"
+
+#: builtin/read-tree.c:123
+msgid "same as -m, but discard unmerged entries"
+msgstr "-m과 동일하지만, 병합되지 않은 항목을 버립니다"
+
+#: builtin/read-tree.c:124
+msgid "<subdirectory>/"
+msgstr "<하위디렉터리>/"
+
+#: builtin/read-tree.c:125
+msgid "read the tree into the index under <subdirectory>/"
+msgstr "트리를 <하위디렉터리>/ 아래 인덱스로 읽습니다"
+
+#: builtin/read-tree.c:128
+msgid "update working tree with merge result"
+msgstr "작업 폴더를 병합 결과로 업데이트합니다"
+
+#: builtin/read-tree.c:130
+msgid "gitignore"
+msgstr "gitignore"
+
+#: builtin/read-tree.c:131
+msgid "allow explicitly ignored files to be overwritten"
+msgstr "무시하는 파일을 덮어쓰도록 명시적으로 허용합니다"
+
+#: builtin/read-tree.c:134
+msgid "don't check the working tree after merging"
+msgstr "병합 후에 작업 폴더를 확인하지 않습니다"
+
+#: builtin/read-tree.c:135
+msgid "don't update the index or the work tree"
+msgstr "인덱스나 작업 폴더를 업데이트하지 않습니다"
+
+#: builtin/read-tree.c:137
+msgid "skip applying sparse checkout filter"
+msgstr "드문 체크아웃 필터 적용을 건너뜁니다"
+
+#: builtin/read-tree.c:139
+msgid "debug unpack-trees"
+msgstr "unpack-trees 디버깅"
+
+#: builtin/reflog.c:428
+#, c-format
+msgid "'%s' for '%s' is not a valid timestamp"
+msgstr "'%s' 값이 '%s'에 대해 올바른 시각 값이 아닙니다"
+
+#: builtin/reflog.c:545 builtin/reflog.c:550
+#, c-format
+msgid "'%s' is not a valid timestamp"
+msgstr "'%s'은(는) 올바른 시각 값이 아닙니다"
+
+#: builtin/remote.c:12
+msgid "git remote [-v | --verbose]"
+msgstr "git remote [-v | --verbose]"
+
+#: builtin/remote.c:13
+msgid ""
+"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <name> <url>"
+msgstr ""
+"git remote add [-t <브랜치>] [-m <master>] [-f] [--tags | --no-tags] [--"
+"mirror=<fetch|push>] <이름> <url>"
+
+#: builtin/remote.c:14 builtin/remote.c:34
+msgid "git remote rename <old> <new>"
+msgstr "git remote rename <옛이름> <새이름>"
+
+#: builtin/remote.c:15 builtin/remote.c:39
+msgid "git remote remove <name>"
+msgstr "git remote remove <이름>"
+
+#: builtin/remote.c:16 builtin/remote.c:44
+msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
+msgstr "git remote set-head <이름> (-a | --auto | -d | --delete | <브랜치>)"
+
+#: builtin/remote.c:17
+msgid "git remote [-v | --verbose] show [-n] <name>"
+msgstr "git remote [-v | --verbose] show [-n] <이름>"
+
+#: builtin/remote.c:18
+msgid "git remote prune [-n | --dry-run] <name>"
+msgstr "git remote prune [-n | --dry-run] <이름>"
+
+#: builtin/remote.c:19
+msgid ""
+"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
+msgstr ""
+"git remote [-v | --verbose] update [-p | --prune] [(<그룹> | <리모트>)...]"
+
+#: builtin/remote.c:20
+msgid "git remote set-branches [--add] <name> <branch>..."
+msgstr "git remote set-branches [--add] <이름> <브랜치>..."
+
+#: builtin/remote.c:21 builtin/remote.c:70
+msgid "git remote get-url [--push] [--all] <name>"
+msgstr "git remote get-url [--push] [--all] <이름>"
+
+#: builtin/remote.c:22 builtin/remote.c:75
+msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
+msgstr "git remote set-url [--push] <이름> <새url> [<옛url>]"
+
+#: builtin/remote.c:23 builtin/remote.c:76
+msgid "git remote set-url --add <name> <newurl>"
+msgstr "git remote set-url --add <이름> <새url>"
+
+#: builtin/remote.c:24 builtin/remote.c:77
+msgid "git remote set-url --delete <name> <url>"
+msgstr "git remote set-url --delete <이름> <url>"
+
+#: builtin/remote.c:29
+msgid "git remote add [<options>] <name> <url>"
+msgstr "git remote add [<옵션>] <이름> <url>"
+
+#: builtin/remote.c:49
+msgid "git remote set-branches <name> <branch>..."
+msgstr "git remote set-branches <이름> <브랜치>..."
+
+#: builtin/remote.c:50
+msgid "git remote set-branches --add <name> <branch>..."
+msgstr "git remote set-branches --add <이름> <브랜치>..."
+
+#: builtin/remote.c:55
+msgid "git remote show [<options>] <name>"
+msgstr "git remote show [<옵션>] <이름>"
+
+#: builtin/remote.c:60
+msgid "git remote prune [<options>] <name>"
+msgstr "git remote prune [<옵션>] <이름>"
+
+#: builtin/remote.c:65
+msgid "git remote update [<options>] [<group> | <remote>]..."
+msgstr "git remote update [<옵션>] [<그룹> | <리모트>]..."
+
+#: builtin/remote.c:94
+#, c-format
+msgid "Updating %s"
+msgstr "%s 업데이트 중"
+
+#: builtin/remote.c:126
+msgid ""
+"--mirror is dangerous and deprecated; please\n"
+"\t use --mirror=fetch or --mirror=push instead"
+msgstr ""
+"--mirror는 위험하므로 사용을 권하지 않습니다. 대신에\n"
+"\t --mirror=fetch 또는 --mirror=push를 사용하십시오"
+
+#: builtin/remote.c:143
+#, c-format
+msgid "unknown mirror argument: %s"
+msgstr "알 수 없는 --mirror 옵션 인자: %s"
+
+#: builtin/remote.c:159
+msgid "fetch the remote branches"
+msgstr "리모트 브랜치를 가져옵니다"
+
+#: builtin/remote.c:161
+msgid "import all tags and associated objects when fetching"
+msgstr "가져올 때 모든 태그와 관련 오브젝트를 가져옵니다"
+
+#: builtin/remote.c:164
+msgid "or do not fetch any tag at all (--no-tags)"
+msgstr "아니면 아무 태그도 가져오지 않습니다 (--no-tags)"
+
+#: builtin/remote.c:166
+msgid "branch(es) to track"
+msgstr "추적할 브랜치"
+
+#: builtin/remote.c:167
+msgid "master branch"
+msgstr "마스터 브랜치"
+
+#: builtin/remote.c:168
+msgid "push|fetch"
+msgstr "push|fetch"
+
+#: builtin/remote.c:169
+msgid "set up remote as a mirror to push to or fetch from"
+msgstr "리모트를 푸시 또는 가져올 때 사용할 미러로 설정합니다"
+
+#: builtin/remote.c:181
+msgid "specifying a master branch makes no sense with --mirror"
+msgstr "--mirror 옵션과 같이 마스터 브랜치를 지정하면 앞뒤가 맞지 않습니다"
+
+#: builtin/remote.c:183
+msgid "specifying branches to track makes sense only with fetch mirrors"
+msgstr "마스터 브랜치를 지정은 fetch 미러에서만 앞뒤가 맞습니다"
+
+#: builtin/remote.c:193 builtin/remote.c:643
+#, c-format
+msgid "remote %s already exists."
+msgstr "%s 리모트가 이미 있습니다."
+
+#: builtin/remote.c:197 builtin/remote.c:647
+#, c-format
+msgid "'%s' is not a valid remote name"
+msgstr "'%s'은(는) 올바른 리모트 이름이 아닙니다"
+
+#: builtin/remote.c:241
+#, c-format
+msgid "Could not setup master '%s'"
+msgstr "마스터 '%s'을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:341
+#, c-format
+msgid "Could not get fetch map for refspec %s"
+msgstr "%s 레퍼런스명세에 대한 가져오기 맵을 얻을 수 없습니다"
+
+#: builtin/remote.c:442 builtin/remote.c:450
+msgid "(matching)"
+msgstr "(일치)"
+
+#: builtin/remote.c:454
+msgid "(delete)"
+msgstr "(삭제)"
+
+#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606
+#, c-format
+msgid "Could not append '%s' to '%s'"
+msgstr "'%s'을(를) '%s'에 추가할 수 없습니다"
+
+#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875
+#, c-format
+msgid "No such remote: %s"
+msgstr "그런 리모트가 없습니다: %s"
+
+#: builtin/remote.c:653
+#, c-format
+msgid "Could not rename config section '%s' to '%s'"
+msgstr "설정 섹션을 '%s'에서 '%s'(으)로 바꿀 수 없습니다"
+
+#: builtin/remote.c:659 builtin/remote.c:827
+#, c-format
+msgid "Could not remove config section '%s'"
+msgstr "설정 섹션 '%s'을(를) 제거할 수 없습니다"
+
+#: builtin/remote.c:674
+#, c-format
+msgid ""
+"Not updating non-default fetch refspec\n"
+"\t%s\n"
+"\tPlease update the configuration manually if necessary."
+msgstr ""
+"기본값이 아닌 가져오기 레퍼런스명세를 업데이트하지 않습니다\n"
+"\t%s\n"
+"\t필요하면 설정을 수동으로 업데이트하십시오."
+
+#: builtin/remote.c:680
+#, c-format
+msgid "Could not append '%s'"
+msgstr "'%s'에 덧붙일 수 없습니다"
+
+#: builtin/remote.c:691
+#, c-format
+msgid "Could not set '%s'"
+msgstr "'%s'을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:713
+#, c-format
+msgid "deleting '%s' failed"
+msgstr "'%s' 삭제가 실패했습니다"
+
+#: builtin/remote.c:747
+#, c-format
+msgid "creating '%s' failed"
+msgstr "'%s' 만들기가 실패했습니다"
+
+#: builtin/remote.c:813
+msgid ""
+"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n"
+"to delete it, use:"
+msgid_plural ""
+"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n"
+"to delete them, use:"
+msgstr[0] ""
+"알림: 레퍼런스/리모트/ 계층 구조 밖에 있는 일부 브랜치가 제거되지 않았습니다.\n"
+"삭제하려면 다음을 사용하십시오:"
+
+#: builtin/remote.c:928
+#, c-format
+msgid " new (next fetch will store in remotes/%s)"
+msgstr " 새 항목 (다음 가져오기는 remotes/%s 아래 저장됩니다)"
+
+#: builtin/remote.c:931
+msgid " tracked"
+msgstr " 추적됨"
+
+#: builtin/remote.c:933
+msgid " stale (use 'git remote prune' to remove)"
+msgstr " 오래됨 (제거하려면 'git remote prune'을 사용하십시오)"
+
+#: builtin/remote.c:935
+msgid " ???"
+msgstr " ???"
+
+#: builtin/remote.c:976
+#, c-format
+msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
+msgstr "잘못된 branch.%s.merge 값. 여러 개 브랜치로 리베이스할 수 없습니다"
+
+#: builtin/remote.c:983
+#, c-format
+msgid "rebases onto remote %s"
+msgstr "리베이스: 리모트 %s"
+
+#: builtin/remote.c:986
+#, c-format
+msgid " merges with remote %s"
+msgstr " 병합: 리모트 %s"
+
+#: builtin/remote.c:987
+msgid "    and with remote"
+msgstr "    그리고 리모트"
+
+#: builtin/remote.c:989
+#, c-format
+msgid "merges with remote %s"
+msgstr "병합: 리모트 %s"
+
+#: builtin/remote.c:990
+msgid "   and with remote"
+msgstr "   그리고 리모트"
+
+#: builtin/remote.c:1036
+msgid "create"
+msgstr "만들기"
+
+#: builtin/remote.c:1039
+msgid "delete"
+msgstr "삭제"
+
+#: builtin/remote.c:1043
+msgid "up to date"
+msgstr "최신 상태"
+
+#: builtin/remote.c:1046
+msgid "fast-forwardable"
+msgstr "정방향 진행 가능"
+
+#: builtin/remote.c:1049
+msgid "local out of date"
+msgstr "로컬이 뒤떨어짐"
+
+#: builtin/remote.c:1056
+#, c-format
+msgid "    %-*s forces to %-*s (%s)"
+msgstr "    %-*s에서 %-*s(으)로 강제 (%s)"
+
+#: builtin/remote.c:1059
+#, c-format
+msgid "    %-*s pushes to %-*s (%s)"
+msgstr "    %-*s에서 %-*s(으)로 푸시 (%s)"
+
+#: builtin/remote.c:1063
+#, c-format
+msgid "    %-*s forces to %s"
+msgstr "    %-*s에서 %s(으)로 강제"
+
+#: builtin/remote.c:1066
+#, c-format
+msgid "    %-*s pushes to %s"
+msgstr "    %-*s에서 %s(으)로 푸시"
+
+#: builtin/remote.c:1134
+msgid "do not query remotes"
+msgstr "리모트에 질의하지 않습니다"
+
+#: builtin/remote.c:1161
+#, c-format
+msgid "* remote %s"
+msgstr "* 리모트 %s"
+
+#: builtin/remote.c:1162
+#, c-format
+msgid "  Fetch URL: %s"
+msgstr "  가져오기 URL: %s"
+
+#: builtin/remote.c:1163 builtin/remote.c:1314
+msgid "(no URL)"
+msgstr "(URL 없음)"
+
+#: builtin/remote.c:1172 builtin/remote.c:1174
+#, c-format
+msgid "  Push  URL: %s"
+msgstr "  푸시  URL: %s"
+
+#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180
+#, c-format
+msgid "  HEAD branch: %s"
+msgstr "  HEAD 브랜치: %s"
+
+#: builtin/remote.c:1182
+#, c-format
+msgid ""
+"  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
+msgstr "  HEAD 브랜치 (리모트 HEAD는 애매하고, 다음 중 하나일 수 있습니다):\n"
+
+#: builtin/remote.c:1194
+#, c-format
+msgid "  Remote branch:%s"
+msgid_plural "  Remote branches:%s"
+msgstr[0] "  리모트 브랜치:%s"
+
+#: builtin/remote.c:1197 builtin/remote.c:1224
+msgid " (status not queried)"
+msgstr " (상태를 질의하지 않음)"
+
+#: builtin/remote.c:1206
+msgid "  Local branch configured for 'git pull':"
+msgid_plural "  Local branches configured for 'git pull':"
+msgstr[0] "  'git pull'에 사용할 로컬 브랜치를 설정:"
+
+#: builtin/remote.c:1214
+msgid "  Local refs will be mirrored by 'git push'"
+msgstr "  로컬 레퍼런스를 'git push'로 미러링할 예정"
+
+#: builtin/remote.c:1221
+#, c-format
+msgid "  Local ref configured for 'git push'%s:"
+msgid_plural "  Local refs configured for 'git push'%s:"
+msgstr[0] "  로컬 레퍼런스를 'git push'로 미러링%s:"
+
+#: builtin/remote.c:1242
+msgid "set refs/remotes/<name>/HEAD according to remote"
+msgstr "레퍼런스/리모트/<이름>/HEAD 값을 리모트에 맞게 설정합니다"
+
+#: builtin/remote.c:1244
+msgid "delete refs/remotes/<name>/HEAD"
+msgstr "레퍼런스/리모트/<이름>/HEAD 값을 삭제합니다"
+
+#: builtin/remote.c:1259
+msgid "Cannot determine remote HEAD"
+msgstr "리모트 HEAD를 결정할 수 없습니다"
+
+#: builtin/remote.c:1261
+msgid "Multiple remote HEAD branches. Please choose one explicitly with:"
+msgstr "리모트 HEAD 브랜치가 여러개입니다. 다음 중 하나를 명시적으로 지정하십시오:"
+
+#: builtin/remote.c:1271
+#, c-format
+msgid "Could not delete %s"
+msgstr "%s을(를) 삭제할 수 없습니다"
+
+#: builtin/remote.c:1279
+#, c-format
+msgid "Not a valid ref: %s"
+msgstr "올바른 레퍼런스가 아닙니다: %s"
+
+#: builtin/remote.c:1281
+#, c-format
+msgid "Could not setup %s"
+msgstr "%s을(를) 설정할 수 없습니다"
+
+#: builtin/remote.c:1299
+#, c-format
+msgid " %s will become dangling!"
+msgstr " %s의 연결이 끊어집니다!"
+
+#: builtin/remote.c:1300
+#, c-format
+msgid " %s has become dangling!"
+msgstr " %s의 연결이 끊어졌습니다!"
+
+#: builtin/remote.c:1310
+#, c-format
+msgid "Pruning %s"
+msgstr "잘라냄: %s"
+
+#: builtin/remote.c:1311
+#, c-format
+msgid "URL: %s"
+msgstr "URL: %s"
+
+#: builtin/remote.c:1327
+#, c-format
+msgid " * [would prune] %s"
+msgstr " * [잘라낼 예정] %s"
+
+#: builtin/remote.c:1330
+#, c-format
+msgid " * [pruned] %s"
+msgstr " * [잘라냄] %s"
+
+#: builtin/remote.c:1375
+msgid "prune remotes after fetching"
+msgstr "가져온 후에 리모트를 잘라냅니다"
+
+#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566
+#, c-format
+msgid "No such remote '%s'"
+msgstr "그런 리모트가 없습니다 ('%s')"
+
+#: builtin/remote.c:1461
+msgid "add branch"
+msgstr "브랜치를 추가합니다"
+
+#: builtin/remote.c:1468
+msgid "no remote specified"
+msgstr "리모트를 지정하지 않았습니다"
+
+#: builtin/remote.c:1485
+msgid "query push URLs rather than fetch URLs"
+msgstr "가져오기 URL이 아니라 푸시 URL을 질의합니다"
+
+#: builtin/remote.c:1487
+msgid "return all URLs"
+msgstr "모든 URL을 리턴합니다"
+
+#: builtin/remote.c:1515
+#, c-format
+msgid "no URLs configured for remote '%s'"
+msgstr "'%s' 리모트에 대한 URL을 설정하지 않았습니다"
+
+#: builtin/remote.c:1541
+msgid "manipulate push URLs"
+msgstr "푸시 URL을 지정합니다"
+
+#: builtin/remote.c:1543
+msgid "add URL"
+msgstr "URL을 추가합니다"
+
+#: builtin/remote.c:1545
+msgid "delete URLs"
+msgstr "URL을 삭제합니다"
+
+#: builtin/remote.c:1552
+msgid "--add --delete doesn't make sense"
+msgstr "--add --delete 옵션을 둘다 쓰면 안 됩니다"
+
+#: builtin/remote.c:1592
+#, c-format
+msgid "Invalid old URL pattern: %s"
+msgstr "잘못된 오래전 URL 패턴: %s"
+
+#: builtin/remote.c:1600
+#, c-format
+msgid "No such URL found: %s"
+msgstr "그런 URL이 없습니다: %s"
+
+#: builtin/remote.c:1602
+msgid "Will not delete all non-push URLs"
+msgstr "푸시용이 아닌 모든 URL을 삭제하지 않습니다"
+
+#: builtin/remote.c:1616
+msgid "be verbose; must be placed before a subcommand"
+msgstr "자세히 표시합니다 (하위 명령 앞에 와야 합니다)"
+
+#: builtin/repack.c:17
+msgid "git repack [<options>]"
+msgstr "git repack [<옵션>]"
+
+#: builtin/repack.c:159
+msgid "pack everything in a single pack"
+msgstr "하나의 묶음 안에 모두 묶습니다"
+
+#: builtin/repack.c:161
+msgid "same as -a, and turn unreachable objects loose"
+msgstr "-a와 동일하고, 접근 불가능 오브젝트를 느슨하게 바꿉니다"
+
+#: builtin/repack.c:164
+msgid "remove redundant packs, and run git-prune-packed"
+msgstr "여분의 묶음을 제거하고, git-prune-packed를 실행합니다"
+
+#: builtin/repack.c:166
+msgid "pass --no-reuse-delta to git-pack-objects"
+msgstr "git-pack-objects에 --no-reuse-delta 옵션을 넘깁니다"
+
+#: builtin/repack.c:168
+msgid "pass --no-reuse-object to git-pack-objects"
+msgstr "git-pack-objects에 --no-reuse-object 옵션을 넘깁니다"
+
+#: builtin/repack.c:170
+msgid "do not run git-update-server-info"
+msgstr "git-update-server-info를 실행하지 않습니다"
+
+#: builtin/repack.c:173
+msgid "pass --local to git-pack-objects"
+msgstr "git-pack-objects에 --local 옵션을 넘깁니다"
+
+#: builtin/repack.c:175
+msgid "write bitmap index"
+msgstr "비트맵 인덱스를 씁니다"
+
+#: builtin/repack.c:176
+msgid "approxidate"
+msgstr "대략의시각"
+
+#: builtin/repack.c:177
+msgid "with -A, do not loosen objects older than this"
+msgstr "-A에 추가로, 지정한 시각보다 오래된 오브젝트를 느슨하게 만들지 않습니다"
+
+#: builtin/repack.c:179
+msgid "size of the window used for delta compression"
+msgstr "델타 압축에 사용할 윈도우 크기"
+
+#: builtin/repack.c:180 builtin/repack.c:184
+msgid "bytes"
+msgstr "바이트수"
+
+#: builtin/repack.c:181
+msgid "same as the above, but limit memory size instead of entries count"
+msgstr "위와 동일하지만, 항목 수 대신 메모리 크기를 제한합니다"
+
+#: builtin/repack.c:183
+msgid "limits the maximum delta depth"
+msgstr "최대 델타 깊이를 제한합니다"
+
+#: builtin/repack.c:185
+msgid "maximum size of each packfile"
+msgstr "묶음 파일의 최대 크기"
+
+#: builtin/repack.c:187
+msgid "repack objects in packs marked with .keep"
+msgstr ".keep으로 표시된 묶음의 오브젝트를 다시 묶습니다"
+
+#: builtin/repack.c:197
+msgid "cannot delete packs in a precious-objects repo"
+msgstr "precious-objects 저장소의 묶음을 삭제할 수 없습니다"
+
+#: builtin/repack.c:381
+#, c-format
+msgid "removing '%s' failed"
+msgstr "'%s' 제거가 실패했습니다"
+
+#: builtin/replace.c:19
+msgid "git replace [-f] <object> <replacement>"
+msgstr "git replace [-f] <오브젝트> <대체이름>"
+
+#: builtin/replace.c:20
+msgid "git replace [-f] --edit <object>"
+msgstr "git replace [-f] --edit <오브젝트>"
+
+#: builtin/replace.c:21
+msgid "git replace [-f] --graft <commit> [<parent>...]"
+msgstr "git replace [-f] --graft <커밋> [<상위>...]"
+
+#: builtin/replace.c:22
+msgid "git replace -d <object>..."
+msgstr "git replace -d <오브젝트>..."
+
+#: builtin/replace.c:23
+msgid "git replace [--format=<format>] [-l [<pattern>]]"
+msgstr "git replace [--format=<형식>] [-l [<패턴>]]"
+
+#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391
+#, c-format
+msgid "Not a valid object name: '%s'"
+msgstr "올바른 오브젝트 이름이 아닙니다: '%s'"
+
+#: builtin/replace.c:355
+#, c-format
+msgid "bad mergetag in commit '%s'"
+msgstr "커밋 '%s'에 잘못된 병합태그"
+
+#: builtin/replace.c:357
+#, c-format
+msgid "malformed mergetag in commit '%s'"
+msgstr "커밋 '%s'에 잘못된 형식의 병합태그"
+
+#: builtin/replace.c:368
+#, c-format
+msgid ""
+"original commit '%s' contains mergetag '%s' that is discarded; use --edit "
+"instead of --graft"
+msgstr "본래 커밋 '%s'에 버려진 병합태그 '%s'이(가) 들어 있습니다. --graft 대신 --edit 옵션을 사용하십시오"
+
+#: builtin/replace.c:401
+#, c-format
+msgid "the original commit '%s' has a gpg signature."
+msgstr "본래 커밋 '%s'에 GPG 서명이 있습니다."
+
+#: builtin/replace.c:402
+msgid "the signature will be removed in the replacement commit!"
+msgstr "대체 커밋에서 서명을 제거합니다!"
+
+#: builtin/replace.c:408
+#, c-format
+msgid "could not write replacement commit for: '%s'"
+msgstr "다음에 대한 대체 커밋을 쓸 수 없습니다: '%s'"
+
+#: builtin/replace.c:432
+msgid "list replace refs"
+msgstr "대체 레퍼런스 목록을 표시합니다"
+
+#: builtin/replace.c:433
+msgid "delete replace refs"
+msgstr "대체 레퍼런스를 삭제합니다"
+
+#: builtin/replace.c:434
+msgid "edit existing object"
+msgstr "현재 오브젝트를 편집합니다"
+
+#: builtin/replace.c:435
+msgid "change a commit's parents"
+msgstr "커밋의 상위 항목을 바꿉니다"
+
+#: builtin/replace.c:436
+msgid "replace the ref if it exists"
+msgstr "레퍼런스가 있으면 대체합니다"
+
+#: builtin/replace.c:437
+msgid "do not pretty-print contents for --edit"
+msgstr "--edit에 대한 내용을 예쁘게 표시하지 않습니다"
+
+#: builtin/replace.c:438
+msgid "use this format"
+msgstr "이 형식을 사용합니다"
+
+#: builtin/rerere.c:12
+msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]"
+msgstr "git rerere [clear | forget <경로>... | status | remaining | diff | gc]"
+
+#: builtin/rerere.c:58
+msgid "register clean resolutions in index"
+msgstr "인덱스에 깔끔한 해결을 등록합니다"
+
+#: builtin/reset.c:26
+msgid ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
+msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<커밋>]"
+
+#: builtin/reset.c:27
+msgid "git reset [-q] <tree-ish> [--] <paths>..."
+msgstr "git reset [-q] <트리-따위> [--] <경로>..."
+
+#: builtin/reset.c:28
+msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
+msgstr "git reset --patch [<트리-따위>] [--] [<경로>...]"
+
+#: builtin/reset.c:34
+msgid "mixed"
+msgstr "혼합"
+
+#: builtin/reset.c:34
+msgid "soft"
+msgstr "소프트"
+
+#: builtin/reset.c:34
+msgid "hard"
+msgstr "하드"
+
+#: builtin/reset.c:34
+msgid "merge"
+msgstr "병합"
+
+#: builtin/reset.c:34
+msgid "keep"
+msgstr "유지"
+
+#: builtin/reset.c:74
+msgid "You do not have a valid HEAD."
+msgstr "올바른 HEAD가 없습니다."
+
+#: builtin/reset.c:76
+msgid "Failed to find tree of HEAD."
+msgstr "HEAD의 트리를 찾는데 실패했습니다."
+
+#: builtin/reset.c:82
+#, c-format
+msgid "Failed to find tree of %s."
+msgstr "%s의 트리를 찾는데 실패했습니다."
+
+#: builtin/reset.c:100
+#, c-format
+msgid "HEAD is now at %s"
+msgstr "HEAD의 현재 위치는 %s입니다"
+
+#: builtin/reset.c:183
+#, c-format
+msgid "Cannot do a %s reset in the middle of a merge."
+msgstr "병합 중에 %s 리셋을 할 수 없습니다."
+
+#: builtin/reset.c:276
+msgid "be quiet, only report errors"
+msgstr "간략히 표시, 오류만 표시합니다"
+
+#: builtin/reset.c:278
+msgid "reset HEAD and index"
+msgstr "HEAD와 인덱스를 리셋합니다"
+
+#: builtin/reset.c:279
+msgid "reset only HEAD"
+msgstr "HEAD만 리셋합니다"
+
+#: builtin/reset.c:281 builtin/reset.c:283
+msgid "reset HEAD, index and working tree"
+msgstr "HEAD, 인덱스, 작업폴더를 리셋합니다"
+
+#: builtin/reset.c:285
+msgid "reset HEAD but keep local changes"
+msgstr "HEAD를 리셋하지만 로컬 변경 사항을 남겨둡니다"
+
+#: builtin/reset.c:288
+msgid "record only the fact that removed paths will be added later"
+msgstr "제거한 경로를 나중에 추가한다는 사실만 기록합니다"
+
+#: builtin/reset.c:305
+#, c-format
+msgid "Failed to resolve '%s' as a valid revision."
+msgstr "'%s'을(를) 올바른 리비전으로 찾는데 실패했습니다."
+
+#: builtin/reset.c:313
+#, c-format
+msgid "Failed to resolve '%s' as a valid tree."
+msgstr "'%s'을(를) 올바른 트리로 찾는데 실패했습니다."
+
+#: builtin/reset.c:322
+msgid "--patch is incompatible with --{hard,mixed,soft}"
+msgstr "--patch 옵션은 --{hard,mixed,soft} 옵션과 호환되지 않습니다"
+
+#: builtin/reset.c:331
+msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
+msgstr "--mixed 옵션을 경로와 같이 쓰기는 제거될 예정입니다. 대신에 'git reset -- <경로>'를 사용하십시오."
+
+#: builtin/reset.c:333
+#, c-format
+msgid "Cannot do %s reset with paths."
+msgstr "경로와 같이 %s 리셋을 할 수 없습니다."
+
+#: builtin/reset.c:343
+#, c-format
+msgid "%s reset is not allowed in a bare repository"
+msgstr "%s 리셋은 간략한 저장소에서만 쓸 수 있습니다"
+
+#: builtin/reset.c:347
+msgid "-N can only be used with --mixed"
+msgstr "-N 옵션은 --mixed 옵션과 같이 써야만 합니다"
+
+#: builtin/reset.c:364
+msgid "Unstaged changes after reset:"
+msgstr "리셋 뒤에 스테이징하지 않은 변경 사항:"
+
+#: builtin/reset.c:370
+#, c-format
+msgid "Could not reset index file to revision '%s'."
+msgstr "인덱스 파일을 '%s' 리비전으로 리셋할 수 없습니다."
+
+#: builtin/reset.c:374
+msgid "Could not write new index file."
+msgstr "새 인덱스 파일을 쓸 수 없습니다."
+
+#: builtin/rev-list.c:354
+msgid "rev-list does not support display of notes"
+msgstr "rev-list는 노트 표시를 지원하지 않습니다"
+
+#: builtin/rev-parse.c:358
+msgid "git rev-parse --parseopt [<options>] -- [<args>...]"
+msgstr "git rev-parse --parseopt [<옵션>] -- [<인자>...]"
+
+#: builtin/rev-parse.c:363
+msgid "keep the `--` passed as an arg"
+msgstr "인자로 넘긴 `--`를 유지합니다"
+
+#: builtin/rev-parse.c:365
+msgid "stop parsing after the first non-option argument"
+msgstr "첫번째 옵션이 아닌 인자 뒤에 파싱을 중지합니다"
+
+#: builtin/rev-parse.c:368
+msgid "output in stuck long form"
+msgstr "stuck long 형식으로 출력합니다"
+
+#: builtin/rev-parse.c:499
+msgid ""
+"git rev-parse --parseopt [<options>] -- [<args>...]\n"
+"   or: git rev-parse --sq-quote [<arg>...]\n"
+"   or: git rev-parse [<options>] [<arg>...]\n"
+"\n"
+"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
+msgstr ""
+"git rev-parse --parseopt [<옵션>] -- [<인자>...]\n"
+"   or: git rev-parse --sq-quote [<인자>...]\n"
+"   or: git rev-parse [<옵션>] [<인자>...]\n"
+"\n"
+"첫번째 사용방법에 대해 자세히 알고 싶으면, \"git rev-parse --parseopt -h\"를\n"
+"실행해 보십시오."
+
+#: builtin/revert.c:22
+msgid "git revert [<options>] <commit-ish>..."
+msgstr "git revert [<옵션>] <커밋-따위>..."
+
+#: builtin/revert.c:23
+msgid "git revert <subcommand>"
+msgstr "git revert <하위명령>"
+
+#: builtin/revert.c:28
+msgid "git cherry-pick [<options>] <commit-ish>..."
+msgstr "git cherry-pick [<옵션>] <커밋-따위>..."
+
+#: builtin/revert.c:29
+msgid "git cherry-pick <subcommand>"
+msgstr "git cherry-pick <하위명령>"
+
+#: builtin/revert.c:71
+#, c-format
+msgid "%s: %s cannot be used with %s"
+msgstr "%s: %s은(는) %s와(과) 같이 쓸 수 없습니다"
+
+#: builtin/revert.c:80
+msgid "end revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 끝냅니다"
+
+#: builtin/revert.c:81
+msgid "resume revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 계속합니다"
+
+#: builtin/revert.c:82
+msgid "cancel revert or cherry-pick sequence"
+msgstr "되돌리기 또는 커밋 빼오기 연속을 취소합니다"
+
+#: builtin/revert.c:83
+msgid "don't automatically commit"
+msgstr "자동으로 커밋하지 않습니다"
+
+#: builtin/revert.c:84
+msgid "edit the commit message"
+msgstr "커밋 메시지를 편집합니다"
+
+#: builtin/revert.c:87
+msgid "parent number"
+msgstr "이전 커밋 번호"
+
+#: builtin/revert.c:89
+msgid "merge strategy"
+msgstr "병합 전략"
+
+#: builtin/revert.c:90
+msgid "option"
+msgstr "옵션"
+
+#: builtin/revert.c:91
+msgid "option for merge strategy"
+msgstr "병합 전략 옵션"
+
+#: builtin/revert.c:104
+msgid "append commit name"
+msgstr "커밋 이름을 뒤에 붙입니다"
+
+#: builtin/revert.c:106
+msgid "preserve initially empty commits"
+msgstr "최초 빈 커밋을 유지합니다"
+
+#: builtin/revert.c:107
+msgid "allow commits with empty messages"
+msgstr "빈 메시지로 커밋을 허용합니다"
+
+#: builtin/revert.c:108
+msgid "keep redundant, empty commits"
+msgstr "여분의 빈 커밋을 유지합니다"
+
+#: builtin/revert.c:112
+msgid "program error"
+msgstr "프로그램 오류"
+
+#: builtin/revert.c:197
+msgid "revert failed"
+msgstr "되돌리기 실패"
+
+#: builtin/revert.c:212
+msgid "cherry-pick failed"
+msgstr "cherry-pick 실패"
+
+#: builtin/rm.c:17
+msgid "git rm [<options>] [--] <file>..."
+msgstr "git rm [<옵션>] [--] <파일>..."
+
+#: builtin/rm.c:65
+msgid ""
+"the following submodule (or one of its nested submodules)\n"
+"uses a .git directory:"
+msgid_plural ""
+"the following submodules (or one of their nested submodules)\n"
+"use a .git directory:"
+msgstr[0] ""
+"다음 하위 모듈이 (또는 그 내부 하위 모듈이) .git\n"
+"디렉터리를 사용합니다:"
+
+#: builtin/rm.c:71
+msgid ""
+"\n"
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr "\n(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
+
+#: builtin/rm.c:230
+msgid ""
+"the following file has staged content different from both the\n"
+"file and the HEAD:"
+msgid_plural ""
+"the following files have staged content different from both the\n"
+"file and the HEAD:"
+msgstr[0] ""
+"다음 파일에 파일과 HEAD 모두 다른 스테이징한 내용이\n"
+"있습니다:"
+
+#: builtin/rm.c:235
+msgid ""
+"\n"
+"(use -f to force removal)"
+msgstr ""
+"\n"
+"(강제로 제거하려면 -f 옵션을 사용하십시오)"
+
+#: builtin/rm.c:239
+msgid "the following file has changes staged in the index:"
+msgid_plural "the following files have changes staged in the index:"
+msgstr[0] "다음 파일이 인덱스에 스테이징한 변경 사항이 있습니다:"
+
+#: builtin/rm.c:243 builtin/rm.c:254
+msgid ""
+"\n"
+"(use --cached to keep the file, or -f to force removal)"
+msgstr "\n(파일을 유지하려면 --cached 옵션, 강제로 제거하려면 -f 옵션을 사용하십시오)"
+
+#: builtin/rm.c:251
+msgid "the following file has local modifications:"
+msgid_plural "the following files have local modifications:"
+msgstr[0] "다음 파일에 로컬 수정 사항이 있습니다:"
+
+#: builtin/rm.c:269
+msgid "do not list removed files"
+msgstr "제거한 파일 목록을 표시하지 않습니다"
+
+#: builtin/rm.c:270
+msgid "only remove from the index"
+msgstr "인덱스에서만 제거합니다"
+
+#: builtin/rm.c:271
+msgid "override the up-to-date check"
+msgstr "최신 버전 확인을 하지 않습니다"
+
+#: builtin/rm.c:272
+msgid "allow recursive removal"
+msgstr "재귀적 제거를 허용합니다"
+
+#: builtin/rm.c:274
+msgid "exit with a zero status even if nothing matched"
+msgstr "아무 것도 일치하지 않으면 상태 0번으로 끝납니다"
+
+#: builtin/rm.c:317
+msgid "Please, stage your changes to .gitmodules or stash them to proceed"
+msgstr "계속하려면 .gitmodules의 변경 사항을 스테이징하거나 stash하십시오"
+
+#: builtin/rm.c:335
+#, c-format
+msgid "not removing '%s' recursively without -r"
+msgstr "-r 옵션이 없으면 재귀적으로 '%s'을(를) 제거하지 않습니다"
+
+#: builtin/rm.c:374
+#, c-format
+msgid "git rm: unable to remove %s"
+msgstr "git rm: %s을(를) 제거할 수 없습니다"
+
+#: builtin/send-pack.c:18
+msgid ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-"
+"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> "
+"[<ref>...]\n"
+"  --all and explicit <ref> specification are mutually exclusive."
+msgstr ""
+"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<호스트>:]<디렉터리> [<레퍼런스>...]\n"
+"  --all 옵션과 명시적인 <레퍼런스> 명세 중 하나만 사용할 수 있습니다."
+
+#: builtin/send-pack.c:160
+msgid "remote name"
+msgstr "리모트 이름"
+
+#: builtin/send-pack.c:171
+msgid "use stateless RPC protocol"
+msgstr "상태 없는 RPC 프로토콜을 사용합니다"
+
+#: builtin/send-pack.c:172
+msgid "read refs from stdin"
+msgstr "표준 입력에서 레퍼런스를 읽습니다"
+
+#: builtin/send-pack.c:173
+msgid "print status from remote helper"
+msgstr "리모트 도움 프로그램의 상태를 표시합니다"
+
+#: builtin/shortlog.c:13
+msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"
+msgstr "git shortlog [<옵션>] [<리비전-범위>] [[--] [<경로>...]]"
+
+#: builtin/shortlog.c:131
+#, c-format
+msgid "Missing author: %s"
+msgstr "작성자 정보가 없습니다: %s"
+
+#: builtin/shortlog.c:230
+msgid "sort output according to the number of commits per author"
+msgstr "작성자별 커밋 수에 따라 정렬합니다"
+
+#: builtin/shortlog.c:232
+msgid "Suppress commit descriptions, only provides commit count"
+msgstr "커밋 설명을 생략하고, 커밋 수만 표시합니다"
+
+#: builtin/shortlog.c:234
+msgid "Show the email address of each author"
+msgstr "작성자의 전자메일 주소를 표시합니다"
+
+#: builtin/shortlog.c:235
+msgid "w[,i1[,i2]]"
+msgstr "w[,i1[,i2]]"
+
+#: builtin/shortlog.c:236
+msgid "Linewrap output"
+msgstr "줄바꿈 출력"
+
+#: builtin/show-branch.c:10
+msgid ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"
+msgstr ""
+"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n"
+"\t\t[--current] [--color[=<시각>] | --no-color] [--sparse]\n"
+"\t\t[--more=<n> | --list | --independent | --merge-base]\n"
+"\t\t[--no-name | --sha1-name] [--topics] [(<리비전> | <glob>)...]"
+
+#: builtin/show-branch.c:14
+msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"
+msgstr "git show-branch (-g | --reflog)[=<n>[,<베이스>]] [--list] [<레퍼런스>]"
+
+#: builtin/show-branch.c:640
+msgid "show remote-tracking and local branches"
+msgstr "리모트 추적 및 로컬 브랜치를 표시합니다"
+
+#: builtin/show-branch.c:642
+msgid "show remote-tracking branches"
+msgstr "리모트 추적 브랜치를 표시합니다"
+
+#: builtin/show-branch.c:644
+msgid "color '*!+-' corresponding to the branch"
+msgstr "브랜치에 따른 '*!+-' 표시에 색을 입힙니다"
+
+#: builtin/show-branch.c:646
+msgid "show <n> more commits after the common ancestor"
+msgstr "공통 이전 커밋 뒤의 <n>개의 커밋을 표시합니다"
+
+#: builtin/show-branch.c:648
+msgid "synonym to more=-1"
+msgstr "--more=-1 옵션과 동일"
+
+#: builtin/show-branch.c:649
+msgid "suppress naming strings"
+msgstr "이름 문자열을 표시하지 않습니다"
+
+#: builtin/show-branch.c:651
+msgid "include the current branch"
+msgstr "현재 브랜치를 포함"
+
+#: builtin/show-branch.c:653
+msgid "name commits with their object names"
+msgstr "커밋의 이름을 그 오브젝트 이름으로 붙입니다"
+
+#: builtin/show-branch.c:655
+msgid "show possible merge bases"
+msgstr "가능한 병합 기준점을 표시합니다"
+
+#: builtin/show-branch.c:657
+msgid "show refs unreachable from any other ref"
+msgstr "다른 어떤 레퍼런스에서도 접근 불가능한 레퍼런스를 표시합니다"
+
+#: builtin/show-branch.c:659
+msgid "show commits in topological order"
+msgstr "위상 순서에 따라 커밋을 표시합니다"
+
+#: builtin/show-branch.c:662
+msgid "show only commits not on the first branch"
+msgstr "첫 브랜치에 없는 커밋만 표시합니다"
+
+#: builtin/show-branch.c:664
+msgid "show merges reachable from only one tip"
+msgstr "하나의 끝에서만 접근 가능한 병합을 표시합니다"
+
+#: builtin/show-branch.c:666
+msgid "topologically sort, maintaining date order where possible"
+msgstr "가능하면 시간 순서를 유지하면서 위상 순서로 정렬"
+
+#: builtin/show-branch.c:669
+msgid "<n>[,<base>]"
+msgstr "<n>[,<베이스>]"
+
+#: builtin/show-branch.c:670
+msgid "show <n> most recent ref-log entries starting at base"
+msgstr "기준부터 시작해 최대 <n>개의 최근 ref-log 항목을 표시합니다"
+
+#: builtin/show-ref.c:10
+msgid ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"
+msgstr ""
+"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --"
+"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<패턴>...]"
+
+#: builtin/show-ref.c:11
+msgid "git show-ref --exclude-existing[=<pattern>]"
+msgstr "git show-ref --exclude-existing[=<패턴>]"
+
+#: builtin/show-ref.c:165
+msgid "only show tags (can be combined with heads)"
+msgstr "태그만 표시 (헤드와 결합 가능)"
+
+#: builtin/show-ref.c:166
+msgid "only show heads (can be combined with tags)"
+msgstr "헤드만 표시 (태그와 결합 가능)"
+
+#: builtin/show-ref.c:167
+msgid "stricter reference checking, requires exact ref path"
+msgstr "더 엄격한 레퍼런스 검사, 정확히 하나의 레퍼런스 경로 필요"
+
+#: builtin/show-ref.c:170 builtin/show-ref.c:172
+msgid "show the HEAD reference, even if it would be filtered out"
+msgstr "HEAD 레퍼런스를 표시합니다 (필터링되서 제외되더라도)"
+
+#: builtin/show-ref.c:174
+msgid "dereference tags into object IDs"
+msgstr "태그를 오브젝트 ID로 따라갑니다"
+
+#: builtin/show-ref.c:176
+msgid "only show SHA1 hash using <n> digits"
+msgstr "SHA-1 표시에 <n>개의 숫자만 사용합니다"
+
+#: builtin/show-ref.c:180
+msgid "do not print results to stdout (useful with --verify)"
+msgstr "표준 출력에 결과를 표시하지 않습니다 (--verify 옵션과 사용하면 좋음)"
+
+#: builtin/show-ref.c:182
+msgid "show refs from stdin that aren't in local repository"
+msgstr "로컬 저장소에 없는 레퍼런스를 표준 입력에서 읽어 표시합니다"
+
+#: builtin/stripspace.c:17
+msgid "git stripspace [-s | --strip-comments]"
+msgstr "git stripspace [-s | --strip-comments]"
+
+#: builtin/stripspace.c:18
+msgid "git stripspace [-c | --comment-lines]"
+msgstr "git stripspace [-c | --comment-lines]"
+
+#: builtin/stripspace.c:35
+msgid "skip and remove all lines starting with comment character"
+msgstr "주석 문자로 시작하는 모든 줄을 건너뛰고 제거합니다"
+
+#: builtin/stripspace.c:38
+msgid "prepend comment character and blank to each line"
+msgstr "각 줄의 앞에 주석 문자를 붙이고 빈 줄로 만듭니다"
+
+#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167
+msgid "alternative anchor for relative paths"
+msgstr "상대 경로에 사용할 또다른 기준"
+
+#: builtin/submodule--helper.c:84
+msgid "git submodule--helper list [--prefix=<path>] [<path>...]"
+msgstr "git submodule--helper list [--prefix=<경로>] [<경로>...]"
+
+#: builtin/submodule--helper.c:114
+msgid "git submodule--helper name <path>"
+msgstr "git submodule--helper name <경로>"
+
+#: builtin/submodule--helper.c:120
+#, c-format
+msgid "no submodule mapping found in .gitmodules for path '%s'"
+msgstr "경로 '%s'에 대해 .gitmodules에 있는 하위모듈 매핑이 없습니다"
+
+#: builtin/submodule--helper.c:170
+msgid "where the new submodule will be cloned to"
+msgstr "새 하위 모듈을 복제할 대상 위치"
+
+#: builtin/submodule--helper.c:173
+msgid "name of the new submodule"
+msgstr "새 하위 모듈 이름"
+
+#: builtin/submodule--helper.c:176
+msgid "url where to clone the submodule from"
+msgstr "하위 모듈을 복제해 올 URL"
+
+#: builtin/submodule--helper.c:182
+msgid "depth for shallow clones"
+msgstr "얕은 복제에 사용할 깊이"
+
+#: builtin/submodule--helper.c:188
+msgid ""
+"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference "
+"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]"
+msgstr ""
+"git submodule--helper clone [--prefix=<경로>] [--quiet] [--reference <저장소"
+">] [--name <이름>] [--url <URL>][--depth <깊이>] [--] [<경로>...]"
+
+#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208
+#: builtin/submodule--helper.c:216
+#, c-format
+msgid "could not create directory '%s'"
+msgstr "'%s' 디렉터리를 만들 수 없습니다"
+
+#: builtin/submodule--helper.c:204
+#, c-format
+msgid "clone of '%s' into submodule path '%s' failed"
+msgstr "'%s'에서 하위 모듈 경로 '%s'에 복제하는데 실패했습니다"
+
+#: builtin/submodule--helper.c:227
+#, c-format
+msgid "cannot open file '%s'"
+msgstr "'%s' 파일을 열 수 없습니다"
+
+#: builtin/submodule--helper.c:232
+#, c-format
+msgid "could not close file %s"
+msgstr "%s 파일을 닫을 수 없습니다"
+
+#: builtin/submodule--helper.c:247
+#, c-format
+msgid "could not get submodule directory for '%s'"
+msgstr "'%s'에 대한 하위 모듈 디렉터리를 가져올 수 없습니다"
+
+#: builtin/submodule--helper.c:273
+msgid "fatal: submodule--helper subcommand must be called with a subcommand"
+msgstr ""
+"치명적 이상: submodule--helper 하위 명령은 하위 명령으로 호출해야 합니다"
+
+#: builtin/submodule--helper.c:280
+#, c-format
+msgid "fatal: '%s' is not a valid submodule--helper subcommand"
+msgstr "치명적 이상: '%s'은(는) 올바른 submodule--helper 하위 명령이 아닙니다"
+
+#: builtin/symbolic-ref.c:7
+msgid "git symbolic-ref [<options>] <name> [<ref>]"
+msgstr "git symbolic-ref [<옵션>] <이름> [<레퍼런스>]"
+
+#: builtin/symbolic-ref.c:8
+msgid "git symbolic-ref -d [-q] <name>"
+msgstr "git symbolic-ref -d [-q] <이름>"
+
+#: builtin/symbolic-ref.c:40
+msgid "suppress error message for non-symbolic (detached) refs"
+msgstr "심볼이 아닌 (분리된) 레퍼런스에 대해 에러 메시지를 표시하지 않습니다"
+
+#: builtin/symbolic-ref.c:41
+msgid "delete symbolic ref"
+msgstr "심볼릭 레퍼런스를 삭제합니다"
+
+#: builtin/symbolic-ref.c:42
+msgid "shorten ref output"
+msgstr "레퍼런스 출력을 줄입니다"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason"
+msgstr "이유"
+
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362
+msgid "reason of the update"
+msgstr "업데이트의 이유"
+
+#: builtin/tag.c:23
+msgid ""
+"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> "
+"[<head>]"
+msgstr ""
+"git tag [-a | -s | -u <키-ID>] [-f] [-m <메시지> | -F <파일>] <태그이름>\n"
+"\t\t[<헤드>]"
+
+#: builtin/tag.c:24
+msgid "git tag -d <tagname>..."
+msgstr "git tag -d <태그이름>..."
+
+#: builtin/tag.c:25
+msgid ""
+"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n"
+"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"
+msgstr ""
+"git tag -l [-n[<개수>]] [--contains <커밋>] [--points-at <오브젝트>]\n"
+"\t\t[--format=<형식>] [--[no-]merged [<커밋>]] [<패턴>...]"
+
+#: builtin/tag.c:27
+msgid "git tag -v <tagname>..."
+msgstr "git tag -v <태그이름>..."
+
+#: builtin/tag.c:80
+#, c-format
+msgid "tag name too long: %.*s..."
+msgstr "태그 이름이 너무 깁니다: %.*s..."
+
+#: builtin/tag.c:85
+#, c-format
+msgid "tag '%s' not found."
+msgstr "'%s' 태그가 없습니다."
+
+#: builtin/tag.c:100
+#, c-format
+msgid "Deleted tag '%s' (was %s)\n"
+msgstr "'%s' 태그 삭제함 (과거 %s)\n"
+
+#: builtin/tag.c:112
+#, c-format
+msgid "could not verify the tag '%s'"
+msgstr "'%s' 태그를 검증할 수 없습니다"
+
+#: builtin/tag.c:122
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be ignored.\n"
+msgstr ""
+"\n"
+"다음 태그에 대한 메시지를 쓰십시오:\n"
+"  %s\n"
+"'%c' 문자로 시작하는 줄은 무시됩니다.\n"
+
+#: builtin/tag.c:126
+#, c-format
+msgid ""
+"\n"
+"Write a message for tag:\n"
+"  %s\n"
+"Lines starting with '%c' will be kept; you may remove them yourself if you "
+"want to.\n"
+msgstr ""
+"\n"
+"다음 태그에 대한 메시지를 쓰십시오:\n"
+"  %s\n"
+"'%c' 문자로 시작하는 줄은 유지됩니다. 제거하려면 직접 지워야 합니다.\n"
+
+#: builtin/tag.c:199
+msgid "unable to sign the tag"
+msgstr "태그에 서명할 수 없습니다"
+
+#: builtin/tag.c:201
+msgid "unable to write tag file"
+msgstr "태그 파일을 쓸 수 없습니다"
+
+#: builtin/tag.c:226
+msgid "bad object type."
+msgstr "잘못된 오브젝트 종류."
+
+#: builtin/tag.c:239
+msgid "tag header too big."
+msgstr "태그 헤더가 너무 큽니다."
+
+#: builtin/tag.c:275
+msgid "no tag message?"
+msgstr "태그 메시지 없음?"
+
+#: builtin/tag.c:281
+#, c-format
+msgid "The tag message has been left in %s\n"
+msgstr "태그 메시지가 %s 파일에 남아 있습니다\n"
+
+#: builtin/tag.c:339
+msgid "list tag names"
+msgstr "태그 이름 목록을 표시합니다"
+
+#: builtin/tag.c:341
+msgid "print <n> lines of each tag message"
+msgstr "각 태그 메시지의 <n>줄을 표시합니다"
+
+#: builtin/tag.c:343
+msgid "delete tags"
+msgstr "태그를 삭제합니다"
+
+#: builtin/tag.c:344
+msgid "verify tags"
+msgstr "태그를 검증합니다"
+
+#: builtin/tag.c:346
+msgid "Tag creation options"
+msgstr "태그 만들기 옵션"
+
+#: builtin/tag.c:348
+msgid "annotated tag, needs a message"
+msgstr "주석 달린 태그, 메시지가 필요합니다"
+
+#: builtin/tag.c:350
+msgid "tag message"
+msgstr "태그 메시지"
+
+#: builtin/tag.c:352
+msgid "annotated and GPG-signed tag"
+msgstr "주석 달리고 GPG 서명한 태그"
+
+#: builtin/tag.c:356
+msgid "use another key to sign the tag"
+msgstr "태그를 서명하는데 지정한 키를 사용합니다"
+
+#: builtin/tag.c:357
+msgid "replace the tag if exists"
+msgstr "태그가 있으면 바꿉니다"
+
+#: builtin/tag.c:358 builtin/update-ref.c:368
+msgid "create a reflog"
+msgstr "reflog를 만듭니다"
+
+#: builtin/tag.c:360
+msgid "Tag listing options"
+msgstr "태그 목록 보기 옵션"
+
+#: builtin/tag.c:361
+msgid "show tag list in columns"
+msgstr "태그 목록을 여러 열로 표시합니다"
+
+#: builtin/tag.c:362 builtin/tag.c:363
+msgid "print only tags that contain the commit"
+msgstr "해당 커밋이 들어 있는 태그만 표시합니다"
+
+#: builtin/tag.c:364
+msgid "print only tags that are merged"
+msgstr "병합된 태그만 표시합니다"
+
+#: builtin/tag.c:365
+msgid "print only tags that are not merged"
+msgstr "병합되지 않은 태그만 표시합니다"
+
+#: builtin/tag.c:370
+msgid "print only tags of the object"
+msgstr "해당 오브젝트의 태그만 표시합니다"
+
+#: builtin/tag.c:399
+msgid "--column and -n are incompatible"
+msgstr "--column 및 -n 옵션은 호환되지 않습니다"
+
+#: builtin/tag.c:419
+msgid "-n option is only allowed with -l."
+msgstr "-n 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:421
+msgid "--contains option is only allowed with -l."
+msgstr "--contains 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:423
+msgid "--points-at option is only allowed with -l."
+msgstr "--points-at 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:425
+msgid "--merged and --no-merged option are only allowed with -l"
+msgstr "--merged 및 --no-merged 옵션은 -l 옵션과 같이 써야 합니다."
+
+#: builtin/tag.c:433
+msgid "only one -F or -m option is allowed."
+msgstr "하나의 -F 또는 -m 옵션만 쓸 수 있습니다."
+
+#: builtin/tag.c:453
+msgid "too many params"
+msgstr "파라미터가 너무 많습니다"
+
+#: builtin/tag.c:459
+#, c-format
+msgid "'%s' is not a valid tag name."
+msgstr "'%s'은9는) 올바른 태그 이름이 아닙니다."
+
+#: builtin/tag.c:464
+#, c-format
+msgid "tag '%s' already exists"
+msgstr "태그 '%s'이(가) 이미 있습니다"
+
+#: builtin/tag.c:489
+#, c-format
+msgid "Updated tag '%s' (was %s)\n"
+msgstr "태그 '%s' 업데이트 (과거 %s)\n"
+
+#: builtin/unpack-objects.c:490
+msgid "Unpacking objects"
+msgstr "오브젝트 묶음 푸는 중"
+
+#: builtin/update-index.c:70
+#, c-format
+msgid "failed to create directory %s"
+msgstr "%s 디렉터리 만들기 실패했습니다"
+
+#: builtin/update-index.c:76
+#, c-format
+msgid "failed to stat %s"
+msgstr "%s에 stat()하는데 실패했습니다"
+
+#: builtin/update-index.c:86
+#, c-format
+msgid "failed to create file %s"
+msgstr "%s 파일을 만드는데 실패했습니다"
+
+#: builtin/update-index.c:94
+#, c-format
+msgid "failed to delete file %s"
+msgstr "%s 파일을 삭제하는데 실패했습니다"
+
+#: builtin/update-index.c:101 builtin/update-index.c:203
+#, c-format
+msgid "failed to delete directory %s"
+msgstr "%s 디렉터리를 삭제하는데 실패했습니다"
+
+#: builtin/update-index.c:124
+#, c-format
+msgid "Testing "
+msgstr "테스트중 "
+
+#: builtin/update-index.c:136
+msgid "directory stat info does not change after adding a new file"
+msgstr "새 파일을 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:149
+msgid "directory stat info does not change after adding a new directory"
+msgstr "새 디렉터리를 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:162
+msgid "directory stat info changes after updating a file"
+msgstr "파일을 업데이트한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:173
+msgid "directory stat info changes after adding a file inside subdirectory"
+msgstr "하위 디렉터리에 파일을 추가한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:184
+msgid "directory stat info does not change after deleting a file"
+msgstr "파일을 삭제한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:197
+msgid "directory stat info does not change after deleting a directory"
+msgstr "디렉터리를 삭제한 후에 디렉터리 정보가 바뀌지 않았습니다"
+
+#: builtin/update-index.c:204
+msgid " OK"
+msgstr " 오케이"
+
+#: builtin/update-index.c:564
+msgid "git update-index [<options>] [--] [<file>...]"
+msgstr "git update-index [<옵션>] [--] [<파일>...]"
+
+#: builtin/update-index.c:918
+msgid "continue refresh even when index needs update"
+msgstr "인덱스에 업데이트가 필요하더라도 새로 고침을 계속합니다"
+
+#: builtin/update-index.c:921
+msgid "refresh: ignore submodules"
+msgstr "새로 고침: 하위 모듈 무시"
+
+#: builtin/update-index.c:924
+msgid "do not ignore new files"
+msgstr "새 파일을 무시할 수 않습니다"
+
+#: builtin/update-index.c:926
+msgid "let files replace directories and vice-versa"
+msgstr "디렉터리를 파일로, 또는 그 반대로 바꿀 수 있게 허용합니다"
+
+#: builtin/update-index.c:928
+msgid "notice files missing from worktree"
+msgstr "작업폴더에서 알림 파일이 없습니다"
+
+#: builtin/update-index.c:930
+msgid "refresh even if index contains unmerged entries"
+msgstr "인덱스에 병합하지 않은 항목이 있어도 새로 고칩니다"
+
+#: builtin/update-index.c:933
+msgid "refresh stat information"
+msgstr "파일 정보를 새로 고칩니다"
+
+#: builtin/update-index.c:937
+msgid "like --refresh, but ignore assume-unchanged setting"
+msgstr "--refresh와 동일하지만, assume-unchanged 설정을 무시합니다"
+
+#: builtin/update-index.c:941
+msgid "<mode>,<object>,<path>"
+msgstr "<모드>,<오브젝트>,<경로>"
+
+#: builtin/update-index.c:942
+msgid "add the specified entry to the index"
+msgstr "지정한 항목을 인덱스에 추가합니다"
+
+#: builtin/update-index.c:946
+msgid "(+/-)x"
+msgstr "(+/-)x"
+
+#: builtin/update-index.c:947
+msgid "override the executable bit of the listed files"
+msgstr "목록의 파일에서 실행 가능 비트를 바꿉니다"
+
+#: builtin/update-index.c:951
+msgid "mark files as \"not changing\""
+msgstr "파일을 \"바꾸지 않음\"으로 표시합니다"
+
+#: builtin/update-index.c:954
+msgid "clear assumed-unchanged bit"
+msgstr "바꾸지 않음으로 가정 (assumed-unchanged) 비트를 지웁니다"
+
+#: builtin/update-index.c:957
+msgid "mark files as \"index-only\""
+msgstr "파일을 인덱스 전용으로 (\"index-only\") 표시합니다"
+
+#: builtin/update-index.c:960
+msgid "clear skip-worktree bit"
+msgstr "작업폴더 건너뛰기 (skip-worktree) 비트를 지웁니다"
+
+#: builtin/update-index.c:963
+msgid "add to index only; do not add content to object database"
+msgstr "인덱스에만 추가합니다. 내용을 오브젝트 데이터베이스에 추가하지 않습니다"
+
+#: builtin/update-index.c:965
+msgid "remove named paths even if present in worktree"
+msgstr "작업 폴더에 있어도 해당 경로를 제거합니다"
+
+#: builtin/update-index.c:967
+msgid "with --stdin: input lines are terminated by null bytes"
+msgstr "--stdin과 같이 사용: 입력 줄은 NUL 바이트로 끝납니다"
+
+#: builtin/update-index.c:969
+msgid "read list of paths to be updated from standard input"
+msgstr "표준 입력에서 업데이트할 경로의 목록을 읽습니다"
+
+#: builtin/update-index.c:973
+msgid "add entries from standard input to the index"
+msgstr "표준 입력에서 읽은 항목을 인덱스에 추가합니다"
+
+#: builtin/update-index.c:977
+msgid "repopulate stages #2 and #3 for the listed paths"
+msgstr "경로 목록에 대해 #2 및 #3 스테이징을 다시 합니다"
+
+#: builtin/update-index.c:981
+msgid "only update entries that differ from HEAD"
+msgstr "HEAD와 다른 항목만 업데이트합니다"
+
+#: builtin/update-index.c:985
+msgid "ignore files missing from worktree"
+msgstr "작업 폴더에 없는 파일을 무시합니다"
+
+#: builtin/update-index.c:988
+msgid "report actions to standard output"
+msgstr "표준 출력에 동작을 알립니다"
+
+#: builtin/update-index.c:990
+msgid "(for porcelains) forget saved unresolved conflicts"
+msgstr "저장한 해결되지 않은 충돌을 무시합니다 (사용자용 명령 용도)"
+
+#: builtin/update-index.c:994
+msgid "write index in this format"
+msgstr "인덱스를 이 형식으로 씁니다"
+
+#: builtin/update-index.c:996
+msgid "enable or disable split index"
+msgstr "스플릿 인덱스를 켜거나 끕니다"
+
+#: builtin/update-index.c:998
+msgid "enable/disable untracked cache"
+msgstr "추적하지 않는 캐시 사용을 켜거나 끕니다"
+
+#: builtin/update-index.c:1000
+msgid "enable untracked cache without testing the filesystem"
+msgstr "파일 시스템 테스트 없이 추적하지 않는 캐시를 사용합니다"
+
+#: builtin/update-ref.c:9
+msgid "git update-ref [<options>] -d <refname> [<old-val>]"
+msgstr "git update-ref [<옵션>] -d <레퍼런스이름> [<과거-값>]"
+
+#: builtin/update-ref.c:10
+msgid "git update-ref [<options>]    <refname> <new-val> [<old-val>]"
+msgstr "git update-ref [<옵션>]    <레퍼런스이름> <새-값> [<과거-값>]"
+
+#: builtin/update-ref.c:11
+msgid "git update-ref [<options>] --stdin [-z]"
+msgstr "git update-ref [<옵션>] --stdin [-z]"
+
+#: builtin/update-ref.c:363
+msgid "delete the reference"
+msgstr "레퍼런스를 삭제합니다"
+
+#: builtin/update-ref.c:365
+msgid "update <refname> not the one it points to"
+msgstr "<레퍼런스이름>을 가리키지 않는 항목으로 업데이트합니다"
+
+#: builtin/update-ref.c:366
+msgid "stdin has NUL-terminated arguments"
+msgstr "표준 입력에 NUL로 끝나는 인자가 있습니다"
+
+#: builtin/update-ref.c:367
+msgid "read updates from stdin"
+msgstr "표준 입력에서 업데이트를 읽습니다"
+
+#: builtin/update-server-info.c:6
+msgid "git update-server-info [--force]"
+msgstr "git update-server-info [--force]"
+
+#: builtin/update-server-info.c:14
+msgid "update the info files from scratch"
+msgstr "바닥부터 정보 파일을 업데이트합니다"
+
+#: builtin/verify-commit.c:17
+msgid "git verify-commit [-v | --verbose] <commit>..."
+msgstr "git verify-commit [-v | --verbose] <커밋>..."
+
+#: builtin/verify-commit.c:72
+msgid "print commit contents"
+msgstr "커밋 내용을 표시합니다"
+
+#: builtin/verify-commit.c:73 builtin/verify-tag.c:84
+msgid "print raw gpg status output"
+msgstr "원본 GPG 상태를 출력합니다"
+
+#: builtin/verify-pack.c:54
+msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."
+msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <묶음>..."
+
+#: builtin/verify-pack.c:64
+msgid "verbose"
+msgstr "자세히 표시"
+
+#: builtin/verify-pack.c:66
+msgid "show statistics only"
+msgstr "통계만 표시"
+
+#: builtin/verify-tag.c:17
+msgid "git verify-tag [-v | --verbose] <tag>..."
+msgstr "git verify-tag [-v | --verbose] <태그>..."
+
+#: builtin/verify-tag.c:83
+msgid "print tag contents"
+msgstr "태그 내용 표시"
+
+#: builtin/worktree.c:15
+msgid "git worktree add [<options>] <path> [<branch>]"
+msgstr "git worktree add [<옵션>] <경로> [<브랜치>]"
+
+#: builtin/worktree.c:16
+msgid "git worktree prune [<options>]"
+msgstr "git worktree prune [<옵션>]"
+
+#: builtin/worktree.c:17
+msgid "git worktree list [<options>]"
+msgstr "git worktree list [<옵션>]"
+
+#: builtin/worktree.c:39
+#, c-format
+msgid "Removing worktrees/%s: not a valid directory"
+msgstr "worktrees/%s 제거: 올바른 디렉터리가 아닙나다"
+
+#: builtin/worktree.c:45
+#, c-format
+msgid "Removing worktrees/%s: gitdir file does not exist"
+msgstr "worktrees/%s 제거: gitdir 파일이 없습니다"
+
+#: builtin/worktree.c:50
+#, c-format
+msgid "Removing worktrees/%s: unable to read gitdir file (%s)"
+msgstr "worktrees/%s 제거: gitdir 파일을 읽을 수 없습니다 (%s)"
+
+#: builtin/worktree.c:61
+#, c-format
+msgid "Removing worktrees/%s: invalid gitdir file"
+msgstr "worktrees/%s 제거: gitdir 파일이 올바르지 않습니다"
+
+#: builtin/worktree.c:77
+#, c-format
+msgid "Removing worktrees/%s: gitdir file points to non-existent location"
+msgstr "worktrees/%s 제거: gitdir 파일이 없는 위치를 가리킵니다"
+
+#: builtin/worktree.c:112
+#, c-format
+msgid "failed to remove: %s"
+msgstr "제거에 실패했습니다: %s"
+
+#: builtin/worktree.c:201
+#, c-format
+msgid "'%s' already exists"
+msgstr "'%s'이(가) 이미 있습니다"
+
+#: builtin/worktree.c:235
+#, c-format
+msgid "could not create directory of '%s'"
+msgstr "'%s'의 디렉터리를 만들 수 없습니다"
+
+#: builtin/worktree.c:271
+#, c-format
+msgid "Preparing %s (identifier %s)"
+msgstr "%s 준비 중 (ID %s)"
+
+#: builtin/worktree.c:319
+msgid "checkout <branch> even if already checked out in other worktree"
+msgstr "다른 작업 폴더에서 체크아웃했더라도 <브랜치>를 체크아웃합니다"
+
+#: builtin/worktree.c:321
+msgid "create a new branch"
+msgstr "새 브랜치를 만듭니다"
+
+#: builtin/worktree.c:323
+msgid "create or reset a branch"
+msgstr "브랜치를 만들거나 리셋합니다"
+
+#: builtin/worktree.c:324
+msgid "detach HEAD at named commit"
+msgstr "HEAD를 해당 커밋에서 분리합니다"
+
+#: builtin/worktree.c:331
+msgid "-b, -B, and --detach are mutually exclusive"
+msgstr "-b, -B, --detach 옵션 중 하나만 쓸 수 있습니다"
+
+#: builtin/write-tree.c:13
+msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<접두어>/]"
+
+#: builtin/write-tree.c:26
+msgid "<prefix>/"
+msgstr "<접두어>/"
+
+#: builtin/write-tree.c:27
+msgid "write tree object for a subdirectory <prefix>"
+msgstr "하위 디렉터리 <접두어>에 대해 트리 오브젝트를 씁니다"
+
+#: builtin/write-tree.c:30
+msgid "only useful for debugging"
+msgstr "디버깅 용도로만 사용"
+
+#: credential-cache--daemon.c:255
+msgid "print debugging messages to stderr"
+msgstr "디버깅 메시지를 표준오류로 출력합니다"
+
+#: git.c:14
+msgid ""
+"'git help -a' and 'git help -g' list available subcommands and some\n"
+"concept guides. See 'git help <command>' or 'git help <concept>'\n"
+"to read about a specific subcommand or concept."
+msgstr ""
+"'git help -a' 및 'git help -g' 명령을 실행하면 하위 명령어와 개념 설명서의\n"
+"목록을 볼 수 있습니다. 특정 하위 명령어나 개념에 대해 읽어 보려면 'git help\n"
+"<명령>' 또는 'git help <개념>' 명령을 실행하십시오."
+
+#: common-cmds.h:9
+msgid "start a working area (see also: git help tutorial)"
+msgstr "작업 공간 시작 (참고: git help tutorial)"
+
+#: common-cmds.h:10
+msgid "work on the current change (see also: git help everyday)"
+msgstr "변경 사항에 대한 작업 (참고: git help everyday)"
+
+#: common-cmds.h:11
+msgid "examine the history and state (see also: git help revisions)"
+msgstr "커밋 내역과 상태 보기 (참고: git help revisions)"
+
+#: common-cmds.h:12
+msgid "grow, mark and tweak your common history"
+msgstr "커밋 내역을 키우고, 표시하고, 조작하기"
+
+#: common-cmds.h:13
+msgid "collaborate (see also: git help workflows)"
+msgstr "협동 작업 (참고: git help workflows)"
+
+#: common-cmds.h:17
+msgid "Add file contents to the index"
+msgstr "파일 내용을 인덱스에 추가합니다"
+
+#: common-cmds.h:18
+msgid "Use binary search to find the commit that introduced a bug"
+msgstr "이진 탐색으로 버그를 만들어낸 커밋을 찾습니다"
+
+#: common-cmds.h:19
+msgid "List, create, or delete branches"
+msgstr "브랜치를 만들거나, 삭제하거나, 목록을 출력합니다"
+
+#: common-cmds.h:20
+msgid "Switch branches or restore working tree files"
+msgstr "브랜치를 전환하거나 작업 파일을 복구합니다"
+
+#: common-cmds.h:21
+msgid "Clone a repository into a new directory"
+msgstr "저장소를 복제해 새 디렉터리로 가져 옵니다"
+
+#: common-cmds.h:22
+msgid "Record changes to the repository"
+msgstr "바뀐 사항을 저장소에 기록합니다."
+
+#: common-cmds.h:23
+msgid "Show changes between commits, commit and working tree, etc"
+msgstr "커밋과 커밋 사이, 커밋과 작업 내용 사이 등의 바뀐 점을 봅니다"
+
+#: common-cmds.h:24
+msgid "Download objects and refs from another repository"
+msgstr "다른 저장소에서 오브젝트와 레퍼런스를 다운로드합니다"
+
+#: common-cmds.h:25
+msgid "Print lines matching a pattern"
+msgstr "패턴과 일치하는 줄을 표시합니다"
+
+#: common-cmds.h:26
+msgid "Create an empty Git repository or reinitialize an existing one"
+msgstr "빈 깃 저장소를 만들거나 기존 저장소를 다시 초기화합니다"
+
+#: common-cmds.h:27
+msgid "Show commit logs"
+msgstr "커밋 기록을 표시합니다"
+
+#: common-cmds.h:28
+msgid "Join two or more development histories together"
+msgstr "여러 개의 개발 내역을 하나로 합칩니다"
+
+#: common-cmds.h:29
+msgid "Move or rename a file, a directory, or a symlink"
+msgstr "파일, 디렉터리, 심볼릭 링크를 옮기거나 이름을 바꿉니다"
+
+#: common-cmds.h:30
+msgid "Fetch from and integrate with another repository or a local branch"
+msgstr "다른 저장소 또는 다른 로컬 브랜치에서 가져오거나 통합합니다"
+
+#: common-cmds.h:31
+msgid "Update remote refs along with associated objects"
+msgstr "원격 레퍼런스 및 그와 관련된 오브젝트를 업데이트합니다"
+
+#: common-cmds.h:32
+msgid "Forward-port local commits to the updated upstream head"
+msgstr "로컬 커밋을 업데이트된 업스트림 head 다음에 맞춰 넣습니다"
+
+#: common-cmds.h:33
+msgid "Reset current HEAD to the specified state"
+msgstr "현재 HEAD를 지정한 상태로 재설정화합니다"
+
+#: common-cmds.h:34
+msgid "Remove files from the working tree and from the index"
+msgstr "파일을 작업 폴더에서 제거하고 인덱스에서도 제거합니다"
+
+#: common-cmds.h:35
+msgid "Show various types of objects"
+msgstr "여러가지 종류의 오브젝트를 표시합니다"
+
+#: common-cmds.h:36
+msgid "Show the working tree status"
+msgstr "작업 폴더 상태를 표시합니다"
+
+#: common-cmds.h:37
+msgid "Create, list, delete or verify a tag object signed with GPG"
+msgstr "태그를 만들거나, 표시하거나, 삭제하거나, GPG 서명을 검증합니다"
+
+#: parse-options.h:145
+msgid "expiry-date"
+msgstr "만료-시각"
+
+#: parse-options.h:160
+msgid "no-op (backward compatibility)"
+msgstr "아무 동작도 하지 않음 (호환용)"
+
+#: parse-options.h:237
+msgid "be more verbose"
+msgstr "더 자세히 표시합니다"
+
+#: parse-options.h:239
+msgid "be more quiet"
+msgstr "더 간략히 표시합니다"
+
+#: parse-options.h:245
+msgid "use <n> digits to display SHA-1s"
+msgstr "SHA-1 표시에 <n>개의 숫자를 사용합니다"
+
+#: rerere.h:38
+msgid "update the index with reused conflict resolution if possible"
+msgstr "가능하면 인덱스를 재사용한 충돌 해결로 업데이트합니다"
+
+#: git-bisect.sh:55
+msgid "You need to start by \"git bisect start\""
+msgstr "\"git bisect start\" 명령으로 시작해야 합니다"
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:61
+msgid "Do you want me to do it for you [Y/n]? "
+msgstr "지금 하시겠습니까 [Y/n]? "
+
+#: git-bisect.sh:122
+#, sh-format
+msgid "unrecognised option: '$arg'"
+msgstr "알 수 없는 옵션: '$arg'"
+
+#: git-bisect.sh:126
+#, sh-format
+msgid "'$arg' does not appear to be a valid revision"
+msgstr "'$arg'은(는) 올바른 리비전처럼 보이지 않습니다"
+
+#: git-bisect.sh:155
+msgid "Bad HEAD - I need a HEAD"
+msgstr "잘못된 HEAD - HEAD가 필요합니다"
+
+#: git-bisect.sh:168
+#, sh-format
+msgid ""
+"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'."
+msgstr ""
+"'$start_head' 받아오기가 실패했습니다. 'git bisect reset <valid-branch>'를 "
+"해 보십시오."
+
+#: git-bisect.sh:178
+msgid "won't bisect on cg-seek'ed tree"
+msgstr "cg-seek한 트리에서 bisect를 할 수 없습니다"
+
+#: git-bisect.sh:182
+msgid "Bad HEAD - strange symbolic ref"
+msgstr "잘못된 HEAD - 심볼릭 레퍼런스가 잘못되었습니다"
+
+#: git-bisect.sh:234
+#, sh-format
+msgid "Bad bisect_write argument: $state"
+msgstr "잘못된 bisect_write 인자: $state"
+
+#: git-bisect.sh:263
+#, sh-format
+msgid "Bad rev input: $arg"
+msgstr "잘못된 리비전 입력: $arg"
+
+#: git-bisect.sh:278
+msgid "Please call 'bisect_state' with at least one argument."
+msgstr "'bisect_state' 호출은 최소한 하나의 인자를 써야 합니다."
+
+#: git-bisect.sh:290
+#, sh-format
+msgid "Bad rev input: $rev"
+msgstr "잘못된 리비전 입력: $rev"
+
+#: git-bisect.sh:299
+#, sh-format
+msgid "'git bisect $TERM_BAD' can take only one argument."
+msgstr "'git bisect $TERM_BAD' 명령은 하나의 인자만 쓸 수 있습니다."
+
+#: git-bisect.sh:322
+#, sh-format
+msgid "Warning: bisecting only with a $TERM_BAD commit."
+msgstr "경고: 하나의 $TERM_BAD 커밋에 대해서만 이등분."
+
+#. TRANSLATORS: Make sure to include [Y] and [n] in your
+#. translation. The program will only accept English input
+#. at this point.
+#: git-bisect.sh:328
+msgid "Are you sure [Y/n]? "
+msgstr "확실합니까 [Y/n]? "
+
+#: git-bisect.sh:340
+#, sh-format
+msgid ""
+"You need to give me at least one $bad_syn and one $good_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+"최소한 하나의 $bad_syn 및 하나의 $good_syn 리비전을 넘겨야 합니다.\n"
+"(\"git bisect $bad_syn\" 및 \"git bisect $good_syn\" 명령을 실행하면 됩니다.)"
+
+#: git-bisect.sh:343
+#, sh-format
+msgid ""
+"You need to start by \"git bisect start\".\n"
+"You then need to give me at least one $good_syn and one $bad_syn revision.\n"
+"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)"
+msgstr ""
+"\"git bisect start\"를 실행해야 합니다.\n"
+"그 다음 최소한 하나의 $good_syn 및 하나의 $bad_syn 리비전을 넘겨야 합니다\n"
+"(\"git bisect $bad_syn\" 및 \"git bisect $good_syn\" 명령을 실행하면 됩니다.)"
+
+#: git-bisect.sh:414 git-bisect.sh:546
+msgid "We are not bisecting."
+msgstr "이등분하는 중입니다."
+
+#: git-bisect.sh:421
+#, sh-format
+msgid "'$invalid' is not a valid commit"
+msgstr "'$invalid'은(는) 올바른 커밋이 아닙니다"
+
+#: git-bisect.sh:430
+#, sh-format
+msgid ""
+"Could not check out original HEAD '$branch'.\n"
+"Try 'git bisect reset <commit>'."
+msgstr ""
+"본래의 HEAD '$branch'을(를) 체크아웃할 수 없습니다.\n"
+"'git bisect reset <커밋>'을 해 보십시오"
+
+#: git-bisect.sh:458
+msgid "No logfile given"
+msgstr "로그 파일이 주어지지 않았습니다"
+
+#: git-bisect.sh:459
+#, sh-format
+msgid "cannot read $file for replaying"
+msgstr "다시 재생할 $file 파일을 읽을 수 없습니다"
+
+#: git-bisect.sh:480
+msgid "?? what are you talking about?"
+msgstr "?? 무슨 소리인지 모르겠습니다?"
+
+#: git-bisect.sh:492
+#, sh-format
+msgid "running $command"
+msgstr "실행: $command"
+
+#: git-bisect.sh:499
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"exit code $res from '$command' is < 0 or >= 128"
+msgstr ""
+"이등분 실행이 실패했습니다:\n"
+"'$command' 명령에서 상태 코드 '$res'이(가) 0보다 작거나 128보다 큽니다"
+
+#: git-bisect.sh:525
+msgid "bisect run cannot continue any more"
+msgstr "이등분 실행을 계속 할 수 없습니다"
+
+#: git-bisect.sh:531
+#, sh-format
+msgid ""
+"bisect run failed:\n"
+"'bisect_state $state' exited with error code $res"
+msgstr ""
+"이등분 실행이 실패했습니다:\n"
+"'bisect_state $state' 명령에서 상태 코드가 '$res'입니다"
+
+#: git-bisect.sh:538
+msgid "bisect run success"
+msgstr "이등분 실행 성공"
+
+#: git-bisect.sh:565
+msgid "please use two different terms"
+msgstr "두 다른 용어를 사용하십시오"
+
+#: git-bisect.sh:575
+#, sh-format
+msgid "'$term' is not a valid term"
+msgstr "'$term'이(가) 올바른 용어가 아닙니다"
+
+#: git-bisect.sh:578
+#, sh-format
+msgid "can't use the builtin command '$term' as a term"
+msgstr "내부 명령어 '$term'을(를) 용어로 사용할 수 없습니다"
+
+#: git-bisect.sh:587 git-bisect.sh:593
+#, sh-format
+msgid "can't change the meaning of term '$term'"
+msgstr "용어 '$term'의 의미를 바꿀 수 없습니다"
+
+#: git-bisect.sh:606
+#, sh-format
+msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect."
+msgstr "잘못된 명령어: 현재 $TERM_BAD/$TERM_GOOD 이등분 중입니다."
+
+#: git-bisect.sh:636
+msgid "no terms defined"
+msgstr "용어를 정의하지 않았습니다"
+
+#: git-bisect.sh:653
+#, sh-format
+msgid ""
+"invalid argument $arg for 'git bisect terms'.\n"
+"Supported options are: --term-good|--term-old and --term-bad|--term-new."
+msgstr ""
+"'git bisect terms'에 대해 잘못된 인자 '$arg'.\n"
+"지원하는 옵션은: --term-good|--term-old 및 --term-bad|--term-new."
+
+#: git-rebase.sh:57
+msgid ""
+"When you have resolved this problem, run \"git rebase --continue\".\n"
+"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
+"To check out the original branch and stop rebasing, run \"git rebase --abort"
+"\"."
+msgstr ""
+"이 문제를 해결하면, \"\"git rebase --continue\"를 실행하십시오.\n"
+"이 패치를 건너뛰려면, 대신에 \"git rebase --skip\"을 실행하십시오.\n"
+"원래 브랜치를 체크아웃하고 리베이스를 중지하려면, \"git rebase --abort\"를 실행하십시오."
+
+#: git-rebase.sh:165
+msgid "Applied autostash."
+msgstr "자동스태시 적용."
+
+#: git-rebase.sh:168
+#, sh-format
+msgid "Cannot store $stash_sha1"
+msgstr "\"$stash_sha1\"을(를) 저장할 수 없습니다"
+
+#: git-rebase.sh:169
+msgid ""
+"Applying autostash resulted in conflicts.\n"
+"Your changes are safe in the stash.\n"
+"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
+msgstr ""
+"자동스태시 적용에 충돌이 발생했습니다.\n"
+"변경 사항은 스태시 안에 안전하게 들어 있습니다.\n"
+"언제든지 \"git stash pop\" 또는 \"git stash drop\"을 실행할 수 있습니다.\n"
+
+#: git-rebase.sh:208
+msgid "The pre-rebase hook refused to rebase."
+msgstr "리베이스 전 후크에서 리베이스를 거부했습니다."
+
+#: git-rebase.sh:213
+msgid "It looks like git-am is in progress. Cannot rebase."
+msgstr "git-am이 진행 중인 것처럼 보입니다. 리베이스할 수 없습니다."
+
+#: git-rebase.sh:354
+msgid "The --exec option must be used with the --interactive option"
+msgstr "--exec 옵션은 --interactive 옵션과 같이 사용해야 합니다"
+
+#: git-rebase.sh:359
+msgid "No rebase in progress?"
+msgstr "리베이스가 진행 중이지 않습니다"
+
+#: git-rebase.sh:370
+msgid "The --edit-todo action can only be used during interactive rebase."
+msgstr "--edit-todo 동작은 대화형 리베이스에서만 사용할 수 있습니다."
+
+#: git-rebase.sh:377
+msgid "Cannot read HEAD"
+msgstr "HEAD를 읽을 수 없습니다"
+
+#: git-rebase.sh:380
+msgid ""
+"You must edit all merge conflicts and then\n"
+"mark them as resolved using git add"
+msgstr ""
+"모든 병합 충돌을 편집하고 git add\n"
+"명령으로 해결되었다고 표시해야 합니다"
+
+#: git-rebase.sh:398
+#, sh-format
+msgid "Could not move back to $head_name"
+msgstr "'$head_name' 위치로 돌아갈 수 없습니다"
+
+#: git-rebase.sh:417
+#, sh-format
+msgid ""
+"It seems that there is already a $state_dir_base directory, and\n"
+"I wonder if you are in the middle of another rebase.  If that is the\n"
+"case, please try\n"
+"\t$cmd_live_rebase\n"
+"If that is not the case, please\n"
+"\t$cmd_clear_stale_rebase\n"
+"and run me again.  I am stopping in case you still have something\n"
+"valuable there."
+msgstr ""
+"이미 '$state_dir_base' 디렉터리가 있는 것으로 보아, 이미\n"
+"또 다른 리베이스 중에 있는 것 같습니다. 그러한 경우에는\n"
+"다음을 시도해 보십시오:\n"
+"\t$cmd_live_rebase\n"
+"리베이스 중이 아니라면 다음을 시도하고,\n"
+"\t$cmd_clear_stale_rebase\n"
+"이 명령을 다시 실행하십시오. 중요한 사항이 남아 있을 경우를\n"
+"대비해 여기서 멈춥니다."
+
+#: git-rebase.sh:468
+#, sh-format
+msgid "invalid upstream $upstream_name"
+msgstr "잘못된 업스트림 $upstream_name"
+
+#: git-rebase.sh:492
+#, sh-format
+msgid "$onto_name: there are more than one merge bases"
+msgstr "$onto_name: 여러 개의 병합 베이스가 있습니다"
+
+#: git-rebase.sh:495 git-rebase.sh:499
+#, sh-format
+msgid "$onto_name: there is no merge base"
+msgstr "$onto_name: 병합 베이스가 없습니다"
+
+#: git-rebase.sh:504
+#, sh-format
+msgid "Does not point to a valid commit: $onto_name"
+msgstr "올바른 커밋을 가리키지 않습니다: $onto_name"
+
+#: git-rebase.sh:527
+#, sh-format
+msgid "fatal: no such branch: $branch_name"
+msgstr "치명적 이상: 그런 브랜치가 없습니다: $branch_name"
+
+#: git-rebase.sh:560
+msgid "Cannot autostash"
+msgstr "자동 스태시를 할 수 없습니다"
+
+#: git-rebase.sh:565
+#, sh-format
+msgid "Created autostash: $stash_abbrev"
+msgstr "자동 스태시를 만들었습니다: $stash_abbrev"
+
+#: git-rebase.sh:569
+msgid "Please commit or stash them."
+msgstr "커밋하거나 스태시에 넣으십시오."
+
+#: git-rebase.sh:589
+#, sh-format
+msgid "Current branch $branch_name is up to date."
+msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다."
+
+#: git-rebase.sh:593
+#, sh-format
+msgid "Current branch $branch_name is up to date, rebase forced."
+msgstr "현재 브랜치가 ($branch_name) 최신 상태입니다. 강제 리베이스합니다."
+
+#: git-rebase.sh:604
+#, sh-format
+msgid "Changes from $mb to $onto:"
+msgstr "변경 사항 '$mb'에서 '$onto'(으)로:"
+
+#: git-rebase.sh:613
+msgid "First, rewinding head to replay your work on top of it..."
+msgstr "작업 사항을 다시 넣기 위해 먼저 헤드를 뒤로 돌립니다..."
+
+#: git-rebase.sh:623
+#, sh-format
+msgid "Fast-forwarded $branch_name to $onto_name."
+msgstr "$branch_name 브랜치를 $onto_name 위치로 정방향 진행합니다."
+
+#: git-stash.sh:51
+msgid "git stash clear with parameters is unimplemented"
+msgstr "git stash clear 명령을 파라미터와 같이 쓰기는 구현되지 않았습니다"
+
+#: git-stash.sh:74
+msgid "You do not have the initial commit yet"
+msgstr "아직 최초 커밋이 없습니다"
+
+#: git-stash.sh:89
+msgid "Cannot save the current index state"
+msgstr "현재 인덱스 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:124 git-stash.sh:137
+msgid "Cannot save the current worktree state"
+msgstr "현재 작업 폴더 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:141
+msgid "No changes selected"
+msgstr "변경 사항을 선택하지 않았습니다"
+
+#: git-stash.sh:144
+msgid "Cannot remove temporary index (can't happen)"
+msgstr "임시 인덱스를 제거할 수 없습니다 (일어날 수 없는 상황)"
+
+#: git-stash.sh:157
+msgid "Cannot record working tree state"
+msgstr "작업 폴더 상태를 기록할 수 없습니다"
+
+#: git-stash.sh:189
+#, sh-format
+msgid "Cannot update $ref_stash with $w_commit"
+msgstr "$ref_stash을(를) $w_commit(으)로 업데이트할 수 없습니다"
+
+#. TRANSLATORS: $option is an invalid option, like
+#. `--blah-blah'. The 7 spaces at the beginning of the
+#. second line correspond to "error: ". So you should line
+#. up the second line with however many characters the
+#. translation of "error: " takes in your language. E.g. in
+#. English this is:
+#.
+#. $ git stash save --blah-blah 2>&1 | head -n 2
+#. error: unknown option for 'stash save': --blah-blah
+#. To provide a message, use git stash save -- '--blah-blah'
+#: git-stash.sh:239
+#, sh-format
+msgid ""
+"error: unknown option for 'stash save': $option\n"
+"       To provide a message, use git stash save -- '$option'"
+msgstr ""
+"오류: 'stash save'에 대해 알 수 없는 옵션: $option\n"
+"       메시지를 넘기려면, 다음과 같이 쓰십시오: git stash save -- '$option'"
+
+#: git-stash.sh:260
+msgid "No local changes to save"
+msgstr "저장할 로컬 변경 사항이 없습니다"
+
+#: git-stash.sh:264
+msgid "Cannot initialize stash"
+msgstr "스태시를 초기화할 수 없습니다"
+
+#: git-stash.sh:268
+msgid "Cannot save the current status"
+msgstr "현재 상태를 저장할 수 없습니다"
+
+#: git-stash.sh:286
+msgid "Cannot remove worktree changes"
+msgstr "작업폴더 변경 사항을 제거할 수 없습니다"
+
+#: git-stash.sh:405
+#, sh-format
+msgid "unknown option: $opt"
+msgstr "알 수 없는 옵션: $opt"
+
+#: git-stash.sh:415
+msgid "No stash found."
+msgstr "스태시가 없습니다."
+
+#: git-stash.sh:422
+#, sh-format
+msgid "Too many revisions specified: $REV"
+msgstr "너무 많은 리비전을 지정했습니다: $REV"
+
+#: git-stash.sh:428
+#, sh-format
+msgid "$reference is not a valid reference"
+msgstr "$reference은(는) 올바른 레퍼런스가 아닙니다"
+
+#: git-stash.sh:456
+#, sh-format
+msgid "'$args' is not a stash-like commit"
+msgstr "'$args'은(는) 스태시 커밋이 아닙니다"
+
+#: git-stash.sh:467
+#, sh-format
+msgid "'$args' is not a stash reference"
+msgstr "'$args'은(는) 스태시 레퍼런스가 아닙니다"
+
+#: git-stash.sh:475
+msgid "unable to refresh index"
+msgstr "인덱스를 새로 고칠 수 없습니다"
+
+#: git-stash.sh:479
+msgid "Cannot apply a stash in the middle of a merge"
+msgstr "병합 도중에 스태시를 적용할 수 없습니다"
+
+#: git-stash.sh:487
+msgid "Conflicts in index. Try without --index."
+msgstr "인덱스에 충돌. --index 없이 시도해 보십시오."
+
+#: git-stash.sh:489
+msgid "Could not save index tree"
+msgstr "인덱스 트리를 저장할 수 없습니다"
+
+#: git-stash.sh:523
+msgid "Cannot unstage modified files"
+msgstr "수정한 파일을 스테이지에서 뺄 수 없습니다"
+
+#: git-stash.sh:538
+msgid "Index was not unstashed."
+msgstr "인덱스가 스태시에서 빠졌습니다."
+
+#: git-stash.sh:561
+#, sh-format
+msgid "Dropped ${REV} ($s)"
+msgstr "${REV} 지움 ($s)"
+
+#: git-stash.sh:562
+#, sh-format
+msgid "${REV}: Could not drop stash entry"
+msgstr "${REV}: 스태시 항목을 지울 수 없습니다"
+
+#: git-stash.sh:570
+msgid "No branch name specified"
+msgstr "브랜치 이름을 지정하지 않았습니다"
+
+#: git-stash.sh:642
+msgid "(To restore them type \"git stash apply\")"
+msgstr "(복구하려면 \"git stash apply\"를 실행하십시오)"
+
+#: git-submodule.sh:104
+#, sh-format
+msgid "cannot strip one component off url '$remoteurl'"
+msgstr "'$remoteurl' URL에서 하나의 항목을 잘라낼 수 없습니다"
+
+#: git-submodule.sh:281
+msgid "Relative path can only be used from the toplevel of the working tree"
+msgstr "상대 경로는 작업 폴더의 최상위에서만 쓸 수 있습니다"
+
+#: git-submodule.sh:291
+#, sh-format
+msgid "repo URL: '$repo' must be absolute or begin with ./|../"
+msgstr "저장소 URL: '$repo' 값은 절대 경로거나 ./ 또는 ../로 시작해야 합니다."
+
+#: git-submodule.sh:308
+#, sh-format
+msgid "'$sm_path' already exists in the index"
+msgstr "'$sm_path'은(는) 이미 인덱스에 있습니다"
+
+#: git-submodule.sh:312
+#, sh-format
+msgid ""
+"The following path is ignored by one of your .gitignore files:\n"
+"$sm_path\n"
+"Use -f if you really want to add it."
+msgstr ""
+"다음 경로는 .gitignore 파일에서 무시합니다:\n"
+"$sm_path\n"
+"정말로 추가하려면 -f 옵션을 사용하십시오."
+
+#: git-submodule.sh:330
+#, sh-format
+msgid "Adding existing repo at '$sm_path' to the index"
+msgstr "'$sm_path'의 기존 저장소를 인덱스에 추가합니다"
+
+#: git-submodule.sh:332
+#, sh-format
+msgid "'$sm_path' already exists and is not a valid git repo"
+msgstr "'$sm_path'이(가) 이미 있고 올바른 git 저장소가 아닙니다"
+
+#: git-submodule.sh:340
+#, sh-format
+msgid "A git directory for '$sm_name' is found locally with remote(s):"
+msgstr "'$sm_name'에 대한 깃 디렉터리가 로컬에서 리모트가 있는 채로 있습니다:"
+
+#: git-submodule.sh:342
+#, sh-format
+msgid ""
+"If you want to reuse this local git directory instead of cloning again from"
+msgstr "다시 복제하지 않고 이 로컬 깃 디렉터리를 재활용하려면"
+
+#: git-submodule.sh:344
+#, sh-format
+msgid ""
+"use the '--force' option. If the local git directory is not the correct repo"
+msgstr ""
+"'--force' 옵션을 사용하십시오. 로컬 깃 디렉터리가 올바른 저장소가 아니거나"
+
+#: git-submodule.sh:345
+#, sh-format
+msgid ""
+"or you are unsure what this means choose another name with the '--name' "
+"option."
+msgstr "무슨 의미인지 잘 모르겠다면 '--name' 옵션으로 다른 이름을 쓰십시오."
+
+#: git-submodule.sh:347
+#, sh-format
+msgid "Reactivating local git directory for submodule '$sm_name'."
+msgstr "로컬 깃 디렉터리를 '$sm_name' 하위모듈로 다시 활성화합니다."
+
+#: git-submodule.sh:359
+#, sh-format
+msgid "Unable to checkout submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 체크아웃할 수 없습니다"
+
+#: git-submodule.sh:364
+#, sh-format
+msgid "Failed to add submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 추가하는데 실패했습니다"
+
+#: git-submodule.sh:373
+#, sh-format
+msgid "Failed to register submodule '$sm_path'"
+msgstr "'$sm_path' 하위 모듈을 등록하는데 실패했습니다"
+
+#: git-submodule.sh:417
+#, sh-format
+msgid "Entering '$prefix$displaypath'"
+msgstr "'$prefix$displaypath' 입력"
+
+#: git-submodule.sh:437
+#, sh-format
+msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
+msgstr "'$prefix$displaypath' 위치에서 멈춤. 스크립트에서 0이 아닌 상태를 리턴했습니다."
+
+#: git-submodule.sh:483
+#, sh-format
+msgid "No url found for submodule path '$displaypath' in .gitmodules"
+msgstr ".gitmodules에서 하위 모듈 경로 '$displaypath'에 대한 URL이 없습니다"
+
+#: git-submodule.sh:492
+#, sh-format
+msgid "Failed to register url for submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에 대한 URL을 등록하는데 실패했습니다"
+
+#: git-submodule.sh:494
+#, sh-format
+msgid "Submodule '$name' ($url) registered for path '$displaypath'"
+msgstr "'$displaypath' 경로에 ($url) 대해 등록된 '$name' 하위 모듈"
+
+#: git-submodule.sh:511
+#, sh-format
+msgid "Failed to register update mode for submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에 대해 업데이트 모드를 등록하는데 실패했습니다"
+
+#: git-submodule.sh:549
+#, sh-format
+msgid "Use '.' if you really want to deinitialize all submodules"
+msgstr "정말로 모든 하위 모듈 초기화를 해제하려면 '.'을 사용하십시오"
+
+#: git-submodule.sh:566
+#, sh-format
+msgid "Submodule work tree '$displaypath' contains a .git directory"
+msgstr "하위 모듈 작업 폴더에 ('$displaypath') .git 디렉터리가 들어 있습니다"
+
+#: git-submodule.sh:567
+#, sh-format
+msgid ""
+"(use 'rm -rf' if you really want to remove it including all of its history)"
+msgstr "(정말로 그 커밋 내역까지 포함해 제거하려면 'rm -rf'를 사용하십시오)"
+
+#: git-submodule.sh:573
+#, sh-format
+msgid ""
+"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
+"discard them"
+msgstr "하위 모듈 작업 폴더에 ('$displaypath') 로컬 수정 사항이 있습니다. 버리려면 '-f'를 사용하십시오"
+
+#: git-submodule.sh:576
+#, sh-format
+msgid "Cleared directory '$displaypath'"
+msgstr "'$displaypath' 디렉터리를 지웁니다"
+
+#: git-submodule.sh:577
+#, sh-format
+msgid "Could not remove submodule work tree '$displaypath'"
+msgstr "하위 모듈 디렉터리를 ('$displaypath') 제거할 수 없습니다"
+
+#: git-submodule.sh:580
+#, sh-format
+msgid "Could not create empty submodule directory '$displaypath'"
+msgstr "빈 하위 모듈 디렉터리를 ('$displaypath') 만들 수 없습니다"
+
+#: git-submodule.sh:589
+#, sh-format
+msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
+msgstr "'$name' 하위 모듈이 ($url) '$displaypath' 경로에 대해 등록되지 않았습니다"
+
+#: git-submodule.sh:705
+#, sh-format
+msgid ""
+"Submodule path '$displaypath' not initialized\n"
+"Maybe you want to use 'update --init'?"
+msgstr ""
+"하위 모듈 경로가 ('$displaypath') 초기화되지 않았습니다\n"
+"아마도 'update --init'이 필요합니다?"
+
+#: git-submodule.sh:718
+#, sh-format
+msgid "Unable to find current revision in submodule path '$displaypath'"
+msgstr "하위 모듈 경로에서 ('$displaypath') 현재 리비전을 찾을 수 없습니다"
+
+#: git-submodule.sh:727
+#, sh-format
+msgid "Unable to fetch in submodule path '$sm_path'"
+msgstr "하위 모듈 경로 '$sm_path'에서 가져올 수 없습니다"
+
+#: git-submodule.sh:751
+#, sh-format
+msgid "Unable to fetch in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 가져올 수 없습니다"
+
+#: git-submodule.sh:765
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 체크아웃할 수 없습니다"
+
+#: git-submodule.sh:766
+#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1' 체크아웃"
+
+#: git-submodule.sh:770
+#, sh-format
+msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1'을(를) 리베이스할 수 없습니다"
+
+#: git-submodule.sh:771
+#, sh-format
+msgid "Submodule path '$displaypath': rebased into '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1'(으)로 리베이스"
+
+#: git-submodule.sh:776
+#, sh-format
+msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
+msgstr "하위 모듈 경로 '$displaypath'에서 '$sha1' 병합할 수 없습니다"
+
+#: git-submodule.sh:777
+#, sh-format
+msgid "Submodule path '$displaypath': merged in '$sha1'"
+msgstr "하위 모듈 경로 '$displaypath': '$sha1'에서 병합"
+
+#: git-submodule.sh:782
+#, sh-format
+msgid ""
+"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
+msgstr "하위 모듈 경로 '$prefix$sm_path'에서 '$command $sha1' 실행이 실패했습니다"
+
+#: git-submodule.sh:783
+#, sh-format
+msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
+msgstr "하위 모듈 경로 '$prefix$sm_path': '$command $sha1'"
+
+#: git-submodule.sh:813
+#, sh-format
+msgid "Failed to recurse into submodule path '$displaypath'"
+msgstr "재귀적으로 하위 모듈 경로 '$displaypath'에 들어가는데 실패했습니다"
+
+#: git-submodule.sh:921
+msgid "The --cached option cannot be used with the --files option"
+msgstr "--cached 옵션은 --files 옵션과 같이 쓸 수 없습니다"
+
+#: git-submodule.sh:973
+#, sh-format
+msgid "unexpected mode $mod_dst"
+msgstr "예상치 못한 모드 $mod_dst"
+
+#: git-submodule.sh:993
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_src"
+msgstr "  경고: '$display_name'에 '$sha1_src' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:996
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commit $sha1_dst"
+msgstr "  경고: '$display_name'에 '$sha1_dst' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:999
+#, sh-format
+msgid "  Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
+msgstr "  경고: '$display_name'에 '$sha1_src' 및 '$sha1_dst' 커밋이 들어있지 않습니다"
+
+#: git-submodule.sh:1024
+msgid "blob"
+msgstr "블롭"
+
+#: git-submodule.sh:1142
+#, sh-format
+msgid "Failed to recurse into submodule path '$sm_path'"
+msgstr "재귀적으로 하위 모듈 경로 '$sm_path'에 들어가는데 실패했습니다"
+
+#: git-submodule.sh:1206
+#, sh-format
+msgid "Synchronizing submodule url for '$displaypath'"
+msgstr "하위 모듈 URL을 '$displaypath'에 대해 동기화"
index 353bd37416e65f6dba733ac9d14999f1e293b4b9..76a88c573f7895bbf388ab4335faa1b86c3975d3 100644 (file)
@@ -247,7 +247,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
                size_t len = strlen(msg) + 5;
                struct throughput *tp = progress->throughput;
 
-               bufp = (len < sizeof(buf)) ? buf : xmalloc(len + 1);
+               bufp = (len < sizeof(buf)) ? buf : xmallocz(len);
                if (tp) {
                        unsigned int rate = !tp->avg_misecs ? 0 :
                                        tp->avg_bytes / tp->avg_misecs;
index 84616c8e219bf3cf902643a8da62a2060d335c36..5be7cd1dbf50c850ee5e02dcfde69d7611c181b5 100644 (file)
@@ -327,7 +327,7 @@ int ie_match_stat(const struct index_state *istate,
         * by definition never matches what is in the work tree until it
         * actually gets added.
         */
-       if (ce->ce_flags & CE_INTENT_TO_ADD)
+       if (ce_intent_to_add(ce))
                return DATA_CHANGED | TYPE_CHANGED | MODE_CHANGED;
 
        changed = ce_match_stat_basic(ce, st);
@@ -1237,7 +1237,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
 
                        if (cache_errno == ENOENT)
                                fmt = deleted_fmt;
-                       else if (ce->ce_flags & CE_INTENT_TO_ADD)
+                       else if (ce_intent_to_add(ce))
                                fmt = added_fmt; /* must be before other checks */
                        else if (changed & TYPE_CHANGED)
                                fmt = typechange_fmt;
index 7bef7f8dac644b49a2cb13d8d5154fd563d6e8a0..9ccfc51ceadb79fdf376da79741c9693db8513bb 100644 (file)
@@ -763,6 +763,29 @@ static inline char *copy_advance(char *dst, const char *src)
        return dst;
 }
 
+static const char *strip_ref_components(const char *refname, const char *nr_arg)
+{
+       char *end;
+       long nr = strtol(nr_arg, &end, 10);
+       long remaining = nr;
+       const char *start = refname;
+
+       if (nr < 1 || *end != '\0')
+               die(":strip= requires a positive integer argument");
+
+       while (remaining) {
+               switch (*start++) {
+               case '\0':
+                       die("ref '%s' does not have %ld components to :strip",
+                           refname, nr);
+               case '/':
+                       remaining--;
+                       break;
+               }
+       }
+       return start;
+}
+
 /*
  * Parse the object referred by ref, and grab needed value.
  */
@@ -909,11 +932,14 @@ static void populate_value(struct ref_array_item *ref)
                formatp = strchr(name, ':');
                if (formatp) {
                        int num_ours, num_theirs;
+                       const char *arg;
 
                        formatp++;
                        if (!strcmp(formatp, "short"))
                                refname = shorten_unambiguous_ref(refname,
                                                      warn_ambiguous_refs);
+                       else if (skip_prefix(formatp, "strip=", &arg))
+                               refname = strip_ref_components(refname, arg);
                        else if (!strcmp(formatp, "track") &&
                                 (starts_with(name, "upstream") ||
                                  starts_with(name, "push"))) {
@@ -1229,10 +1255,8 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
                                                 const unsigned char *objectname,
                                                 int flag)
 {
-       size_t len = strlen(refname);
-       struct ref_array_item *ref = xcalloc(1, sizeof(struct ref_array_item) + len + 1);
-       memcpy(ref->refname, refname, len);
-       ref->refname[len] = '\0';
+       struct ref_array_item *ref;
+       FLEX_ALLOC_STR(ref, refname, refname);
        hashcpy(ref->objectname, objectname);
        ref->flag = flag;
 
index 85b8a54241048bb2cc037c2c114b49e7c7e7968b..0ebd1da5ceb835066cf4eccd81eda4fba2cc0ac2 100644 (file)
@@ -221,6 +221,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
        struct commit_info *commit_info =
                get_commit_info(commit, &info->reflogs, 0);
        struct commit_reflog *commit_reflog;
+       struct object *logobj;
        struct reflog_info *reflog;
 
        info->last_commit_reflog = NULL;
@@ -232,15 +233,20 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
                commit->parents = NULL;
                return;
        }
-
-       reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
        info->last_commit_reflog = commit_reflog;
-       commit_reflog->recno--;
-       commit_info->commit = (struct commit *)parse_object(reflog->osha1);
-       if (!commit_info->commit) {
+
+       do {
+               reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
+               commit_reflog->recno--;
+               logobj = parse_object(reflog->osha1);
+       } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT));
+
+       if (!logobj || logobj->type != OBJ_COMMIT) {
+               commit_info->commit = NULL;
                commit->parents = NULL;
                return;
        }
+       commit_info->commit = (struct commit *)logobj;
 
        commit->parents = xcalloc(1, sizeof(struct commit_list));
        commit->parents->item = commit_info->commit;
diff --git a/refs.c b/refs.c
index e2d34b253e4c9c4efcb30e88d11ccd3ce9e14deb..b0e6ece6f43437bb7d59490d64802baa3b277090 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -124,7 +124,7 @@ int refname_is_safe(const char *refname)
                char *buf;
                int result;
 
-               buf = xmalloc(strlen(refname) + 1);
+               buf = xmallocz(strlen(refname));
                /*
                 * Does the refname try to escape refs/?
                 * For example: refs/foo/../bar is safe but refs/foo/../../bar
@@ -761,10 +761,8 @@ void ref_transaction_free(struct ref_transaction *transaction)
 static struct ref_update *add_update(struct ref_transaction *transaction,
                                     const char *refname)
 {
-       size_t len = strlen(refname) + 1;
-       struct ref_update *update = xcalloc(1, sizeof(*update) + len);
-
-       memcpy((char *)update->refname, refname, len); /* includes NUL */
+       struct ref_update *update;
+       FLEX_ALLOC_STR(update, refname, refname);
        ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
        transaction->updates[transaction->nr++] = update;
        return update;
@@ -908,7 +906,7 @@ char *shorten_unambiguous_ref(const char *refname, int strict)
                        /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
                        total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
 
-               scanf_fmts = xmalloc(nr_rules * sizeof(char *) + total_len);
+               scanf_fmts = xmalloc(st_add(st_mult(nr_rules, sizeof(char *)), total_len));
 
                offset = 0;
                for (i = 0; i < nr_rules; i++) {
index c648b5e853c347f0978d835cb057a9a2831bf0dd..de9af1615cc4f1aaf0c71c7050f57adc908dde85 100644 (file)
@@ -199,17 +199,14 @@ static struct ref_entry *create_ref_entry(const char *refname,
                                          const unsigned char *sha1, int flag,
                                          int check_name)
 {
-       int len;
        struct ref_entry *ref;
 
        if (check_name &&
            check_refname_format(refname, REFNAME_ALLOW_ONELEVEL))
                die("Reference has invalid format: '%s'", refname);
-       len = strlen(refname) + 1;
-       ref = xmalloc(sizeof(struct ref_entry) + len);
+       FLEX_ALLOC_STR(ref, name, refname);
        hashcpy(ref->u.value.oid.hash, sha1);
        oidclr(&ref->u.value.peeled);
-       memcpy(ref->name, refname, len);
        ref->flag = flag;
        return ref;
 }
@@ -268,9 +265,7 @@ static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache,
                                          int incomplete)
 {
        struct ref_entry *direntry;
-       direntry = xcalloc(1, sizeof(struct ref_entry) + len + 1);
-       memcpy(direntry->name, dirname, len);
-       direntry->name[len] = '\0';
+       FLEX_ALLOC_MEM(direntry, name, dirname, len);
        direntry->u.subdir.ref_cache = ref_cache;
        direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0);
        return direntry;
@@ -933,25 +928,22 @@ static void clear_loose_ref_cache(struct ref_cache *refs)
        }
 }
 
+/*
+ * Create a new submodule ref cache and add it to the internal
+ * set of caches.
+ */
 static struct ref_cache *create_ref_cache(const char *submodule)
 {
-       int len;
        struct ref_cache *refs;
        if (!submodule)
                submodule = "";
-       len = strlen(submodule) + 1;
-       refs = xcalloc(1, sizeof(struct ref_cache) + len);
-       memcpy(refs->name, submodule, len);
+       FLEX_ALLOC_STR(refs, name, submodule);
+       refs->next = submodule_ref_caches;
+       submodule_ref_caches = refs;
        return refs;
 }
 
-/*
- * Return a pointer to a ref_cache for the specified submodule. For
- * the main repository, use submodule==NULL. The returned structure
- * will be allocated and initialized but not necessarily populated; it
- * should not be freed.
- */
-static struct ref_cache *get_ref_cache(const char *submodule)
+static struct ref_cache *lookup_ref_cache(const char *submodule)
 {
        struct ref_cache *refs;
 
@@ -961,10 +953,20 @@ static struct ref_cache *get_ref_cache(const char *submodule)
        for (refs = submodule_ref_caches; refs; refs = refs->next)
                if (!strcmp(submodule, refs->name))
                        return refs;
+       return NULL;
+}
 
-       refs = create_ref_cache(submodule);
-       refs->next = submodule_ref_caches;
-       submodule_ref_caches = refs;
+/*
+ * Return a pointer to a ref_cache for the specified submodule. For
+ * the main repository, use submodule==NULL. The returned structure
+ * will be allocated and initialized but not necessarily populated; it
+ * should not be freed.
+ */
+static struct ref_cache *get_ref_cache(const char *submodule)
+{
+       struct ref_cache *refs = lookup_ref_cache(submodule);
+       if (!refs)
+               refs = create_ref_cache(submodule);
        return refs;
 }
 
@@ -1336,16 +1338,24 @@ static int resolve_gitlink_ref_recursive(struct ref_cache *refs,
 int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
 {
        int len = strlen(path), retval;
-       char *submodule;
+       struct strbuf submodule = STRBUF_INIT;
        struct ref_cache *refs;
 
        while (len && path[len-1] == '/')
                len--;
        if (!len)
                return -1;
-       submodule = xstrndup(path, len);
-       refs = get_ref_cache(submodule);
-       free(submodule);
+
+       strbuf_add(&submodule, path, len);
+       refs = lookup_ref_cache(submodule.buf);
+       if (!refs) {
+               if (!is_nonbare_repository_dir(&submodule)) {
+                       strbuf_release(&submodule);
+                       return -1;
+               }
+               refs = create_ref_cache(submodule.buf);
+       }
+       strbuf_release(&submodule);
 
        retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0);
        return retval;
@@ -2173,10 +2183,9 @@ static int pack_if_possible_fn(struct ref_entry *entry, void *cb_data)
 
        /* Schedule the loose reference for pruning if requested. */
        if ((cb->flags & PACK_REFS_PRUNE)) {
-               int namelen = strlen(entry->name) + 1;
-               struct ref_to_prune *n = xcalloc(1, sizeof(*n) + namelen);
+               struct ref_to_prune *n;
+               FLEX_ALLOC_STR(n, name, entry->name);
                hashcpy(n->sha1, entry->u.value.oid.hash);
-               memcpy(n->name, entry->name, namelen); /* includes NUL */
                n->next = cb->ref_to_prune;
                cb->ref_to_prune = n;
        }
index f404faf0f4b9ec298ccbae34fae0c79283884d26..e65ea597641d9b7a0f83b7d09a3b45f82394d1ef 100644 (file)
@@ -439,8 +439,20 @@ static int run_slot(struct active_request_slot *slot,
        err = run_one_slot(slot, results);
 
        if (err != HTTP_OK && err != HTTP_REAUTH) {
-               error("RPC failed; result=%d, HTTP code = %ld",
-                     results->curl_result, results->http_code);
+               struct strbuf msg = STRBUF_INIT;
+               if (results->http_code && results->http_code != 200)
+                       strbuf_addf(&msg, "HTTP %ld", results->http_code);
+               if (results->curl_result != CURLE_OK) {
+                       if (msg.len)
+                               strbuf_addch(&msg, ' ');
+                       strbuf_addf(&msg, "curl %d", results->curl_result);
+                       if (curl_errorstr[0]) {
+                               strbuf_addch(&msg, ' ');
+                               strbuf_addstr(&msg, curl_errorstr);
+                       }
+               }
+               error("RPC failed; %s", msg.buf);
+               strbuf_release(&msg);
        }
 
        return err;
@@ -696,9 +708,10 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads)
 static int fetch_dumb(int nr_heads, struct ref **to_fetch)
 {
        struct walker *walker;
-       char **targets = xmalloc(nr_heads * sizeof(char*));
+       char **targets;
        int ret, i;
 
+       ALLOC_ARRAY(targets, nr_heads);
        if (options.depth)
                die("dumb http transport does not support --depth");
        for (i = 0; i < nr_heads; i++)
@@ -845,23 +858,22 @@ static void parse_fetch(struct strbuf *buf)
 
 static int push_dav(int nr_spec, char **specs)
 {
-       const char **argv = xmalloc((10 + nr_spec) * sizeof(char*));
-       int argc = 0, i;
+       struct child_process child = CHILD_PROCESS_INIT;
+       size_t i;
 
-       argv[argc++] = "http-push";
-       argv[argc++] = "--helper-status";
+       child.git_cmd = 1;
+       argv_array_push(&child.args, "http-push");
+       argv_array_push(&child.args, "--helper-status");
        if (options.dry_run)
-               argv[argc++] = "--dry-run";
+               argv_array_push(&child.args, "--dry-run");
        if (options.verbosity > 1)
-               argv[argc++] = "--verbose";
-       argv[argc++] = url.buf;
+               argv_array_push(&child.args, "--verbose");
+       argv_array_push(&child.args, url.buf);
        for (i = 0; i < nr_spec; i++)
-               argv[argc++] = specs[i];
-       argv[argc++] = NULL;
+               argv_array_push(&child.args, specs[i]);
 
-       if (run_command_v_opt(argv, RUN_GIT_CMD))
-               die("git-%s failed", argv[0]);
-       free(argv);
+       if (run_command(&child))
+               die("git-http-push failed");
        return 0;
 }
 
index 9d34b5a5dafa217e2ce9cb1b7e9a4ab74908f7af..6e5c1a876f5044ffdea71531695ce04305b072f1 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -928,7 +928,7 @@ static struct ref *alloc_ref_with_prefix(const char *prefix, size_t prefixlen,
                const char *name)
 {
        size_t len = strlen(name);
-       struct ref *ref = xcalloc(1, sizeof(struct ref) + prefixlen + len + 1);
+       struct ref *ref = xcalloc(1, st_add4(sizeof(*ref), prefixlen, len, 1));
        memcpy(ref->name, prefix, prefixlen);
        memcpy(ref->name + prefixlen, name, len);
        return ref;
@@ -945,9 +945,9 @@ struct ref *copy_ref(const struct ref *ref)
        size_t len;
        if (!ref)
                return NULL;
-       len = strlen(ref->name);
-       cpy = xmalloc(sizeof(struct ref) + len + 1);
-       memcpy(cpy, ref, sizeof(struct ref) + len + 1);
+       len = st_add3(sizeof(struct ref), strlen(ref->name), 1);
+       cpy = xmalloc(len);
+       memcpy(cpy, ref, len);
        cpy->next = NULL;
        cpy->symref = xstrdup_or_null(ref->symref);
        cpy->remote_status = xstrdup_or_null(ref->remote_status);
@@ -1545,11 +1545,8 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
                }
 
                /*
-                * Bypass the usual "must fast-forward" check but
-                * replace it with a weaker "the old value must be
-                * this value we observed".  If the remote ref has
-                * moved and is now different from what we expect,
-                * reject any push.
+                * If the remote ref has moved and is now different
+                * from what we expect, reject any push.
                 *
                 * It also is an error if the user told us to check
                 * with the remote-tracking branch to find the value
@@ -1560,10 +1557,14 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
                        if (ref->expect_old_no_trackback ||
                            oidcmp(&ref->old_oid, &ref->old_oid_expect))
                                reject_reason = REF_STATUS_REJECT_STALE;
+                       else
+                               /* If the ref isn't stale then force the update. */
+                               force_ref_update = 1;
                }
 
                /*
-                * The usual "must fast-forward" rules.
+                * If the update isn't already rejected then check
+                * the usual "must fast-forward" rules.
                 *
                 * Decide whether an individual refspec A:B can be
                 * pushed.  The push will succeed if any of the
@@ -1582,7 +1583,7 @@ void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
                 *     passing the --force argument
                 */
 
-               else if (!ref->deletion && !is_null_oid(&ref->old_oid)) {
+               if (!reject_reason && !ref->deletion && !is_null_oid(&ref->old_oid)) {
                        if (starts_with(ref->name, "refs/tags/"))
                                reject_reason = REF_STATUS_REJECT_ALREADY_EXISTS;
                        else if (!has_object_file(&ref->old_oid))
@@ -2132,16 +2133,13 @@ static int one_local_ref(const char *refname, const struct object_id *oid,
 {
        struct ref ***local_tail = cb_data;
        struct ref *ref;
-       int len;
 
        /* we already know it starts with refs/ to get here */
        if (check_refname_format(refname + 5, 0))
                return 0;
 
-       len = strlen(refname) + 1;
-       ref = xcalloc(1, sizeof(*ref) + len);
+       ref = alloc_ref(refname);
        oidcpy(&ref->new_oid, oid);
-       memcpy(ref->name, refname, len);
        **local_tail = ref;
        *local_tail = &ref->next;
        return 0;
index 0a282f533b3e225a996221d614de8bdc960092a3..df56fcea0e12a11a35414fc5e1c14d1675436671 100644 (file)
@@ -540,7 +540,7 @@ struct treesame_state {
 static struct treesame_state *initialise_treesame(struct rev_info *revs, struct commit *commit)
 {
        unsigned n = commit_list_count(commit->parents);
-       struct treesame_state *st = xcalloc(1, sizeof(*st) + n);
+       struct treesame_state *st = xcalloc(1, st_add(sizeof(*st), n));
        st->nparents = n;
        add_decoration(&revs->treesame, &commit->object, st);
        return st;
@@ -2049,7 +2049,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
        } else if (!strcmp(arg, "--ignore-missing")) {
                revs->ignore_missing = 1;
        } else {
-               int opts = diff_opt_parse(&revs->diffopt, argv, argc);
+               int opts = diff_opt_parse(&revs->diffopt, argv, argc, revs->prefix);
                if (!opts)
                        unkv[(*unkc)++] = arg;
                return opts;
index 13fa452e8c3d5a5e20e24a969d53ce7ade4019bf..2392b1efe829bf40ab1f896d160ac28c9bc057e0 100644 (file)
@@ -158,50 +158,41 @@ int sane_execvp(const char *file, char * const argv[])
        return -1;
 }
 
-static const char **prepare_shell_cmd(const char **argv)
+static const char **prepare_shell_cmd(struct argv_array *out, const char **argv)
 {
-       int argc, nargc = 0;
-       const char **nargv;
-
-       for (argc = 0; argv[argc]; argc++)
-               ; /* just counting */
-       /* +1 for NULL, +3 for "sh -c" plus extra $0 */
-       nargv = xmalloc(sizeof(*nargv) * (argc + 1 + 3));
-
-       if (argc < 1)
+       if (!argv[0])
                die("BUG: shell command is empty");
 
        if (strcspn(argv[0], "|&;<>()$`\\\"' \t\n*?[#~=%") != strlen(argv[0])) {
 #ifndef GIT_WINDOWS_NATIVE
-               nargv[nargc++] = SHELL_PATH;
+               argv_array_push(out, SHELL_PATH);
 #else
-               nargv[nargc++] = "sh";
+               argv_array_push(out, "sh");
 #endif
-               nargv[nargc++] = "-c";
-
-               if (argc < 2)
-                       nargv[nargc++] = argv[0];
-               else {
-                       struct strbuf arg0 = STRBUF_INIT;
-                       strbuf_addf(&arg0, "%s \"$@\"", argv[0]);
-                       nargv[nargc++] = strbuf_detach(&arg0, NULL);
-               }
-       }
+               argv_array_push(out, "-c");
 
-       for (argc = 0; argv[argc]; argc++)
-               nargv[nargc++] = argv[argc];
-       nargv[nargc] = NULL;
+               /*
+                * If we have no extra arguments, we do not even need to
+                * bother with the "$@" magic.
+                */
+               if (!argv[1])
+                       argv_array_push(out, argv[0]);
+               else
+                       argv_array_pushf(out, "%s \"$@\"", argv[0]);
+       }
 
-       return nargv;
+       argv_array_pushv(out, argv);
+       return out->argv;
 }
 
 #ifndef GIT_WINDOWS_NATIVE
 static int execv_shell_cmd(const char **argv)
 {
-       const char **nargv = prepare_shell_cmd(argv);
-       trace_argv_printf(nargv, "trace: exec:");
-       sane_execvp(nargv[0], (char **)nargv);
-       free(nargv);
+       struct argv_array nargv = ARGV_ARRAY_INIT;
+       prepare_shell_cmd(&nargv, argv);
+       trace_argv_printf(nargv.argv, "trace: exec:");
+       sane_execvp(nargv.argv[0], (char **)nargv.argv);
+       argv_array_clear(&nargv);
        return -1;
 }
 #endif
@@ -455,6 +446,7 @@ int start_command(struct child_process *cmd)
 {
        int fhin = 0, fhout = 1, fherr = 2;
        const char **sargv = cmd->argv;
+       struct argv_array nargv = ARGV_ARRAY_INIT;
 
        if (cmd->no_stdin)
                fhin = open("/dev/null", O_RDWR);
@@ -480,9 +472,9 @@ int start_command(struct child_process *cmd)
                fhout = dup(cmd->out);
 
        if (cmd->git_cmd)
-               cmd->argv = prepare_git_cmd(cmd->argv);
+               cmd->argv = prepare_git_cmd(&nargv, cmd->argv);
        else if (cmd->use_shell)
-               cmd->argv = prepare_shell_cmd(cmd->argv);
+               cmd->argv = prepare_shell_cmd(&nargv, cmd->argv);
 
        cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, (char**) cmd->env,
                        cmd->dir, fhin, fhout, fherr);
@@ -492,9 +484,7 @@ int start_command(struct child_process *cmd)
        if (cmd->clean_on_exit && cmd->pid >= 0)
                mark_child_for_cleanup(cmd->pid);
 
-       if (cmd->git_cmd)
-               free(cmd->argv);
-
+       argv_array_clear(&nargv);
        cmd->argv = sargv;
        if (fhin != 0)
                close(fhin);
@@ -633,6 +623,11 @@ int in_async(void)
        return !pthread_equal(main_thread, pthread_self());
 }
 
+void NORETURN async_exit(int code)
+{
+       pthread_exit((void *)(intptr_t)code);
+}
+
 #else
 
 static struct {
@@ -678,6 +673,11 @@ int in_async(void)
        return process_is_async;
 }
 
+void NORETURN async_exit(int code)
+{
+       exit(code);
+}
+
 #endif
 
 int start_async(struct async *async)
index 12bb26c2a6155750203babfec47b08e8bde0ad27..c0969c7695f6b550b382b5704ceb9b2c23b3e3e0 100644 (file)
@@ -121,5 +121,6 @@ struct async {
 int start_async(struct async *async);
 int finish_async(struct async *async);
 int in_async(void);
+void NORETURN async_exit(int code);
 
 #endif
index 8c58fa2f4ddaaadb09a63ef5a1937b4282ed988a..e60e75ad749a18a3c12d95475f95e67e455ab371 100644 (file)
@@ -124,42 +124,33 @@ static const char *action_name(const struct replay_opts *opts)
 
 struct commit_message {
        char *parent_label;
-       const char *label;
-       const char *subject;
+       char *label;
+       char *subject;
        const char *message;
 };
 
 static int get_message(struct commit *commit, struct commit_message *out)
 {
        const char *abbrev, *subject;
-       int abbrev_len, subject_len;
-       char *q;
-
-       if (!git_commit_encoding)
-               git_commit_encoding = "UTF-8";
+       int subject_len;
 
-       out->message = logmsg_reencode(commit, NULL, git_commit_encoding);
+       out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
        abbrev = find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV);
-       abbrev_len = strlen(abbrev);
 
        subject_len = find_commit_subject(out->message, &subject);
 
-       out->parent_label = xmalloc(strlen("parent of ") + abbrev_len +
-                             strlen("... ") + subject_len + 1);
-       q = out->parent_label;
-       q = mempcpy(q, "parent of ", strlen("parent of "));
-       out->label = q;
-       q = mempcpy(q, abbrev, abbrev_len);
-       q = mempcpy(q, "... ", strlen("... "));
-       out->subject = q;
-       q = mempcpy(q, subject, subject_len);
-       *q = '\0';
+       out->subject = xmemdupz(subject, subject_len);
+       out->label = xstrfmt("%s... %s", abbrev, out->subject);
+       out->parent_label = xstrfmt("parent of %s", out->label);
+
        return 0;
 }
 
 static void free_message(struct commit *commit, struct commit_message *msg)
 {
        free(msg->parent_label);
+       free(msg->label);
+       free(msg->subject);
        unuse_commit_buffer(commit, msg->message);
 }
 
diff --git a/setup.c b/setup.c
index d34372520b05a2acee36f02ddc2ef68dde4b65fd..de1a2a7ea5973fef256328a26730117466c15172 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -88,7 +88,7 @@ char *prefix_path_gently(const char *prefix, int len,
        const char *orig = path;
        char *sanitized;
        if (is_absolute_path(orig)) {
-               sanitized = xmalloc(strlen(path) + 1);
+               sanitized = xmallocz(strlen(path));
                if (remaining_prefix)
                        *remaining_prefix = 0;
                if (normalize_path_copy_len(sanitized, path, remaining_prefix)) {
@@ -139,9 +139,7 @@ int check_filename(const char *prefix, const char *arg)
                if (arg[2] == '\0') /* ":/" is root dir, always exists */
                        return 1;
                name = arg + 2;
-       } else if (!no_wildcard(arg))
-               return 1;
-       else if (prefix)
+       } else if (prefix)
                name = prefix_filename(prefix, strlen(prefix), arg);
        else
                name = arg;
@@ -202,7 +200,7 @@ void verify_filename(const char *prefix,
 {
        if (*arg == '-')
                die("bad flag '%s' used after filename", arg);
-       if (check_filename(prefix, arg))
+       if (check_filename(prefix, arg) || !no_wildcard(arg))
                return;
        die_verify_filename(prefix, arg, diagnose_misspelt_rev);
 }
@@ -312,6 +310,23 @@ int is_git_directory(const char *suspect)
        return ret;
 }
 
+int is_nonbare_repository_dir(struct strbuf *path)
+{
+       int ret = 0;
+       int gitfile_error;
+       size_t orig_path_len = path->len;
+       assert(orig_path_len != 0);
+       strbuf_complete(path, '/');
+       strbuf_addstr(path, ".git");
+       if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
+               ret = 1;
+       if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
+           gitfile_error == READ_GITFILE_ERR_READ_FAILED)
+               ret = 1;
+       strbuf_setlen(path, orig_path_len);
+       return ret;
+}
+
 int is_inside_git_dir(void)
 {
        if (inside_git_dir < 0)
@@ -434,17 +449,6 @@ static int check_repository_format_gently(const char *gitdir, int *nongit_ok)
        return ret;
 }
 
-static void update_linked_gitdir(const char *gitfile, const char *gitdir)
-{
-       struct strbuf path = STRBUF_INIT;
-       struct stat st;
-
-       strbuf_addf(&path, "%s/gitdir", gitdir);
-       if (stat(path.buf, &st) || st.st_mtime + 24 * 3600 < time(NULL))
-               write_file(path.buf, "%s", gitfile);
-       strbuf_release(&path);
-}
-
 /*
  * Try to read the location of the git directory from the .git file,
  * return path to git directory if found.
@@ -482,14 +486,13 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
                error_code = READ_GITFILE_ERR_OPEN_FAILED;
                goto cleanup_return;
        }
-       buf = xmalloc(st.st_size + 1);
+       buf = xmallocz(st.st_size);
        len = read_in_full(fd, buf, st.st_size);
        close(fd);
        if (len != st.st_size) {
                error_code = READ_GITFILE_ERR_READ_FAILED;
                goto cleanup_return;
        }
-       buf[len] = '\0';
        if (!starts_with(buf, "gitdir: ")) {
                error_code = READ_GITFILE_ERR_INVALID_FORMAT;
                goto cleanup_return;
@@ -514,7 +517,6 @@ const char *read_gitfile_gently(const char *path, int *return_error_code)
                error_code = READ_GITFILE_ERR_NOT_A_REPO;
                goto cleanup_return;
        }
-       update_linked_gitdir(path, dir);
        path = real_path(dir);
 
 cleanup_return:
index 73ccd49a465b1cf8b668edf8c13ea75d6b8de718..ab16c7b98cbd72bc79e8c0866417889626e2e71a 100644 (file)
@@ -253,7 +253,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
 {
        struct alternate_object_database *ent;
        struct alternate_object_database *alt;
-       int pfxlen, entlen;
+       size_t pfxlen, entlen;
        struct strbuf pathbuf = STRBUF_INIT;
 
        if (!is_absolute_path(entry) && relative_base) {
@@ -273,8 +273,8 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
        while (pfxlen && pathbuf.buf[pfxlen-1] == '/')
                pfxlen -= 1;
 
-       entlen = pfxlen + 43; /* '/' + 2 hex + '/' + 38 hex + NUL */
-       ent = xmalloc(sizeof(*ent) + entlen);
+       entlen = st_add(pfxlen, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */
+       ent = xmalloc(st_add(sizeof(*ent), entlen));
        memcpy(ent->base, pathbuf.buf, pfxlen);
        strbuf_release(&pathbuf);
 
@@ -1134,7 +1134,7 @@ unsigned char *use_pack(struct packed_git *p,
 
 static struct packed_git *alloc_packed_git(int extra)
 {
-       struct packed_git *p = xmalloc(sizeof(*p) + extra);
+       struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
        memset(p, 0, sizeof(*p));
        p->pack_fd = -1;
        return p;
@@ -1168,7 +1168,7 @@ struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
         * ".pack" is long enough to hold any suffix we're adding (and
         * the use xsnprintf double-checks that)
         */
-       alloc = path_len + strlen(".pack") + 1;
+       alloc = st_add3(path_len, strlen(".pack"), 1);
        p = alloc_packed_git(alloc);
        memcpy(p->pack_name, path, path_len);
 
@@ -1196,7 +1196,7 @@ struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
 struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
 {
        const char *path = sha1_pack_name(sha1);
-       int alloc = strlen(path) + 1;
+       size_t alloc = st_add(strlen(path), 1);
        struct packed_git *p = alloc_packed_git(alloc);
 
        memcpy(p->pack_name, path, alloc); /* includes NUL */
@@ -1413,10 +1413,12 @@ static void mark_bad_packed_object(struct packed_git *p,
 {
        unsigned i;
        for (i = 0; i < p->num_bad_objects; i++)
-               if (!hashcmp(sha1, p->bad_object_sha1 + 20 * i))
+               if (!hashcmp(sha1, p->bad_object_sha1 + GIT_SHA1_RAWSZ * i))
                        return;
-       p->bad_object_sha1 = xrealloc(p->bad_object_sha1, 20 * (p->num_bad_objects + 1));
-       hashcpy(p->bad_object_sha1 + 20 * p->num_bad_objects, sha1);
+       p->bad_object_sha1 = xrealloc(p->bad_object_sha1,
+                                     st_mult(GIT_SHA1_RAWSZ,
+                                             st_add(p->num_bad_objects, 1)));
+       hashcpy(p->bad_object_sha1 + GIT_SHA1_RAWSZ * p->num_bad_objects, sha1);
        p->num_bad_objects++;
 }
 
@@ -1942,7 +1944,7 @@ static enum object_type packed_to_object_type(struct packed_git *p,
                /* Push the object we're going to leave behind */
                if (poi_stack_nr >= poi_stack_alloc && poi_stack == small_poi_stack) {
                        poi_stack_alloc = alloc_nr(poi_stack_nr);
-                       poi_stack = xmalloc(sizeof(off_t)*poi_stack_alloc);
+                       ALLOC_ARRAY(poi_stack, poi_stack_alloc);
                        memcpy(poi_stack, small_poi_stack, sizeof(off_t)*poi_stack_nr);
                } else {
                        ALLOC_GROW(poi_stack, poi_stack_nr+1, poi_stack_alloc);
@@ -2308,7 +2310,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                if (delta_stack_nr >= delta_stack_alloc
                    && delta_stack == small_delta_stack) {
                        delta_stack_alloc = alloc_nr(delta_stack_nr);
-                       delta_stack = xmalloc(sizeof(*delta_stack)*delta_stack_alloc);
+                       ALLOC_ARRAY(delta_stack, delta_stack_alloc);
                        memcpy(delta_stack, small_delta_stack,
                               sizeof(*delta_stack)*delta_stack_nr);
                } else {
index 892db21813bc484628e940274e742d103629b0ed..ab5a163c9bab7f5799011b984715ed1ca9deed10 100644 (file)
@@ -87,9 +87,8 @@ static void find_short_object_filename(int len, const char *hex_pfx, struct disa
                 * object databases including our own.
                 */
                const char *objdir = get_object_directory();
-               int objdir_len = strlen(objdir);
-               int entlen = objdir_len + 43;
-               fakeent = xmalloc(sizeof(*fakeent) + entlen);
+               size_t objdir_len = strlen(objdir);
+               fakeent = xmalloc(st_add3(sizeof(*fakeent), objdir_len, 43));
                memcpy(fakeent->base, objdir, objdir_len);
                fakeent->name = fakeent->base + objdir_len + 1;
                fakeent->name[-1] = '/';
@@ -882,12 +881,12 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1,
 
        if (prefix[0] == '!') {
                if (prefix[1] != '!')
-                       die ("Invalid search pattern: %s", prefix);
+                       return -1;
                prefix++;
        }
 
        if (regcomp(&regex, prefix, REG_EXTENDED))
-               die("Invalid search pattern: %s", prefix);
+               return -1;
 
        for (l = list; l; l = l->next) {
                l->item->object.flags |= ONELINE_SEEN;
index 60f1505d9791bc92a283d02183da35e7542ad2dc..4d554caf8d751d7a7c8a3a4286a208e0959ab513 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -315,8 +315,8 @@ void prepare_shallow_info(struct shallow_info *info, struct sha1_array *sa)
        info->shallow = sa;
        if (!sa)
                return;
-       info->ours = xmalloc(sizeof(*info->ours) * sa->nr);
-       info->theirs = xmalloc(sizeof(*info->theirs) * sa->nr);
+       ALLOC_ARRAY(info->ours, sa->nr);
+       ALLOC_ARRAY(info->theirs, sa->nr);
        for (i = 0; i < sa->nr; i++) {
                if (has_sha1_file(sa->sha1[i])) {
                        struct commit_graft *graft;
@@ -389,7 +389,7 @@ static void paint_down(struct paint_info *info, const unsigned char *sha1,
        unsigned int i, nr;
        struct commit_list *head = NULL;
        int bitmap_nr = (info->nr_bits + 31) / 32;
-       int bitmap_size = bitmap_nr * sizeof(uint32_t);
+       size_t bitmap_size = st_mult(bitmap_nr, sizeof(uint32_t));
        uint32_t *tmp = xmalloc(bitmap_size); /* to be freed before return */
        uint32_t *bitmap = paint_alloc(info);
        struct commit *c = lookup_commit_reference_gently(sha1, 1);
@@ -487,7 +487,7 @@ void assign_shallow_commits_to_refs(struct shallow_info *info,
        struct paint_info pi;
 
        trace_printf_key(&trace_shallow, "shallow: assign_shallow_commits_to_refs\n");
-       shallow = xmalloc(sizeof(*shallow) * (info->nr_ours + info->nr_theirs));
+       ALLOC_ARRAY(shallow, info->nr_ours + info->nr_theirs);
        for (i = 0; i < info->nr_ours; i++)
                shallow[nr_shallow++] = info->ours[i];
        for (i = 0; i < info->nr_theirs; i++)
index d9e4903fed24f5916962f8d315eb680f9b4013ff..acf8d5445ad96aacf6d2c3ccc2d77a3815291228 100644 (file)
@@ -50,7 +50,8 @@ int main(int argc, char **argv)
                        unsigned char sha1[20];
                        uint32_t crc;
                        uint32_t off;
-               } *entries = xmalloc(nr * sizeof(entries[0]));
+               } *entries;
+               ALLOC_ARRAY(entries, nr);
                for (i = 0; i < nr; i++)
                        if (fread(entries[i].sha1, 20, 1, stdin) != 1)
                                die("unable to read sha1 %u/%u", i, nr);
index d76f0aed85c4ec6eafdcfd1a8ee2b22d3d20df96..de7a7c273095e4f5907260ddda50bef375381783 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -685,7 +685,7 @@ char *xstrdup_tolower(const char *string)
        size_t len, i;
 
        len = strlen(string);
-       result = xmalloc(len + 1);
+       result = xmallocz(len);
        for (i = 0; i < len; i++)
                result[i] = tolower(string[i]);
        result[i] = '\0';
index 14e76247bf107da916cf100b8078cf10238e6b76..2a6cc9e8bab8f8ac198d7621131bcd70b38956a3 100644 (file)
@@ -68,7 +68,7 @@ int update_path_in_gitmodules(const char *oldpath, const char *newpath)
        strbuf_addstr(&entry, "submodule.");
        strbuf_addstr(&entry, submodule->name);
        strbuf_addstr(&entry, ".path");
-       if (git_config_set_in_file(".gitmodules", entry.buf, newpath) < 0) {
+       if (git_config_set_in_file_gently(".gitmodules", entry.buf, newpath) < 0) {
                /* Maybe the user already did that, don't error out here */
                warning(_("Could not update .gitmodules entry %s"), entry.buf);
                strbuf_release(&entry);
@@ -122,7 +122,7 @@ static int add_submodule_odb(const char *path)
        struct strbuf objects_directory = STRBUF_INIT;
        struct alternate_object_database *alt_odb;
        int ret = 0;
-       int alloc;
+       size_t alloc;
 
        strbuf_git_path_submodule(&objects_directory, path, "objects/");
        if (!is_directory(objects_directory.buf)) {
@@ -137,8 +137,8 @@ static int add_submodule_odb(const char *path)
                                        objects_directory.len))
                        goto done;
 
-       alloc = objects_directory.len + 42; /* for "12/345..." sha1 */
-       alt_odb = xmalloc(sizeof(*alt_odb) + alloc);
+       alloc = st_add(objects_directory.len, 42); /* for "12/345..." sha1 */
+       alt_odb = xmalloc(st_add(sizeof(*alt_odb), alloc));
        alt_odb->next = alt_odb_list;
        xsnprintf(alt_odb->base, alloc, "%s", objects_directory.buf);
        alt_odb->name = alt_odb->base + objects_directory.len;
@@ -1034,11 +1034,9 @@ void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
        /* Update core.worktree setting */
        strbuf_reset(&file_name);
        strbuf_addf(&file_name, "%s/config", git_dir);
-       if (git_config_set_in_file(file_name.buf, "core.worktree",
-                                  relative_path(real_work_tree, git_dir,
-                                                &rel_path)))
-               die(_("Could not set core.worktree in %s"),
-                   file_name.buf);
+       git_config_set_in_file(file_name.buf, "core.worktree",
+                              relative_path(real_work_tree, git_dir,
+                                            &rel_path));
 
        strbuf_release(&file_name);
        strbuf_release(&rel_path);
index ec94cdd657f838020b3bea32ac8b81caf481a4a9..7c1888a27e7fcf090698ec5ac60db72c76fbb807 100755 (executable)
@@ -28,4 +28,8 @@ test_perf 'clean many untracked sub dirs, ignore nested git' '
        git clean -n -q -f -f -d 100000_sub_dirs/
 '
 
+test_perf 'ls-files -o' '
+       git ls-files -o
+'
+
 test_done
index 9670e8cbe6cb9a9faa3519b0f11dc16713496188..3afe0125c99f037b9f144806c00435dcba3f93ea 100755 (executable)
@@ -99,7 +99,7 @@ test_expect_success 'check rev-list' '
        test "$SHA" = "$(git rev-list HEAD)"
 '
 
-test_expect_success 'setup_git_dir twice in subdir' '
+test_expect_failure 'setup_git_dir twice in subdir' '
        git init sgd &&
        (
                cd sgd &&
index 627ef854d5c804c0248a728862fdf9d4ea344568..f0152a7ab4aabd4f47f546c038efcd8503adc9a4 100755 (executable)
@@ -59,6 +59,9 @@ case $(uname -s) in
        ;;
 esac
 
+test_expect_success basename 'test-path-utils basename'
+test_expect_success dirname 'test-path-utils dirname'
+
 norm_path "" ""
 norm_path . ""
 norm_path ./ ""
index b79049f6f606f106e40dfdc241d7a168b10b88cb..17a194bfa6e80871f6cb002e1ee3bcd0c832be84 100755 (executable)
@@ -325,4 +325,17 @@ test_expect_success 'parsing reverse reflogs at BUFSIZ boundaries' '
        test_cmp expect actual
 '
 
+test_expect_success 'no segfaults for reflog containing non-commit sha1s' '
+       git update-ref --create-reflog -m "Creating ref" \
+               refs/tests/tree-in-reflog HEAD &&
+       git update-ref -m "Forcing tree" refs/tests/tree-in-reflog HEAD^{tree} &&
+       git update-ref -m "Restoring to commit" refs/tests/tree-in-reflog HEAD &&
+       git reflog refs/tests/tree-in-reflog
+'
+
+test_expect_failure 'reflog with non-commit entries displays all entries' '
+       git reflog refs/tests/tree-in-reflog >actual &&
+       test_line_count = 3 actual
+'
+
 test_done
diff --git a/t/t1501-work-tree.sh b/t/t1501-work-tree.sh
new file mode 100755 (executable)
index 0000000..cc5b870
--- /dev/null
@@ -0,0 +1,426 @@
+#!/bin/sh
+
+test_description='test separate work tree'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       EMPTY_TREE=$(git write-tree) &&
+       EMPTY_BLOB=$(git hash-object -t blob --stdin </dev/null) &&
+       CHANGED_BLOB=$(echo changed | git hash-object -t blob --stdin) &&
+       EMPTY_BLOB7=$(echo $EMPTY_BLOB | sed "s/\(.......\).*/\1/") &&
+       CHANGED_BLOB7=$(echo $CHANGED_BLOB | sed "s/\(.......\).*/\1/") &&
+
+       mkdir -p work/sub/dir &&
+       mkdir -p work2 &&
+       mv .git repo.git
+'
+
+test_expect_success 'setup: helper for testing rev-parse' '
+       test_rev_parse() {
+               echo $1 >expected.bare &&
+               echo $2 >expected.inside-git &&
+               echo $3 >expected.inside-worktree &&
+               if test $# -ge 4
+               then
+                       echo $4 >expected.prefix
+               fi &&
+
+               git rev-parse --is-bare-repository >actual.bare &&
+               git rev-parse --is-inside-git-dir >actual.inside-git &&
+               git rev-parse --is-inside-work-tree >actual.inside-worktree &&
+               if test $# -ge 4
+               then
+                       git rev-parse --show-prefix >actual.prefix
+               fi &&
+
+               test_cmp expected.bare actual.bare &&
+               test_cmp expected.inside-git actual.inside-git &&
+               test_cmp expected.inside-worktree actual.inside-worktree &&
+               if test $# -ge 4
+               then
+                       # rev-parse --show-prefix should output
+                       # a single newline when at the top of the work tree,
+                       # but we test for that separately.
+                       test -z "$4" && ! test -s actual.prefix ||
+                       test_cmp expected.prefix actual.prefix
+               fi
+       }
+'
+
+test_expect_success 'setup: core.worktree = relative path' '
+       sane_unset GIT_WORK_TREE &&
+       GIT_DIR=repo.git &&
+       GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
+       export GIT_DIR GIT_CONFIG &&
+       git config core.worktree ../work
+'
+
+test_expect_success 'outside' '
+       test_rev_parse false false false
+'
+
+test_expect_success 'inside work tree' '
+       (
+               cd work &&
+               GIT_DIR=../repo.git &&
+               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
+               test_rev_parse false false true ""
+       )
+'
+
+test_expect_success 'empty prefix is actually written out' '
+       echo >expected &&
+       (
+               cd work &&
+               GIT_DIR=../repo.git &&
+               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
+               git rev-parse --show-prefix >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success 'subdir of work tree' '
+       (
+               cd work/sub/dir &&
+               GIT_DIR=../../../repo.git &&
+               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
+               test_rev_parse false false true sub/dir/
+       )
+'
+
+test_expect_success 'setup: core.worktree = absolute path' '
+       sane_unset GIT_WORK_TREE &&
+       GIT_DIR=$(pwd)/repo.git &&
+       GIT_CONFIG=$GIT_DIR/config &&
+       export GIT_DIR GIT_CONFIG &&
+       git config core.worktree "$(pwd)/work"
+'
+
+test_expect_success 'outside' '
+       test_rev_parse false false false &&
+       (
+               cd work2 &&
+               test_rev_parse false false false
+       )
+'
+
+test_expect_success 'inside work tree' '
+       (
+               cd work &&
+               test_rev_parse false false true ""
+       )
+'
+
+test_expect_success 'subdir of work tree' '
+       (
+               cd work/sub/dir &&
+               test_rev_parse false false true sub/dir/
+       )
+'
+
+test_expect_success 'setup: GIT_WORK_TREE=relative (override core.worktree)' '
+       GIT_DIR=$(pwd)/repo.git &&
+       GIT_CONFIG=$GIT_DIR/config &&
+       git config core.worktree non-existent &&
+       GIT_WORK_TREE=work &&
+       export GIT_DIR GIT_CONFIG GIT_WORK_TREE
+'
+
+test_expect_success 'outside' '
+       test_rev_parse false false false &&
+       (
+               cd work2 &&
+               test_rev_parse false false false
+       )
+'
+
+test_expect_success 'inside work tree' '
+       (
+               cd work &&
+               GIT_WORK_TREE=. &&
+               test_rev_parse false false true ""
+       )
+'
+
+test_expect_success 'subdir of work tree' '
+       (
+               cd work/sub/dir &&
+               GIT_WORK_TREE=../.. &&
+               test_rev_parse false false true sub/dir/
+       )
+'
+
+test_expect_success 'setup: GIT_WORK_TREE=absolute, below git dir' '
+       mv work repo.git/work &&
+       mv work2 repo.git/work2 &&
+       GIT_DIR=$(pwd)/repo.git &&
+       GIT_CONFIG=$GIT_DIR/config &&
+       GIT_WORK_TREE=$(pwd)/repo.git/work &&
+       export GIT_DIR GIT_CONFIG GIT_WORK_TREE
+'
+
+test_expect_success 'outside' '
+       echo outside &&
+       test_rev_parse false false false
+'
+
+test_expect_success 'in repo.git' '
+       (
+               cd repo.git &&
+               test_rev_parse false true false
+       ) &&
+       (
+               cd repo.git/objects &&
+               test_rev_parse false true false
+       ) &&
+       (
+               cd repo.git/work2 &&
+               test_rev_parse false true false
+       )
+'
+
+test_expect_success 'inside work tree' '
+       (
+               cd repo.git/work &&
+               test_rev_parse false true true ""
+       )
+'
+
+test_expect_success 'subdir of work tree' '
+       (
+               cd repo.git/work/sub/dir &&
+               test_rev_parse false true true sub/dir/
+       )
+'
+
+test_expect_success 'find work tree from repo' '
+       echo sub/dir/untracked >expected &&
+       cat <<-\EOF >repo.git/work/.gitignore &&
+       expected.*
+       actual.*
+       .gitignore
+       EOF
+       >repo.git/work/sub/dir/untracked &&
+       (
+               cd repo.git &&
+               git ls-files --others --exclude-standard >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success 'find work tree from work tree' '
+       echo sub/dir/tracked >expected &&
+       >repo.git/work/sub/dir/tracked &&
+       (
+               cd repo.git/work/sub/dir &&
+               git --git-dir=../../.. add tracked
+       ) &&
+       (
+               cd repo.git &&
+               git ls-files >../actual
+       ) &&
+       test_cmp expected actual
+'
+
+test_expect_success '_gently() groks relative GIT_DIR & GIT_WORK_TREE' '
+       (
+               cd repo.git/work/sub/dir &&
+               GIT_DIR=../../.. &&
+               GIT_WORK_TREE=../.. &&
+               GIT_PAGER= &&
+               export GIT_DIR GIT_WORK_TREE GIT_PAGER &&
+
+               git diff --exit-code tracked &&
+               echo changed >tracked &&
+               test_must_fail git diff --exit-code tracked
+       )
+'
+
+test_expect_success 'diff-index respects work tree under .git dir' '
+       cat >diff-index-cached.expected <<-EOF &&
+       :000000 100644 $_z40 $EMPTY_BLOB A      sub/dir/tracked
+       EOF
+       cat >diff-index.expected <<-EOF &&
+       :000000 100644 $_z40 $_z40 A    sub/dir/tracked
+       EOF
+
+       (
+               GIT_DIR=repo.git &&
+               GIT_WORK_TREE=repo.git/work &&
+               export GIT_DIR GIT_WORK_TREE &&
+               git diff-index $EMPTY_TREE >diff-index.actual &&
+               git diff-index --cached $EMPTY_TREE >diff-index-cached.actual
+       ) &&
+       test_cmp diff-index.expected diff-index.actual &&
+       test_cmp diff-index-cached.expected diff-index-cached.actual
+'
+
+test_expect_success 'diff-files respects work tree under .git dir' '
+       cat >diff-files.expected <<-EOF &&
+       :100644 100644 $EMPTY_BLOB $_z40 M      sub/dir/tracked
+       EOF
+
+       (
+               GIT_DIR=repo.git &&
+               GIT_WORK_TREE=repo.git/work &&
+               export GIT_DIR GIT_WORK_TREE &&
+               git diff-files >diff-files.actual
+       ) &&
+       test_cmp diff-files.expected diff-files.actual
+'
+
+test_expect_success 'git diff respects work tree under .git dir' '
+       cat >diff-TREE.expected <<-EOF &&
+       diff --git a/sub/dir/tracked b/sub/dir/tracked
+       new file mode 100644
+       index 0000000..$CHANGED_BLOB7
+       --- /dev/null
+       +++ b/sub/dir/tracked
+       @@ -0,0 +1 @@
+       +changed
+       EOF
+       cat >diff-TREE-cached.expected <<-EOF &&
+       diff --git a/sub/dir/tracked b/sub/dir/tracked
+       new file mode 100644
+       index 0000000..$EMPTY_BLOB7
+       EOF
+       cat >diff-FILES.expected <<-EOF &&
+       diff --git a/sub/dir/tracked b/sub/dir/tracked
+       index $EMPTY_BLOB7..$CHANGED_BLOB7 100644
+       --- a/sub/dir/tracked
+       +++ b/sub/dir/tracked
+       @@ -0,0 +1 @@
+       +changed
+       EOF
+
+       (
+               GIT_DIR=repo.git &&
+               GIT_WORK_TREE=repo.git/work &&
+               export GIT_DIR GIT_WORK_TREE &&
+               git diff $EMPTY_TREE >diff-TREE.actual &&
+               git diff --cached $EMPTY_TREE >diff-TREE-cached.actual &&
+               git diff >diff-FILES.actual
+       ) &&
+       test_cmp diff-TREE.expected diff-TREE.actual &&
+       test_cmp diff-TREE-cached.expected diff-TREE-cached.actual &&
+       test_cmp diff-FILES.expected diff-FILES.actual
+'
+
+test_expect_success 'git grep' '
+       echo dir/tracked >expected.grep &&
+       (
+               cd repo.git/work/sub &&
+               GIT_DIR=../.. &&
+               GIT_WORK_TREE=.. &&
+               export GIT_DIR GIT_WORK_TREE &&
+               git grep -l changed >../../../actual.grep
+       ) &&
+       test_cmp expected.grep actual.grep
+'
+
+test_expect_success 'git commit' '
+       (
+               cd repo.git &&
+               GIT_DIR=. GIT_WORK_TREE=work git commit -a -m done
+       )
+'
+
+test_expect_success 'absolute pathspec should fail gracefully' '
+       (
+               cd repo.git &&
+               test_might_fail git config --unset core.worktree &&
+               test_must_fail git log HEAD -- /home
+       )
+'
+
+test_expect_success 'make_relative_path handles double slashes in GIT_DIR' '
+       >dummy_file &&
+       echo git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file &&
+       git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file
+'
+
+test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' '
+       GIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \
+       test-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&
+       echo "$(pwd)/repo.git/work" >expected &&
+       test_cmp expected actual
+'
+
+test_expect_success 'Multi-worktree setup' '
+       mkdir work &&
+       mkdir -p repo.git/repos/foo &&
+       cp repo.git/HEAD repo.git/index repo.git/repos/foo &&
+       test_might_fail cp repo.git/sharedindex.* repo.git/repos/foo &&
+       sane_unset GIT_DIR GIT_CONFIG GIT_WORK_TREE
+'
+
+test_expect_success 'GIT_DIR set (1)' '
+       echo "gitdir: repo.git/repos/foo" >gitfile &&
+       echo ../.. >repo.git/repos/foo/commondir &&
+       (
+               cd work &&
+               GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
+               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'GIT_DIR set (2)' '
+       echo "gitdir: repo.git/repos/foo" >gitfile &&
+       echo "$(pwd)/repo.git" >repo.git/repos/foo/commondir &&
+       (
+               cd work &&
+               GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
+               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success 'Auto discovery' '
+       echo "gitdir: repo.git/repos/foo" >.git &&
+       echo ../.. >repo.git/repos/foo/commondir &&
+       (
+               cd work &&
+               git rev-parse --git-common-dir >actual &&
+               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+               test_cmp expect actual &&
+               echo haha >data1 &&
+               git add data1 &&
+               git ls-files --full-name :/ | grep data1 >actual &&
+               echo work/data1 >expect &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success '$GIT_DIR/common overrides core.worktree' '
+       mkdir elsewhere &&
+       git --git-dir=repo.git config core.worktree "$TRASH_DIRECTORY/elsewhere" &&
+       echo "gitdir: repo.git/repos/foo" >.git &&
+       echo ../.. >repo.git/repos/foo/commondir &&
+       (
+               cd work &&
+               git rev-parse --git-common-dir >actual &&
+               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
+               test_cmp expect actual &&
+               echo haha >data2 &&
+               git add data2 &&
+               git ls-files --full-name :/ | grep data2 >actual &&
+               echo work/data2 >expect &&
+               test_cmp expect actual
+       )
+'
+
+test_expect_success '$GIT_WORK_TREE overrides $GIT_DIR/common' '
+       echo "gitdir: repo.git/repos/foo" >.git &&
+       echo ../.. >repo.git/repos/foo/commondir &&
+       (
+               cd work &&
+               echo haha >data3 &&
+               git --git-dir=../.git --work-tree=. add data3 &&
+               git ls-files --full-name -- :/ | grep data3 >actual &&
+               echo data3 >expect &&
+               test_cmp expect actual
+       )
+'
+
+test_done
diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
deleted file mode 100755 (executable)
index cc5b870..0000000
+++ /dev/null
@@ -1,426 +0,0 @@
-#!/bin/sh
-
-test_description='test separate work tree'
-. ./test-lib.sh
-
-test_expect_success 'setup' '
-       EMPTY_TREE=$(git write-tree) &&
-       EMPTY_BLOB=$(git hash-object -t blob --stdin </dev/null) &&
-       CHANGED_BLOB=$(echo changed | git hash-object -t blob --stdin) &&
-       EMPTY_BLOB7=$(echo $EMPTY_BLOB | sed "s/\(.......\).*/\1/") &&
-       CHANGED_BLOB7=$(echo $CHANGED_BLOB | sed "s/\(.......\).*/\1/") &&
-
-       mkdir -p work/sub/dir &&
-       mkdir -p work2 &&
-       mv .git repo.git
-'
-
-test_expect_success 'setup: helper for testing rev-parse' '
-       test_rev_parse() {
-               echo $1 >expected.bare &&
-               echo $2 >expected.inside-git &&
-               echo $3 >expected.inside-worktree &&
-               if test $# -ge 4
-               then
-                       echo $4 >expected.prefix
-               fi &&
-
-               git rev-parse --is-bare-repository >actual.bare &&
-               git rev-parse --is-inside-git-dir >actual.inside-git &&
-               git rev-parse --is-inside-work-tree >actual.inside-worktree &&
-               if test $# -ge 4
-               then
-                       git rev-parse --show-prefix >actual.prefix
-               fi &&
-
-               test_cmp expected.bare actual.bare &&
-               test_cmp expected.inside-git actual.inside-git &&
-               test_cmp expected.inside-worktree actual.inside-worktree &&
-               if test $# -ge 4
-               then
-                       # rev-parse --show-prefix should output
-                       # a single newline when at the top of the work tree,
-                       # but we test for that separately.
-                       test -z "$4" && ! test -s actual.prefix ||
-                       test_cmp expected.prefix actual.prefix
-               fi
-       }
-'
-
-test_expect_success 'setup: core.worktree = relative path' '
-       sane_unset GIT_WORK_TREE &&
-       GIT_DIR=repo.git &&
-       GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
-       export GIT_DIR GIT_CONFIG &&
-       git config core.worktree ../work
-'
-
-test_expect_success 'outside' '
-       test_rev_parse false false false
-'
-
-test_expect_success 'inside work tree' '
-       (
-               cd work &&
-               GIT_DIR=../repo.git &&
-               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
-               test_rev_parse false false true ""
-       )
-'
-
-test_expect_success 'empty prefix is actually written out' '
-       echo >expected &&
-       (
-               cd work &&
-               GIT_DIR=../repo.git &&
-               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
-               git rev-parse --show-prefix >../actual
-       ) &&
-       test_cmp expected actual
-'
-
-test_expect_success 'subdir of work tree' '
-       (
-               cd work/sub/dir &&
-               GIT_DIR=../../../repo.git &&
-               GIT_CONFIG="$(pwd)"/$GIT_DIR/config &&
-               test_rev_parse false false true sub/dir/
-       )
-'
-
-test_expect_success 'setup: core.worktree = absolute path' '
-       sane_unset GIT_WORK_TREE &&
-       GIT_DIR=$(pwd)/repo.git &&
-       GIT_CONFIG=$GIT_DIR/config &&
-       export GIT_DIR GIT_CONFIG &&
-       git config core.worktree "$(pwd)/work"
-'
-
-test_expect_success 'outside' '
-       test_rev_parse false false false &&
-       (
-               cd work2 &&
-               test_rev_parse false false false
-       )
-'
-
-test_expect_success 'inside work tree' '
-       (
-               cd work &&
-               test_rev_parse false false true ""
-       )
-'
-
-test_expect_success 'subdir of work tree' '
-       (
-               cd work/sub/dir &&
-               test_rev_parse false false true sub/dir/
-       )
-'
-
-test_expect_success 'setup: GIT_WORK_TREE=relative (override core.worktree)' '
-       GIT_DIR=$(pwd)/repo.git &&
-       GIT_CONFIG=$GIT_DIR/config &&
-       git config core.worktree non-existent &&
-       GIT_WORK_TREE=work &&
-       export GIT_DIR GIT_CONFIG GIT_WORK_TREE
-'
-
-test_expect_success 'outside' '
-       test_rev_parse false false false &&
-       (
-               cd work2 &&
-               test_rev_parse false false false
-       )
-'
-
-test_expect_success 'inside work tree' '
-       (
-               cd work &&
-               GIT_WORK_TREE=. &&
-               test_rev_parse false false true ""
-       )
-'
-
-test_expect_success 'subdir of work tree' '
-       (
-               cd work/sub/dir &&
-               GIT_WORK_TREE=../.. &&
-               test_rev_parse false false true sub/dir/
-       )
-'
-
-test_expect_success 'setup: GIT_WORK_TREE=absolute, below git dir' '
-       mv work repo.git/work &&
-       mv work2 repo.git/work2 &&
-       GIT_DIR=$(pwd)/repo.git &&
-       GIT_CONFIG=$GIT_DIR/config &&
-       GIT_WORK_TREE=$(pwd)/repo.git/work &&
-       export GIT_DIR GIT_CONFIG GIT_WORK_TREE
-'
-
-test_expect_success 'outside' '
-       echo outside &&
-       test_rev_parse false false false
-'
-
-test_expect_success 'in repo.git' '
-       (
-               cd repo.git &&
-               test_rev_parse false true false
-       ) &&
-       (
-               cd repo.git/objects &&
-               test_rev_parse false true false
-       ) &&
-       (
-               cd repo.git/work2 &&
-               test_rev_parse false true false
-       )
-'
-
-test_expect_success 'inside work tree' '
-       (
-               cd repo.git/work &&
-               test_rev_parse false true true ""
-       )
-'
-
-test_expect_success 'subdir of work tree' '
-       (
-               cd repo.git/work/sub/dir &&
-               test_rev_parse false true true sub/dir/
-       )
-'
-
-test_expect_success 'find work tree from repo' '
-       echo sub/dir/untracked >expected &&
-       cat <<-\EOF >repo.git/work/.gitignore &&
-       expected.*
-       actual.*
-       .gitignore
-       EOF
-       >repo.git/work/sub/dir/untracked &&
-       (
-               cd repo.git &&
-               git ls-files --others --exclude-standard >../actual
-       ) &&
-       test_cmp expected actual
-'
-
-test_expect_success 'find work tree from work tree' '
-       echo sub/dir/tracked >expected &&
-       >repo.git/work/sub/dir/tracked &&
-       (
-               cd repo.git/work/sub/dir &&
-               git --git-dir=../../.. add tracked
-       ) &&
-       (
-               cd repo.git &&
-               git ls-files >../actual
-       ) &&
-       test_cmp expected actual
-'
-
-test_expect_success '_gently() groks relative GIT_DIR & GIT_WORK_TREE' '
-       (
-               cd repo.git/work/sub/dir &&
-               GIT_DIR=../../.. &&
-               GIT_WORK_TREE=../.. &&
-               GIT_PAGER= &&
-               export GIT_DIR GIT_WORK_TREE GIT_PAGER &&
-
-               git diff --exit-code tracked &&
-               echo changed >tracked &&
-               test_must_fail git diff --exit-code tracked
-       )
-'
-
-test_expect_success 'diff-index respects work tree under .git dir' '
-       cat >diff-index-cached.expected <<-EOF &&
-       :000000 100644 $_z40 $EMPTY_BLOB A      sub/dir/tracked
-       EOF
-       cat >diff-index.expected <<-EOF &&
-       :000000 100644 $_z40 $_z40 A    sub/dir/tracked
-       EOF
-
-       (
-               GIT_DIR=repo.git &&
-               GIT_WORK_TREE=repo.git/work &&
-               export GIT_DIR GIT_WORK_TREE &&
-               git diff-index $EMPTY_TREE >diff-index.actual &&
-               git diff-index --cached $EMPTY_TREE >diff-index-cached.actual
-       ) &&
-       test_cmp diff-index.expected diff-index.actual &&
-       test_cmp diff-index-cached.expected diff-index-cached.actual
-'
-
-test_expect_success 'diff-files respects work tree under .git dir' '
-       cat >diff-files.expected <<-EOF &&
-       :100644 100644 $EMPTY_BLOB $_z40 M      sub/dir/tracked
-       EOF
-
-       (
-               GIT_DIR=repo.git &&
-               GIT_WORK_TREE=repo.git/work &&
-               export GIT_DIR GIT_WORK_TREE &&
-               git diff-files >diff-files.actual
-       ) &&
-       test_cmp diff-files.expected diff-files.actual
-'
-
-test_expect_success 'git diff respects work tree under .git dir' '
-       cat >diff-TREE.expected <<-EOF &&
-       diff --git a/sub/dir/tracked b/sub/dir/tracked
-       new file mode 100644
-       index 0000000..$CHANGED_BLOB7
-       --- /dev/null
-       +++ b/sub/dir/tracked
-       @@ -0,0 +1 @@
-       +changed
-       EOF
-       cat >diff-TREE-cached.expected <<-EOF &&
-       diff --git a/sub/dir/tracked b/sub/dir/tracked
-       new file mode 100644
-       index 0000000..$EMPTY_BLOB7
-       EOF
-       cat >diff-FILES.expected <<-EOF &&
-       diff --git a/sub/dir/tracked b/sub/dir/tracked
-       index $EMPTY_BLOB7..$CHANGED_BLOB7 100644
-       --- a/sub/dir/tracked
-       +++ b/sub/dir/tracked
-       @@ -0,0 +1 @@
-       +changed
-       EOF
-
-       (
-               GIT_DIR=repo.git &&
-               GIT_WORK_TREE=repo.git/work &&
-               export GIT_DIR GIT_WORK_TREE &&
-               git diff $EMPTY_TREE >diff-TREE.actual &&
-               git diff --cached $EMPTY_TREE >diff-TREE-cached.actual &&
-               git diff >diff-FILES.actual
-       ) &&
-       test_cmp diff-TREE.expected diff-TREE.actual &&
-       test_cmp diff-TREE-cached.expected diff-TREE-cached.actual &&
-       test_cmp diff-FILES.expected diff-FILES.actual
-'
-
-test_expect_success 'git grep' '
-       echo dir/tracked >expected.grep &&
-       (
-               cd repo.git/work/sub &&
-               GIT_DIR=../.. &&
-               GIT_WORK_TREE=.. &&
-               export GIT_DIR GIT_WORK_TREE &&
-               git grep -l changed >../../../actual.grep
-       ) &&
-       test_cmp expected.grep actual.grep
-'
-
-test_expect_success 'git commit' '
-       (
-               cd repo.git &&
-               GIT_DIR=. GIT_WORK_TREE=work git commit -a -m done
-       )
-'
-
-test_expect_success 'absolute pathspec should fail gracefully' '
-       (
-               cd repo.git &&
-               test_might_fail git config --unset core.worktree &&
-               test_must_fail git log HEAD -- /home
-       )
-'
-
-test_expect_success 'make_relative_path handles double slashes in GIT_DIR' '
-       >dummy_file &&
-       echo git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file &&
-       git --git-dir="$(pwd)//repo.git" --work-tree="$(pwd)" add dummy_file
-'
-
-test_expect_success 'relative $GIT_WORK_TREE and git subprocesses' '
-       GIT_DIR=repo.git GIT_WORK_TREE=repo.git/work \
-       test-subprocess --setup-work-tree rev-parse --show-toplevel >actual &&
-       echo "$(pwd)/repo.git/work" >expected &&
-       test_cmp expected actual
-'
-
-test_expect_success 'Multi-worktree setup' '
-       mkdir work &&
-       mkdir -p repo.git/repos/foo &&
-       cp repo.git/HEAD repo.git/index repo.git/repos/foo &&
-       test_might_fail cp repo.git/sharedindex.* repo.git/repos/foo &&
-       sane_unset GIT_DIR GIT_CONFIG GIT_WORK_TREE
-'
-
-test_expect_success 'GIT_DIR set (1)' '
-       echo "gitdir: repo.git/repos/foo" >gitfile &&
-       echo ../.. >repo.git/repos/foo/commondir &&
-       (
-               cd work &&
-               GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
-               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
-               test_cmp expect actual
-       )
-'
-
-test_expect_success 'GIT_DIR set (2)' '
-       echo "gitdir: repo.git/repos/foo" >gitfile &&
-       echo "$(pwd)/repo.git" >repo.git/repos/foo/commondir &&
-       (
-               cd work &&
-               GIT_DIR=../gitfile git rev-parse --git-common-dir >actual &&
-               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
-               test_cmp expect actual
-       )
-'
-
-test_expect_success 'Auto discovery' '
-       echo "gitdir: repo.git/repos/foo" >.git &&
-       echo ../.. >repo.git/repos/foo/commondir &&
-       (
-               cd work &&
-               git rev-parse --git-common-dir >actual &&
-               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
-               test_cmp expect actual &&
-               echo haha >data1 &&
-               git add data1 &&
-               git ls-files --full-name :/ | grep data1 >actual &&
-               echo work/data1 >expect &&
-               test_cmp expect actual
-       )
-'
-
-test_expect_success '$GIT_DIR/common overrides core.worktree' '
-       mkdir elsewhere &&
-       git --git-dir=repo.git config core.worktree "$TRASH_DIRECTORY/elsewhere" &&
-       echo "gitdir: repo.git/repos/foo" >.git &&
-       echo ../.. >repo.git/repos/foo/commondir &&
-       (
-               cd work &&
-               git rev-parse --git-common-dir >actual &&
-               test-path-utils real_path "$TRASH_DIRECTORY/repo.git" >expect &&
-               test_cmp expect actual &&
-               echo haha >data2 &&
-               git add data2 &&
-               git ls-files --full-name :/ | grep data2 >actual &&
-               echo work/data2 >expect &&
-               test_cmp expect actual
-       )
-'
-
-test_expect_success '$GIT_WORK_TREE overrides $GIT_DIR/common' '
-       echo "gitdir: repo.git/repos/foo" >.git &&
-       echo ../.. >repo.git/repos/foo/commondir &&
-       (
-               cd work &&
-               echo haha >data3 &&
-               git --git-dir=../.git --work-tree=. add data3 &&
-               git ls-files --full-name -- :/ | grep data3 >actual &&
-               echo data3 >expect &&
-               test_cmp expect actual
-       )
-'
-
-test_done
diff --git a/t/t1509-root-work-tree.sh b/t/t1509-root-work-tree.sh
new file mode 100755 (executable)
index 0000000..553a3f6
--- /dev/null
@@ -0,0 +1,258 @@
+#!/bin/sh
+
+test_description='Test Git when git repository is located at root
+
+This test requires write access in root. Do not bother if you do not
+have a throwaway chroot or VM.
+
+Script t1509/prepare-chroot.sh may help you setup chroot, then you
+can chroot in and execute this test from there.
+'
+
+. ./test-lib.sh
+
+test_cmp_val() {
+       echo "$1" > expected
+       echo "$2" > result
+       test_cmp expected result
+}
+
+test_vars() {
+       test_expect_success "$1: gitdir" '
+               test_cmp_val "'"$2"'" "$(git rev-parse --git-dir)"
+       '
+
+       test_expect_success "$1: worktree" '
+               test_cmp_val "'"$3"'" "$(git rev-parse --show-toplevel)"
+       '
+
+       test_expect_success "$1: prefix" '
+               test_cmp_val "'"$4"'" "$(git rev-parse --show-prefix)"
+       '
+}
+
+test_foobar_root() {
+       test_expect_success 'add relative' '
+               test -z "$(cd / && git ls-files)" &&
+               git add foo/foome &&
+               git add foo/bar/barme &&
+               git add me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+
+       test_expect_success 'add absolute' '
+               test -z "$(cd / && git ls-files)" &&
+               git add /foo/foome &&
+               git add /foo/bar/barme &&
+               git add /me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+
+}
+
+test_foobar_foo() {
+       test_expect_success 'add relative' '
+               test -z "$(cd / && git ls-files)" &&
+               git add foome &&
+               git add bar/barme &&
+               git add ../me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+
+       test_expect_success 'add absolute' '
+               test -z "$(cd / && git ls-files)" &&
+               git add /foo/foome &&
+               git add /foo/bar/barme &&
+               git add /me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+}
+
+test_foobar_foobar() {
+       test_expect_success 'add relative' '
+               test -z "$(cd / && git ls-files)" &&
+               git add ../foome &&
+               git add barme &&
+               git add ../../me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+
+       test_expect_success 'add absolute' '
+               test -z "$(cd / && git ls-files)" &&
+               git add /foo/foome &&
+               git add /foo/bar/barme &&
+               git add /me &&
+               ( cd / && git ls-files --stage ) > result &&
+               test_cmp /ls.expected result &&
+               rm "$(git rev-parse --git-dir)/index"
+       '
+}
+
+if ! test -w /
+then
+       skip_all="Test requiring writable / skipped. Read this test if you want to run it"
+       test_done
+fi
+
+if  test -e /refs || test -e /objects || test -e /info || test -e /hooks ||
+    test -e /.git || test -e /foo || test -e /me
+then
+       skip_all="Skip test that clobbers existing files in /"
+       test_done
+fi
+
+if [ "$IKNOWWHATIAMDOING" != "YES" ]; then
+       skip_all="You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
+       test_done
+fi
+
+if ! test_have_prereq NOT_ROOT
+then
+       skip_all="No you can't run this as root"
+       test_done
+fi
+
+ONE_SHA1=d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
+
+test_expect_success 'setup' '
+       rm -rf /foo &&
+       mkdir /foo &&
+       mkdir /foo/bar &&
+       echo 1 > /foo/foome &&
+       echo 1 > /foo/bar/barme &&
+       echo 1 > /me
+'
+
+say "GIT_DIR absolute, GIT_WORK_TREE set"
+
+test_expect_success 'go to /' 'cd /'
+
+cat >ls.expected <<EOF
+100644 $ONE_SHA1 0     foo/bar/barme
+100644 $ONE_SHA1 0     foo/foome
+100644 $ONE_SHA1 0     me
+EOF
+
+GIT_DIR="$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
+
+test_vars 'abs gitdir, root' "$GIT_DIR" "/" ""
+test_foobar_root
+
+test_expect_success 'go to /foo' 'cd /foo'
+
+test_vars 'abs gitdir, foo' "$GIT_DIR" "/" "foo/"
+test_foobar_foo
+
+test_expect_success 'go to /foo/bar' 'cd /foo/bar'
+
+test_vars 'abs gitdir, foo/bar' "$GIT_DIR" "/" "foo/bar/"
+test_foobar_foobar
+
+say "GIT_DIR relative, GIT_WORK_TREE set"
+
+test_expect_success 'go to /' 'cd /'
+
+GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
+test_foobar_root
+
+test_expect_success 'go to /foo' 'cd /foo'
+
+GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
+test_foobar_foo
+
+test_expect_success 'go to /foo/bar' 'cd /foo/bar'
+
+GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
+test_foobar_foobar
+
+say "GIT_DIR relative, GIT_WORK_TREE relative"
+
+test_expect_success 'go to /' 'cd /'
+
+GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
+GIT_WORK_TREE=. && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
+test_foobar_root
+
+test_expect_success 'go to /' 'cd /foo'
+
+GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=.. && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
+test_foobar_foo
+
+test_expect_success 'go to /foo/bar' 'cd /foo/bar'
+
+GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=../.. && export GIT_WORK_TREE
+
+test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
+test_foobar_foobar
+
+say ".git at root"
+
+unset GIT_DIR
+unset GIT_WORK_TREE
+
+test_expect_success 'go to /' 'cd /'
+test_expect_success 'setup' '
+       rm -rf /.git &&
+       echo "Initialized empty Git repository in /.git/" > expected &&
+       git init > result &&
+       test_cmp expected result
+'
+
+test_vars 'auto gitdir, root' ".git" "/" ""
+test_foobar_root
+
+test_expect_success 'go to /foo' 'cd /foo'
+test_vars 'auto gitdir, foo' "/.git" "/" "foo/"
+test_foobar_foo
+
+test_expect_success 'go to /foo/bar' 'cd /foo/bar'
+test_vars 'auto gitdir, foo/bar' "/.git" "/" "foo/bar/"
+test_foobar_foobar
+
+test_expect_success 'cleanup' 'rm -rf /.git'
+
+say "auto bare gitdir"
+
+# DESTROYYYYY!!!!!
+test_expect_success 'setup' '
+       rm -rf /refs /objects /info /hooks &&
+       rm -f /expected /ls.expected /me /result &&
+       cd / &&
+       echo "Initialized empty Git repository in /" > expected &&
+       git init --bare > result &&
+       test_cmp expected result
+'
+
+test_vars 'auto gitdir, root' "." "" ""
+
+test_expect_success 'go to /foo' 'cd /foo'
+
+test_vars 'auto gitdir, root' "/" "" ""
+
+test_done
diff --git a/t/t1509-root-worktree.sh b/t/t1509-root-worktree.sh
deleted file mode 100755 (executable)
index 553a3f6..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/bin/sh
-
-test_description='Test Git when git repository is located at root
-
-This test requires write access in root. Do not bother if you do not
-have a throwaway chroot or VM.
-
-Script t1509/prepare-chroot.sh may help you setup chroot, then you
-can chroot in and execute this test from there.
-'
-
-. ./test-lib.sh
-
-test_cmp_val() {
-       echo "$1" > expected
-       echo "$2" > result
-       test_cmp expected result
-}
-
-test_vars() {
-       test_expect_success "$1: gitdir" '
-               test_cmp_val "'"$2"'" "$(git rev-parse --git-dir)"
-       '
-
-       test_expect_success "$1: worktree" '
-               test_cmp_val "'"$3"'" "$(git rev-parse --show-toplevel)"
-       '
-
-       test_expect_success "$1: prefix" '
-               test_cmp_val "'"$4"'" "$(git rev-parse --show-prefix)"
-       '
-}
-
-test_foobar_root() {
-       test_expect_success 'add relative' '
-               test -z "$(cd / && git ls-files)" &&
-               git add foo/foome &&
-               git add foo/bar/barme &&
-               git add me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-
-       test_expect_success 'add absolute' '
-               test -z "$(cd / && git ls-files)" &&
-               git add /foo/foome &&
-               git add /foo/bar/barme &&
-               git add /me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-
-}
-
-test_foobar_foo() {
-       test_expect_success 'add relative' '
-               test -z "$(cd / && git ls-files)" &&
-               git add foome &&
-               git add bar/barme &&
-               git add ../me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-
-       test_expect_success 'add absolute' '
-               test -z "$(cd / && git ls-files)" &&
-               git add /foo/foome &&
-               git add /foo/bar/barme &&
-               git add /me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-}
-
-test_foobar_foobar() {
-       test_expect_success 'add relative' '
-               test -z "$(cd / && git ls-files)" &&
-               git add ../foome &&
-               git add barme &&
-               git add ../../me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-
-       test_expect_success 'add absolute' '
-               test -z "$(cd / && git ls-files)" &&
-               git add /foo/foome &&
-               git add /foo/bar/barme &&
-               git add /me &&
-               ( cd / && git ls-files --stage ) > result &&
-               test_cmp /ls.expected result &&
-               rm "$(git rev-parse --git-dir)/index"
-       '
-}
-
-if ! test -w /
-then
-       skip_all="Test requiring writable / skipped. Read this test if you want to run it"
-       test_done
-fi
-
-if  test -e /refs || test -e /objects || test -e /info || test -e /hooks ||
-    test -e /.git || test -e /foo || test -e /me
-then
-       skip_all="Skip test that clobbers existing files in /"
-       test_done
-fi
-
-if [ "$IKNOWWHATIAMDOING" != "YES" ]; then
-       skip_all="You must set env var IKNOWWHATIAMDOING=YES in order to run this test"
-       test_done
-fi
-
-if ! test_have_prereq NOT_ROOT
-then
-       skip_all="No you can't run this as root"
-       test_done
-fi
-
-ONE_SHA1=d00491fd7e5bb6fa28c517a0bb32b8b506539d4d
-
-test_expect_success 'setup' '
-       rm -rf /foo &&
-       mkdir /foo &&
-       mkdir /foo/bar &&
-       echo 1 > /foo/foome &&
-       echo 1 > /foo/bar/barme &&
-       echo 1 > /me
-'
-
-say "GIT_DIR absolute, GIT_WORK_TREE set"
-
-test_expect_success 'go to /' 'cd /'
-
-cat >ls.expected <<EOF
-100644 $ONE_SHA1 0     foo/bar/barme
-100644 $ONE_SHA1 0     foo/foome
-100644 $ONE_SHA1 0     me
-EOF
-
-GIT_DIR="$TRASH_DIRECTORY/.git" && export GIT_DIR
-GIT_WORK_TREE=/ && export GIT_WORK_TREE
-
-test_vars 'abs gitdir, root' "$GIT_DIR" "/" ""
-test_foobar_root
-
-test_expect_success 'go to /foo' 'cd /foo'
-
-test_vars 'abs gitdir, foo' "$GIT_DIR" "/" "foo/"
-test_foobar_foo
-
-test_expect_success 'go to /foo/bar' 'cd /foo/bar'
-
-test_vars 'abs gitdir, foo/bar' "$GIT_DIR" "/" "foo/bar/"
-test_foobar_foobar
-
-say "GIT_DIR relative, GIT_WORK_TREE set"
-
-test_expect_success 'go to /' 'cd /'
-
-GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
-GIT_WORK_TREE=/ && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
-test_foobar_root
-
-test_expect_success 'go to /foo' 'cd /foo'
-
-GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
-GIT_WORK_TREE=/ && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
-test_foobar_foo
-
-test_expect_success 'go to /foo/bar' 'cd /foo/bar'
-
-GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
-GIT_WORK_TREE=/ && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
-test_foobar_foobar
-
-say "GIT_DIR relative, GIT_WORK_TREE relative"
-
-test_expect_success 'go to /' 'cd /'
-
-GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
-GIT_WORK_TREE=. && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
-test_foobar_root
-
-test_expect_success 'go to /' 'cd /foo'
-
-GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
-GIT_WORK_TREE=.. && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
-test_foobar_foo
-
-test_expect_success 'go to /foo/bar' 'cd /foo/bar'
-
-GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
-GIT_WORK_TREE=../.. && export GIT_WORK_TREE
-
-test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
-test_foobar_foobar
-
-say ".git at root"
-
-unset GIT_DIR
-unset GIT_WORK_TREE
-
-test_expect_success 'go to /' 'cd /'
-test_expect_success 'setup' '
-       rm -rf /.git &&
-       echo "Initialized empty Git repository in /.git/" > expected &&
-       git init > result &&
-       test_cmp expected result
-'
-
-test_vars 'auto gitdir, root' ".git" "/" ""
-test_foobar_root
-
-test_expect_success 'go to /foo' 'cd /foo'
-test_vars 'auto gitdir, foo' "/.git" "/" "foo/"
-test_foobar_foo
-
-test_expect_success 'go to /foo/bar' 'cd /foo/bar'
-test_vars 'auto gitdir, foo/bar' "/.git" "/" "foo/bar/"
-test_foobar_foobar
-
-test_expect_success 'cleanup' 'rm -rf /.git'
-
-say "auto bare gitdir"
-
-# DESTROYYYYY!!!!!
-test_expect_success 'setup' '
-       rm -rf /refs /objects /info /hooks &&
-       rm -f /expected /ls.expected /me /result &&
-       cd / &&
-       echo "Initialized empty Git repository in /" > expected &&
-       git init --bare > result &&
-       test_cmp expected result
-'
-
-test_vars 'auto gitdir, root' "." "" ""
-
-test_expect_success 'go to /foo' 'cd /foo'
-
-test_vars 'auto gitdir, root' "/" "" ""
-
-test_done
index 199b22d85e92535f148eaaca4d3856dbdfb6bcec..b99d5192a96ec77ef6a99cb86518375c447b48a9 100755 (executable)
@@ -56,30 +56,4 @@ test_expect_success VAGUENESS_SUCCESS 'checkout reports switch to branch' '
        test_i18ngrep ! "^HEAD is now at" stderr
 '
 
-test_expect_success 'wildcard ambiguation, paths win' '
-       git init ambi &&
-       (
-               cd ambi &&
-               echo a >a.c &&
-               git add a.c &&
-               echo b >a.c &&
-               git checkout "*.c" &&
-               echo a >expect &&
-               test_cmp expect a.c
-       )
-'
-
-test_expect_success !MINGW 'wildcard ambiguation, refs lose' '
-       git init ambi2 &&
-       (
-               cd ambi2 &&
-               echo a >"*.c" &&
-               git add . &&
-               test_must_fail git show :"*.c" &&
-               git show :"*.c" -- >actual &&
-               echo a >expect &&
-               test_cmp expect actual
-       )
-'
-
 test_done
index 75ebb1b4a0f79faa6f92cc9575eeef6b10ae27d3..1b1b65a6b0fc7ace4e18e8642a6c47631d7e6a43 100755 (executable)
@@ -8,6 +8,16 @@ test_expect_success 'setup' '
        test_commit init
 '
 
+test_expect_success 'rev-parse --git-common-dir on main worktree' '
+       git rev-parse --git-common-dir >actual &&
+       echo .git >expected &&
+       test_cmp expected actual &&
+       mkdir sub &&
+       git -C sub rev-parse --git-common-dir >actual2 &&
+       echo sub/.git >expected2 &&
+       test_cmp expected2 actual2
+'
+
 test_expect_success '"list" all worktrees from main' '
        echo "$(git rev-parse --show-toplevel) $(git rev-parse --short HEAD) [$(git symbolic-ref --short HEAD)]" >expect &&
        test_when_finished "rm -rf here && git worktree prune" &&
index 88be904c09214586b18f867306f7a8dcf1170cb7..c525656b2c04f8999482496688a0bd47ae8da9e2 100755 (executable)
@@ -65,6 +65,13 @@ test_expect_success '--no-empty-directory hides empty directory' '
        test_cmp expected3 output
 '
 
+test_expect_success 'ls-files --others handles non-submodule .git' '
+       mkdir not-a-submodule &&
+       echo foo >not-a-submodule/.git &&
+       git ls-files -o >output &&
+       test_cmp expected1 output
+'
+
 test_expect_success SYMLINKS 'ls-files --others with symlinked submodule' '
        git init super &&
        git init sub &&
index da257c020fb64d6b8af6b482339afd87f04fea75..3fc484e8c3f8d910f02e409baf7bf1d5682b4f2f 100755 (executable)
@@ -305,29 +305,4 @@ test_expect_success 'ls-files with "**" patterns and no slashes' '
        test_cmp expect actual
 '
 
-test_expect_success 'negative patterns' '
-       git init reinclude &&
-       (
-               cd reinclude &&
-               cat >.gitignore <<-\EOF &&
-               /fooo
-               /foo
-               !foo/bar/bar
-               EOF
-               mkdir fooo &&
-               cat >fooo/.gitignore <<-\EOF &&
-               !/*
-               EOF
-               mkdir -p foo/bar &&
-               touch abc foo/def foo/bar/ghi foo/bar/bar &&
-               git ls-files -o --exclude-standard >../actual &&
-               cat >../expected <<-\EOF &&
-               .gitignore
-               abc
-               foo/bar/bar
-               EOF
-               test_cmp ../expected ../actual
-       )
-'
-
 test_done
index cdaf6f64ec78830def2f082b72604075e15496f6..a897248490650ebef1a33a60a1aa9cf4431f06ff 100755 (executable)
@@ -446,6 +446,13 @@ test_expect_success '--set-upstream-to fails on a non-ref' '
        test_must_fail git branch --set-upstream-to HEAD^{}
 '
 
+test_expect_success '--set-upstream-to fails on locked config' '
+       test_when_finished "rm -f .git/config.lock" &&
+       >.git/config.lock &&
+       git branch locked &&
+       test_must_fail git branch --set-upstream-to locked
+'
+
 test_expect_success 'use --set-upstream-to modify HEAD' '
        test_config branch.master.remote foo &&
        test_config branch.master.merge foo &&
@@ -466,6 +473,13 @@ test_expect_success '--unset-upstream should fail if given a non-existent branch
        test_must_fail git branch --unset-upstream i-dont-exist
 '
 
+test_expect_success '--unset-upstream should fail if config is locked' '
+       test_when_finished "rm -f .git/config.lock" &&
+       git branch --set-upstream-to locked &&
+       >.git/config.lock &&
+       test_must_fail git branch --unset-upstream
+'
+
 test_expect_success 'test --unset-upstream on HEAD' '
        git branch my14 &&
        test_config branch.master.remote foo &&
@@ -579,7 +593,7 @@ test_expect_success 'avoid ambiguous track' '
        git config remote.ambi1.fetch refs/heads/lalala:refs/heads/master &&
        git config remote.ambi2.url lilili &&
        git config remote.ambi2.fetch refs/heads/lilili:refs/heads/master &&
-       git branch all1 master &&
+       test_must_fail git branch all1 master &&
        test -z "$(git config branch.all1.merge)"
 '
 
index d3913f9088950a3ca848b8994abfddfecd3f6706..4261403cf62542e82d40487e47733f586e106a75 100755 (executable)
@@ -176,4 +176,12 @@ test_expect_success 'git branch --points-at option' '
        test_cmp expect actual
 '
 
+test_expect_success 'ambiguous branch/tag not marked' '
+       git tag ambiguous &&
+       git branch ambiguous &&
+       echo "  ambiguous" >expect &&
+       git branch --list ambiguous >actual &&
+       test_cmp expect actual
+'
+
 test_done
index c0460bb0e59c42de179fc6cbe0f3702a3b538a8e..43dd474a12e97945d38de00f7ab99f30d73490ea 100755 (executable)
@@ -68,6 +68,12 @@ test_expect_success POSIXPERM,SANITY 'unreadable orderfile' '
        test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD
 '
 
+test_expect_success "orderfile using option from subdir with --output" '
+       mkdir subdir &&
+       git -C subdir diff -O../order_file_1 --output ../actual --name-only HEAD^..HEAD &&
+       test_cmp expect_1 actual
+'
+
 for i in 1 2
 do
        test_expect_success "orderfile using option ($i)" '
index 89224edcc582e6610fdefd63a8d40048bfe10da0..a3e12d295afedb170b3a917ce9d23122c1a0bc1d 100755 (executable)
@@ -101,7 +101,10 @@ test_expect_success 'push with receive.fsckobjects' '
                git config transfer.fsckobjects false
        ) &&
        test_must_fail ok=sigpipe git push --porcelain dst master:refs/heads/test >act &&
-       test_cmp exp act
+       {
+               test_cmp exp act ||
+               ! test -s act
+       }
 '
 
 test_expect_success 'push with transfer.fsckobjects' '
index dfaf9d9f68939f0c39a512c478265b4aa227c973..013e03dee2651f6891782325671f0764bb02f41f 100755 (executable)
@@ -932,6 +932,15 @@ test_expect_success 'get-url on new remote' '
        echo foo | get_url_test --push --all someremote
 '
 
+test_expect_success 'remote set-url with locked config' '
+       test_when_finished "rm -f .git/config.lock" &&
+       git config --get-all remote.someremote.url >expect &&
+       >.git/config.lock &&
+       test_must_fail git remote set-url someremote baz &&
+       git config --get-all remote.someremote.url >actual &&
+       cmp expect actual
+'
+
 test_expect_success 'remote set-url bar' '
        git remote set-url someremote bar &&
        echo bar >expect &&
index 0ba9db08847255d28e3e185d18b68703fb0755dc..e3ee4bd700c3e72479ce1c7a4d8b1333a35a8473 100755 (executable)
@@ -708,4 +708,17 @@ test_expect_success 'fetching a one-level ref works' '
        )
 '
 
+test_expect_success 'fetching with auto-gc does not lock up' '
+       write_script askyesno <<-\EOF &&
+       echo "$*" &&
+       false
+       EOF
+       git clone "file://$D" auto-gc &&
+       test_commit test2 &&
+       cd auto-gc &&
+       git config gc.autoPackLimit 1 &&
+       GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 &&
+       ! grep "Should I try again" fetch.out
+'
+
 test_done
index c402d8d3d7c7e053373ffd98491ae0160481f3ba..c7320121ecfa74dce8389d3790364501c8bb12b8 100755 (executable)
@@ -25,7 +25,8 @@ test_expect_success 'push to update (protected)' '
        (
                cd dst &&
                test_commit D &&
-               test_must_fail git push --force-with-lease=master:master origin master
+               test_must_fail git push --force-with-lease=master:master origin master 2>err &&
+               grep "stale info" err
        ) &&
        git ls-remote . refs/heads/master >expect &&
        git ls-remote src refs/heads/master >actual &&
@@ -37,7 +38,8 @@ test_expect_success 'push to update (protected, forced)' '
        (
                cd dst &&
                test_commit D &&
-               git push --force --force-with-lease=master:master origin master
+               git push --force --force-with-lease=master:master origin master 2>err &&
+               grep "forced update" err
        ) &&
        git ls-remote dst refs/heads/master >expect &&
        git ls-remote src refs/heads/master >actual &&
@@ -101,7 +103,8 @@ test_expect_success 'push to update (allowed, tracking)' '
        (
                cd dst &&
                test_commit D &&
-               git push --force-with-lease=master origin master
+               git push --force-with-lease=master origin master 2>err &&
+               ! grep "forced update" err
        ) &&
        git ls-remote dst refs/heads/master >expect &&
        git ls-remote src refs/heads/master >actual &&
@@ -114,7 +117,8 @@ test_expect_success 'push to update (allowed even though no-ff)' '
                cd dst &&
                git reset --hard HEAD^ &&
                test_commit D &&
-               git push --force-with-lease=master origin master
+               git push --force-with-lease=master origin master 2>err &&
+               grep "forced update" err
        ) &&
        git ls-remote dst refs/heads/master >expect &&
        git ls-remote src refs/heads/master >actual &&
@@ -147,7 +151,8 @@ test_expect_success 'push to delete (allowed)' '
        setup_srcdst_basic &&
        (
                cd dst &&
-               git push --force-with-lease=master origin :master
+               git push --force-with-lease=master origin :master 2>err &&
+               grep deleted err
        ) &&
        >expect &&
        git ls-remote src refs/heads/master >actual &&
index 190ee903cf6269071809e82d61d6065f1de679c6..20aee43f95ab3cc38b8671a233089873fe374777 100755 (executable)
@@ -346,4 +346,17 @@ test_expect_success 'conflict at EOF without LF resolved by --union' \
         printf "line1\nline2\nline3x\nline3y" >expect.txt &&
         test_cmp expect.txt output.txt'
 
+test_expect_success 'conflict sections match existing line endings' '
+       printf "1\\r\\n2\\r\\n3" >crlf-orig.txt &&
+       printf "1\\r\\n2\\r\\n4" >crlf-diff1.txt &&
+       printf "1\\r\\n2\\r\\n5" >crlf-diff2.txt &&
+       test_must_fail git -c core.eol=crlf merge-file -p \
+               crlf-diff1.txt crlf-orig.txt crlf-diff2.txt >crlf.txt &&
+       test $(tr "\015" Q <crlf.txt | grep "^[<=>].*Q$" | wc -l) = 3 &&
+       test $(tr "\015" Q <crlf.txt | grep "[345]Q$" | wc -l) = 3 &&
+       test_must_fail git -c core.eol=crlf merge-file -p \
+               nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >nolf.txt &&
+       test $(tr "\015" Q <nolf.txt | grep "^[<=>].*Q$" | wc -l) = 0
+'
+
 test_done
index 4d5a25eedfef50c578d776990a8a3ac44064533f..c630aba657e9c78b6dee4a72be34ed3bd03c01ee 100755 (executable)
@@ -351,11 +351,15 @@ test_expect_success 'test --format long' '
        test_cmp expected actual
 '
 
-test_expect_success 'setup a fake editor' '
-       write_script fakeeditor <<-\EOF
+test_expect_success 'setup fake editors' '
+       write_script fakeeditor <<-\EOF &&
                sed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new"
                mv "$1.new" "$1"
        EOF
+       write_script failingfakeeditor <<-\EOF
+               ./fakeeditor "$@"
+               false
+       EOF
 '
 
 test_expect_success '--edit with and without already replaced object' '
@@ -372,7 +376,7 @@ test_expect_success '--edit with and without already replaced object' '
 test_expect_success '--edit and change nothing or command failed' '
        git replace -d "$PARA3" &&
        test_must_fail env GIT_EDITOR=true git replace --edit "$PARA3" &&
-       test_must_fail env GIT_EDITOR="./fakeeditor;false" git replace --edit "$PARA3" &&
+       test_must_fail env GIT_EDITOR="./failingfakeeditor" git replace --edit "$PARA3" &&
        GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" &&
        git replace -l | grep "$PARA3" &&
        git cat-file commit "$PARA3" | grep "A fake Thor"
diff --git a/t/t6133-pathspec-rev-dwim.sh b/t/t6133-pathspec-rev-dwim.sh
new file mode 100755 (executable)
index 0000000..a290ffc
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+test_description='test dwim of revs versus pathspecs in revision parser'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       test_commit base &&
+       echo content >"br[ack]ets" &&
+       git add . &&
+       test_tick &&
+       git commit -m brackets
+'
+
+test_expect_success 'non-rev wildcard dwims to pathspec' '
+       git log -- "*.t" >expect &&
+       git log    "*.t" >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'tree:path with metacharacters dwims to rev' '
+       git show "HEAD:br[ack]ets" -- >expect &&
+       git show "HEAD:br[ack]ets"    >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '^{foo} with metacharacters dwims to rev' '
+       git log "HEAD^{/b.*}" -- >expect &&
+       git log "HEAD^{/b.*}"    >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success '@{foo} with metacharacters dwims to rev' '
+       git log "HEAD@{now [or thereabouts]}" -- >expect &&
+       git log "HEAD@{now [or thereabouts]}"    >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success ':/*.t from a subdir dwims to a pathspec' '
+       mkdir subdir &&
+       (
+               cd subdir &&
+               git log -- ":/*.t" >expect &&
+               git log    ":/*.t" >actual &&
+               test_cmp expect actual
+       )
+'
+
+test_done
index 03873b09d1a4480549e1b8ab92fc3780fb874d89..19a2823025e794a6adc3f75d65dd175a2021f282 100755 (executable)
@@ -49,11 +49,17 @@ test_atom() {
 }
 
 test_atom head refname refs/heads/master
+test_atom head refname:short master
+test_atom head refname:strip=1 heads/master
+test_atom head refname:strip=2 master
 test_atom head upstream refs/remotes/origin/master
+test_atom head upstream:short origin/master
 test_atom head push refs/remotes/myfork/master
+test_atom head push:short myfork/master
 test_atom head objecttype commit
 test_atom head objectsize 171
 test_atom head objectname $(git rev-parse refs/heads/master)
+test_atom head objectname:short $(git rev-parse --short refs/heads/master)
 test_atom head tree $(git rev-parse refs/heads/master^{tree})
 test_atom head parent ''
 test_atom head numparent 0
@@ -86,11 +92,13 @@ test_atom head contents 'Initial
 test_atom head HEAD '*'
 
 test_atom tag refname refs/tags/testtag
+test_atom tag refname:short testtag
 test_atom tag upstream ''
 test_atom tag push ''
 test_atom tag objecttype tag
 test_atom tag objectsize 154
 test_atom tag objectname $(git rev-parse refs/tags/testtag)
+test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag)
 test_atom tag tree ''
 test_atom tag parent ''
 test_atom tag numparent ''
@@ -126,6 +134,16 @@ test_expect_success 'Check invalid atoms names are errors' '
        test_must_fail git for-each-ref --format="%(INVALID)" refs/heads
 '
 
+test_expect_success 'arguments to :strip must be positive integers' '
+       test_must_fail git for-each-ref --format="%(refname:strip=0)" &&
+       test_must_fail git for-each-ref --format="%(refname:strip=-1)" &&
+       test_must_fail git for-each-ref --format="%(refname:strip=foo)"
+'
+
+test_expect_success 'stripping refnames too far gives an error' '
+       test_must_fail git for-each-ref --format="%(refname:strip=3)"
+'
+
 test_expect_success 'Check format specifiers are ignored in naming date atoms' '
        git for-each-ref --format="%(authordate)" refs/heads &&
        git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads &&
@@ -338,47 +356,14 @@ for i in "--perl --shell" "-s --python" "--python --tcl" "--tcl --perl"; do
        "
 done
 
-cat >expected <<\EOF
-master
-testtag
-EOF
-
-test_expect_success 'Check short refname format' '
-       (git for-each-ref --format="%(refname:short)" refs/heads &&
-       git for-each-ref --format="%(refname:short)" refs/tags) >actual &&
-       test_cmp expected actual
-'
-
-cat >expected <<EOF
-origin/master
-EOF
-
-test_expect_success 'Check short upstream format' '
-       git for-each-ref --format="%(upstream:short)" refs/heads >actual &&
-       test_cmp expected actual
-'
-
 test_expect_success 'setup for upstream:track[short]' '
        test_commit two
 '
 
-cat >expected <<EOF
-[ahead 1]
-EOF
-
-test_expect_success 'Check upstream:track format' '
-       git for-each-ref --format="%(upstream:track)" refs/heads >actual &&
-       test_cmp expected actual
-'
-
-cat >expected <<EOF
->
-EOF
-
-test_expect_success 'Check upstream:trackshort format' '
-       git for-each-ref --format="%(upstream:trackshort)" refs/heads >actual &&
-       test_cmp expected actual
-'
+test_atom head upstream:track '[ahead 1]'
+test_atom head upstream:trackshort '>'
+test_atom head push:track '[ahead 1]'
+test_atom head push:trackshort '>'
 
 test_expect_success 'Check that :track[short] cannot be used with other atoms' '
        test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null &&
@@ -398,21 +383,6 @@ test_expect_success 'Check that :track[short] works when upstream is invalid' '
        test_cmp expected actual
 '
 
-test_expect_success '%(push) supports tracking specifiers, too' '
-       echo "[ahead 1]" >expected &&
-       git for-each-ref --format="%(push:track)" refs/heads >actual &&
-       test_cmp expected actual
-'
-
-cat >expected <<EOF
-$(git rev-parse --short HEAD)
-EOF
-
-test_expect_success 'Check short objectname format' '
-       git for-each-ref --format="%(objectname:short)" refs/heads >actual &&
-       test_cmp expected actual
-'
-
 test_expect_success 'Check for invalid refname format' '
        test_must_fail git for-each-ref --format="%(refname:INVALID)"
 '
index 869e0bf0735033f66c5cba44d107f799fc07b112..edb834187a1e4be0a3a0cc52157e09233d3644e1 100755 (executable)
@@ -333,6 +333,14 @@ test_expect_success 'prune empty collapsed merges' '
        test_cmp expect actual
 '
 
+test_expect_success 'prune empty works even without index/tree filters' '
+       git rev-list HEAD >expect &&
+       git commit --allow-empty -m empty &&
+       git filter-branch -f --prune-empty HEAD &&
+       git rev-list HEAD >actual &&
+       test_cmp expect actual
+'
+
 test_expect_success '--remap-to-ancestor with filename filters' '
        git checkout master &&
        git reset --hard A &&
index 3dd2f51e49d7e6824382ac415cf64842fa3b757f..c64579fe152bac31e5b2d1acf8179248be6f6e89 100755 (executable)
@@ -1558,4 +1558,12 @@ test_expect_success '--no-merged show unmerged tags' '
        test_cmp expect actual
 '
 
+test_expect_success 'ambiguous branch/tags not marked' '
+       git tag ambiguous &&
+       git branch ambiguous &&
+       echo ambiguous >expect &&
+       git tag -l ambiguous >actual &&
+       test_cmp expect actual
+'
+
 test_done
diff --git a/t/t7409-submodule-detached-work-tree.sh b/t/t7409-submodule-detached-work-tree.sh
new file mode 100755 (executable)
index 0000000..c207171
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# Copyright (c) 2012 Daniel Graña
+#
+
+test_description='Test submodules on detached working tree
+
+This test verifies that "git submodule" initialization, update and addition works
+on detahced working trees
+'
+
+TEST_NO_CREATE_REPO=1
+. ./test-lib.sh
+
+test_expect_success 'submodule on detached working tree' '
+       git init --bare remote &&
+       test_create_repo bundle1 &&
+       (
+               cd bundle1 &&
+               test_commit "shoot" &&
+               git rev-parse --verify HEAD >../expect
+       ) &&
+       mkdir home &&
+       (
+               cd home &&
+               GIT_WORK_TREE="$(pwd)" &&
+               GIT_DIR="$(pwd)/.dotfiles" &&
+               export GIT_WORK_TREE GIT_DIR &&
+               git clone --bare ../remote .dotfiles &&
+               git submodule add ../bundle1 .vim/bundle/sogood &&
+               test_commit "sogood" &&
+               (
+                       unset GIT_WORK_TREE GIT_DIR &&
+                       cd .vim/bundle/sogood &&
+                       git rev-parse --verify HEAD >actual &&
+                       test_cmp ../../../../expect actual
+               ) &&
+               git push origin master
+       ) &&
+       mkdir home2 &&
+       (
+               cd home2 &&
+               git clone --bare ../remote .dotfiles &&
+               GIT_WORK_TREE="$(pwd)" &&
+               GIT_DIR="$(pwd)/.dotfiles" &&
+               export GIT_WORK_TREE GIT_DIR &&
+               git checkout master &&
+               git submodule update --init &&
+               (
+                       unset GIT_WORK_TREE GIT_DIR &&
+                       cd .vim/bundle/sogood &&
+                       git rev-parse --verify HEAD >actual &&
+                       test_cmp ../../../../expect actual
+               )
+       )
+'
+
+test_expect_success 'submodule on detached working pointed by core.worktree' '
+       mkdir home3 &&
+       (
+               cd home3 &&
+               GIT_DIR="$(pwd)/.dotfiles" &&
+               export GIT_DIR &&
+               git clone --bare ../remote "$GIT_DIR" &&
+               git config core.bare false &&
+               git config core.worktree .. &&
+               git checkout master &&
+               git submodule add ../bundle1 .vim/bundle/dupe &&
+               test_commit "dupe" &&
+               git push origin master
+       ) &&
+       (
+               cd home &&
+               GIT_DIR="$(pwd)/.dotfiles" &&
+               export GIT_DIR &&
+               git config core.bare false &&
+               git config core.worktree .. &&
+               git pull &&
+               git submodule update --init &&
+               test -f .vim/bundle/dupe/shoot.t
+       )
+'
+
+test_done
diff --git a/t/t7409-submodule-detached-worktree.sh b/t/t7409-submodule-detached-worktree.sh
deleted file mode 100755 (executable)
index c207171..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Daniel Graña
-#
-
-test_description='Test submodules on detached working tree
-
-This test verifies that "git submodule" initialization, update and addition works
-on detahced working trees
-'
-
-TEST_NO_CREATE_REPO=1
-. ./test-lib.sh
-
-test_expect_success 'submodule on detached working tree' '
-       git init --bare remote &&
-       test_create_repo bundle1 &&
-       (
-               cd bundle1 &&
-               test_commit "shoot" &&
-               git rev-parse --verify HEAD >../expect
-       ) &&
-       mkdir home &&
-       (
-               cd home &&
-               GIT_WORK_TREE="$(pwd)" &&
-               GIT_DIR="$(pwd)/.dotfiles" &&
-               export GIT_WORK_TREE GIT_DIR &&
-               git clone --bare ../remote .dotfiles &&
-               git submodule add ../bundle1 .vim/bundle/sogood &&
-               test_commit "sogood" &&
-               (
-                       unset GIT_WORK_TREE GIT_DIR &&
-                       cd .vim/bundle/sogood &&
-                       git rev-parse --verify HEAD >actual &&
-                       test_cmp ../../../../expect actual
-               ) &&
-               git push origin master
-       ) &&
-       mkdir home2 &&
-       (
-               cd home2 &&
-               git clone --bare ../remote .dotfiles &&
-               GIT_WORK_TREE="$(pwd)" &&
-               GIT_DIR="$(pwd)/.dotfiles" &&
-               export GIT_WORK_TREE GIT_DIR &&
-               git checkout master &&
-               git submodule update --init &&
-               (
-                       unset GIT_WORK_TREE GIT_DIR &&
-                       cd .vim/bundle/sogood &&
-                       git rev-parse --verify HEAD >actual &&
-                       test_cmp ../../../../expect actual
-               )
-       )
-'
-
-test_expect_success 'submodule on detached working pointed by core.worktree' '
-       mkdir home3 &&
-       (
-               cd home3 &&
-               GIT_DIR="$(pwd)/.dotfiles" &&
-               export GIT_DIR &&
-               git clone --bare ../remote "$GIT_DIR" &&
-               git config core.bare false &&
-               git config core.worktree .. &&
-               git checkout master &&
-               git submodule add ../bundle1 .vim/bundle/dupe &&
-               test_commit "dupe" &&
-               git push origin master
-       ) &&
-       (
-               cd home &&
-               GIT_DIR="$(pwd)/.dotfiles" &&
-               export GIT_DIR &&
-               git config core.bare false &&
-               git config core.worktree .. &&
-               git pull &&
-               git submodule update --init &&
-               test -f .vim/bundle/dupe/shoot.t
-       )
-'
-
-test_done
index 847d098c094566aafd8dd05fd3962e28f113360e..75da219ed1be95c8279b363816d46bc3e2686fc3 100755 (executable)
@@ -33,11 +33,15 @@ author $SJIS_NAME
 summary $SJIS_MSG
 EOF
 
+filter_author_summary () {
+       sed -n -e '/^author /p' -e '/^summary /p' "$@"
+}
+
 test_expect_success !MINGW \
        'blame respects i18n.commitencoding' '
-       git blame --incremental file | \
-               egrep "^(author|summary) " > actual &&
-       test_cmp actual expected
+       git blame --incremental file >output &&
+       filter_author_summary output >actual &&
+       test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -52,9 +56,9 @@ EOF
 test_expect_success !MINGW \
        'blame respects i18n.logoutputencoding' '
        git config i18n.logoutputencoding eucJP &&
-       git blame --incremental file | \
-               egrep "^(author|summary) " > actual &&
-       test_cmp actual expected
+       git blame --incremental file >output &&
+       filter_author_summary output >actual &&
+       test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -68,9 +72,9 @@ EOF
 
 test_expect_success !MINGW \
        'blame respects --encoding=UTF-8' '
-       git blame --incremental --encoding=UTF-8 file | \
-               egrep "^(author|summary) " > actual &&
-       test_cmp actual expected
+       git blame --incremental --encoding=UTF-8 file >output &&
+       filter_author_summary output >actual &&
+       test_cmp expected actual
 '
 
 cat >expected <<EOF
@@ -84,9 +88,9 @@ EOF
 
 test_expect_success !MINGW \
        'blame respects --encoding=none' '
-       git blame --incremental --encoding=none file | \
-               egrep "^(author|summary) " > actual &&
-       test_cmp actual expected
+       git blame --incremental --encoding=none file >output &&
+       filter_author_summary output >actual &&
+       test_cmp expected actual
 '
 
 test_done
index 3c49536e0e8d2ae0e046b498ad6efaccab8e9f1b..834d91a691556530cd85cc34b2e3f0330764d253 100755 (executable)
@@ -1527,6 +1527,21 @@ test_expect_success $PREREQ 'cccover adds Cc to all mail' '
        test_cover_addresses "Cc"
 '
 
+test_expect_success $PREREQ 'escaped quotes in sendemail.aliasfiletype=mutt' '
+       clean_fake_sendmail &&
+       echo "alias sbd \\\"Dot U. Sir\\\" <somebody@example.org>" >.mutt &&
+       git config --replace-all sendemail.aliasesfile "$(pwd)/.mutt" &&
+       git config sendemail.aliasfiletype mutt &&
+       git send-email \
+               --from="Example <nobody@example.com>" \
+               --to=sbd \
+               --smtp-server="$(pwd)/fake.sendmail" \
+               outdir/0001-*.patch \
+               2>errors >out &&
+       grep "^!somebody@example\.org!$" commandline1 &&
+       grep -F "To: \"Dot U. Sir\" <somebody@example.org>" out
+'
+
 test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' '
        clean_fake_sendmail &&
        echo "alias sbd  somebody@example.org" >.mailrc &&
index 812c9cd462f58f6fd76e3d339e95137aee598801..7117719830e0493cca1415cd3020dff213f73728 100755 (executable)
@@ -35,7 +35,7 @@ exit 1
 
 check_entries () {
        # $1 == directory, $2 == expected
-       grep '^/' "$1/CVS/Entries" | sort | cut -d/ -f2,3,5 >actual
+       sed -ne '/^\//p' "$1/CVS/Entries" | sort | cut -d/ -f2,3,5 >actual
        if test -z "$2"
        then
                >expected
index c64e5a50258d1b3d3655e2dfcf8f391977c5e758..8d99eb303fd62a1c179ab31f471a3376898586b0 100644 (file)
@@ -617,7 +617,7 @@ test_must_fail () {
                return 0
        elif test $exit_code -gt 129 && test $exit_code -le 192
        then
-               echo >&2 "test_must_fail: died by signal: $*"
+               echo >&2 "test_must_fail: died by signal $(($exit_code - 128)): $*"
                return 1
        elif test $exit_code -eq 127
        then
index 16c4d7b516649a13e3f07e081e91e1212afc61a5..51e4a88c333463e23957eb07139b01a3de1a1a0e 100644 (file)
@@ -907,9 +907,11 @@ yes () {
                y="$*"
        fi
 
-       while echo "$y"
+       i=0
+       while test $i -lt 99
        do
-               :
+               echo "$y"
+               i=$(($i+1))
        done
 }
 
@@ -1054,20 +1056,28 @@ test_lazy_prereq NOT_ROOT '
        test "$uid" != 0
 '
 
-# On a filesystem that lacks SANITY, a file can be deleted even if
-# the containing directory doesn't have write permissions, or a file
-# can be accessed even if the containing directory doesn't have read
-# or execute permissions, causing our tests that validate that Git
-# works sensibly in such situations.
+# SANITY is about "can you correctly predict what the filesystem would
+# do by only looking at the permission bits of the files and
+# directories?"  A typical example of !SANITY is running the test
+# suite as root, where a test may expect "chmod -r file && cat file"
+# to fail because file is supposed to be unreadable after a successful
+# chmod.  In an environment (i.e. combination of what filesystem is
+# being used and who is running the tests) that lacks SANITY, you may
+# be able to delete or create a file when the containing directory
+# doesn't have write permissions, or access a file even if the
+# containing directory doesn't have read or execute permissions.
+
 test_lazy_prereq SANITY '
        mkdir SANETESTD.1 SANETESTD.2 &&
 
        chmod +w SANETESTD.1 SANETESTD.2 &&
        >SANETESTD.1/x 2>SANETESTD.2/x &&
        chmod -w SANETESTD.1 &&
+       chmod -r SANETESTD.1/x &&
        chmod -rx SANETESTD.2 ||
        error "bug in test sript: cannot prepare SANETESTD"
 
+       ! test -r SANETESTD.1/x &&
        ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x
        status=$?
 
index c67bf65b347810c576f80a0ac33e3b84f42e1516..0c15f1821f5bdfbe41b462e89bd63240fc4afc70 100644 (file)
@@ -8,21 +8,14 @@
  */
 static int normalize_ceiling_entry(struct string_list_item *item, void *unused)
 {
-       const char *ceil = item->string;
-       int len = strlen(ceil);
-       char buf[PATH_MAX+1];
+       char *ceil = item->string;
 
-       if (len == 0)
+       if (!*ceil)
                die("Empty path is not supported");
-       if (len > PATH_MAX)
-               die("Path \"%s\" is too long", ceil);
        if (!is_absolute_path(ceil))
                die("Path \"%s\" is not absolute", ceil);
-       if (normalize_path_copy(buf, ceil) < 0)
+       if (normalize_path_copy(ceil, ceil) < 0)
                die("Path \"%s\" could not be normalized", ceil);
-       len = strlen(buf);
-       free(item->string);
-       item->string = xstrdup(buf);
        return 1;
 }
 
@@ -39,10 +32,134 @@ static void normalize_argv_string(const char **var, const char *input)
                die("Bad value: %s\n", input);
 }
 
+struct test_data {
+       const char *from;  /* input:  transform from this ... */
+       const char *to;    /* output: ... to this.            */
+       const char *alternative; /* output: ... or this.      */
+};
+
+static int test_function(struct test_data *data, char *(*func)(char *input),
+       const char *funcname)
+{
+       int failed = 0, i;
+       char buffer[1024];
+       char *to;
+
+       for (i = 0; data[i].to; i++) {
+               if (!data[i].from)
+                       to = func(NULL);
+               else {
+                       strcpy(buffer, data[i].from);
+                       to = func(buffer);
+               }
+               if (!strcmp(to, data[i].to))
+                       continue;
+               if (!data[i].alternative)
+                       error("FAIL: %s(%s) => '%s' != '%s'\n",
+                               funcname, data[i].from, to, data[i].to);
+               else if (!strcmp(to, data[i].alternative))
+                       continue;
+               else
+                       error("FAIL: %s(%s) => '%s' != '%s', '%s'\n",
+                               funcname, data[i].from, to, data[i].to,
+                               data[i].alternative);
+               failed = 1;
+       }
+       return failed;
+}
+
+static struct test_data basename_data[] = {
+       /* --- POSIX type paths --- */
+       { NULL,              "."    },
+       { "",                "."    },
+       { ".",               "."    },
+       { "..",              ".."   },
+       { "/",               "/"    },
+       { "//",              "/", "//" },
+       { "///",             "/", "//" },
+       { "////",            "/", "//" },
+       { "usr",             "usr"  },
+       { "/usr",            "usr"  },
+       { "/usr/",           "usr"  },
+       { "/usr//",          "usr"  },
+       { "/usr/lib",        "lib"  },
+       { "usr/lib",         "lib"  },
+       { "usr/lib///",      "lib"  },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+       /* --- win32 type paths --- */
+       { "\\usr",           "usr"  },
+       { "\\usr\\",         "usr"  },
+       { "\\usr\\\\",       "usr"  },
+       { "\\usr\\lib",      "lib"  },
+       { "usr\\lib",        "lib"  },
+       { "usr\\lib\\\\\\",  "lib"  },
+       { "C:/usr",          "usr"  },
+       { "C:/usr",          "usr"  },
+       { "C:/usr/",         "usr"  },
+       { "C:/usr//",        "usr"  },
+       { "C:/usr/lib",      "lib"  },
+       { "C:usr/lib",       "lib"  },
+       { "C:usr/lib///",    "lib"  },
+       { "C:",              "."    },
+       { "C:a",             "a"    },
+       { "C:/",             "/"    },
+       { "C:///",           "/"    },
+       { "\\",              "\\", "/" },
+       { "\\\\",            "\\", "/" },
+       { "\\\\\\",          "\\", "/" },
+#endif
+       { NULL,              NULL   }
+};
+
+static struct test_data dirname_data[] = {
+       /* --- POSIX type paths --- */
+       { NULL,              "."      },
+       { "",                "."      },
+       { ".",               "."      },
+       { "..",              "."      },
+       { "/",               "/"      },
+       { "//",              "/", "//" },
+       { "///",             "/", "//" },
+       { "////",            "/", "//" },
+       { "usr",             "."      },
+       { "/usr",            "/"      },
+       { "/usr/",           "/"      },
+       { "/usr//",          "/"      },
+       { "/usr/lib",        "/usr"   },
+       { "usr/lib",         "usr"    },
+       { "usr/lib///",      "usr"    },
+
+#if defined(__MINGW32__) || defined(_MSC_VER)
+       /* --- win32 type paths --- */
+       { "\\",              "\\"     },
+       { "\\\\",            "\\\\"   },
+       { "\\usr",           "\\"     },
+       { "\\usr\\",         "\\"     },
+       { "\\usr\\\\",       "\\"     },
+       { "\\usr\\lib",      "\\usr"  },
+       { "usr\\lib",        "usr"    },
+       { "usr\\lib\\\\\\",  "usr"    },
+       { "C:a",             "C:."    },
+       { "C:/",             "C:/"    },
+       { "C:///",           "C:/"    },
+       { "C:/usr",          "C:/"    },
+       { "C:/usr/",         "C:/"    },
+       { "C:/usr//",        "C:/"    },
+       { "C:/usr/lib",      "C:/usr" },
+       { "C:usr/lib",       "C:usr"  },
+       { "C:usr/lib///",    "C:usr"  },
+       { "\\\\\\",          "\\"     },
+       { "\\\\\\\\",        "\\"     },
+       { "C:",              "C:.", "." },
+#endif
+       { NULL,              NULL     }
+};
+
 int main(int argc, char **argv)
 {
        if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) {
-               char *buf = xmalloc(PATH_MAX + 1);
+               char *buf = xmallocz(strlen(argv[2]));
                int rv = normalize_path_copy(buf, argv[2]);
                if (rv)
                        buf = "++failed++";
@@ -133,6 +250,12 @@ int main(int argc, char **argv)
                return 0;
        }
 
+       if (argc == 2 && !strcmp(argv[1], "basename"))
+               return test_function(basename_data, basename, argv[1]);
+
+       if (argc == 2 && !strcmp(argv[1], "dirname"))
+               return test_function(dirname_data, dirname, argv[1]);
+
        fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
                argv[1] ? argv[1] : "(there was none)");
        return 1;
index 67f366687c7abf2f6bd9cf31faa6f4ed9e6dc69e..988047b12e380f94cb1a88cc5da3bb72d1ee217f 100644 (file)
@@ -1306,7 +1306,7 @@ int transport_fetch_refs(struct transport *transport, struct ref *refs)
                 * This condition shouldn't be met in a non-deepening fetch
                 * (see builtin/fetch.c:quickfetch()).
                 */
-               heads = xmalloc(nr_refs * sizeof(*heads));
+               ALLOC_ARRAY(heads, nr_refs);
                for (rm = refs; rm; rm = rm->next)
                        heads[nr_heads++] = rm;
        }
@@ -1350,7 +1350,7 @@ int transport_disconnect(struct transport *transport)
  */
 char *transport_anonymize_url(const char *url)
 {
-       char *anon_url, *scheme_prefix, *anon_part;
+       char *scheme_prefix, *anon_part;
        size_t anon_len, prefix_len = 0;
 
        anon_part = strchr(url, '@');
@@ -1384,10 +1384,8 @@ char *transport_anonymize_url(const char *url)
                        goto literal_copy;
                prefix_len = scheme_prefix - url + 3;
        }
-       anon_url = xcalloc(1, 1 + prefix_len + anon_len);
-       memcpy(anon_url, url, prefix_len);
-       memcpy(anon_url + prefix_len, anon_part, anon_len);
-       return anon_url;
+       return xstrfmt("%.*s%.*s", (int)prefix_len, url,
+                      (int)anon_len, anon_part);
 literal_copy:
        return xstrdup(url);
 }
index 290a1da4ce5c3504dd75e584030a4a00fbdbe9a2..4dda9a14abacbf38ba19fcf89b2ef54576a26538 100644 (file)
@@ -124,8 +124,8 @@ static struct combine_diff_path *path_appendnew(struct combine_diff_path *last,
        unsigned mode, const unsigned char *sha1)
 {
        struct combine_diff_path *p;
-       int len = base->len + pathlen;
-       int alloclen = combine_diff_path_size(nparent, len);
+       size_t len = st_add(base->len, pathlen);
+       size_t alloclen = combine_diff_path_size(nparent, len);
 
        /* if last->next is !NULL - it is a pre-allocated memory, we can reuse */
        p = last->next;
index 4a7e78ffbcc6d552a39dcccd9008d6c11919e432..2ef0ce545278ea2f40526c42303c541736643bd5 100644 (file)
@@ -23,6 +23,10 @@ int userdiff_config(const char *k, const char *v);
 struct userdiff_driver *userdiff_find_by_name(const char *name);
 struct userdiff_driver *userdiff_find_by_path(const char *path);
 
+/*
+ * Initialize any textconv-related fields in the driver and return it, or NULL
+ * if it does not have textconv enabled at all.
+ */
 struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver);
 
 #endif /* USERDIFF */
index 981f810e80008d878d6a5af1331c89dc093c5927..6181a66f1ee2e1e45d7d8b2c88d312746473661f 100644 (file)
@@ -176,10 +176,10 @@ struct worktree **get_worktrees(void)
                        if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
                                continue;
 
-                               if ((linked = get_linked_worktree(d->d_name))) {
-                                       ALLOC_GROW(list, counter + 1, alloc);
-                                       list[counter++] = linked;
-                               }
+                       if ((linked = get_linked_worktree(d->d_name))) {
+                               ALLOC_GROW(list, counter + 1, alloc);
+                               list[counter++] = linked;
+                       }
                }
                closedir(dir);
        }
index c95e2906b850749cbeb109050359b671979969f2..32c6c609da0fbc3a40d17b34de61bffa7c43700c 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -152,6 +152,9 @@ void *xcalloc(size_t nmemb, size_t size)
 {
        void *ret;
 
+       if (unsigned_mult_overflows(nmemb, size))
+               die("data too large to fit into virtual memory space");
+
        memory_limit_check(size * nmemb, 0);
        ret = calloc(nmemb, size);
        if (!ret && (!nmemb || !size))
@@ -375,6 +378,19 @@ FILE *xfdopen(int fd, const char *mode)
        return stream;
 }
 
+FILE *fopen_for_writing(const char *path)
+{
+       FILE *ret = fopen(path, "w");
+
+       if (!ret && errno == EPERM) {
+               if (!unlink(path))
+                       ret = fopen(path, "w");
+               else
+                       errno = EPERM;
+       }
+       return ret;
+}
+
 int xmkstemp(char *template)
 {
        int fd;
index e7afe7a295e586d58313e82e87b22de347aef7a1..49e80aa222132c3c151b79bd37749d92a12f745a 100644 (file)
@@ -1,8 +1,12 @@
 #include "cache.h"
+#include "run-command.h"
 
 static void check_pipe(int err)
 {
        if (err == EPIPE) {
+               if (in_async())
+                       async_exit(141);
+
                signal(SIGPIPE, SIG_DFL);
                raise(SIGPIPE);
                /* Should never happen, but just in case... */
index cb67c1c42b35e412dccf9a13ad18dde727ab8ce6..54236f24b9786710f91650ac63f6004cdeb012e6 100644 (file)
@@ -265,7 +265,7 @@ void xdiff_set_find_func(xdemitconf_t *xecfg, const char *value, int cflags)
        for (i = 0, regs->nr = 1; value[i]; i++)
                if (value[i] == '\n')
                        regs->nr++;
-       regs->array = xmalloc(regs->nr * sizeof(struct ff_reg));
+       ALLOC_ARRAY(regs->array, regs->nr);
        for (i = 0; i < regs->nr; i++) {
                struct ff_reg *reg = regs->array + i;
                const char *ep = strchr(value, '\n'), *expression;
index c0339919ccf78c4fe7d78123f9c3e891075d0602..4fb7e79410c22fba1fb390af2e09008e932f5ea8 100644 (file)
@@ -42,7 +42,6 @@ extern "C" {
 #define XDF_IGNORE_BLANK_LINES (1 << 7)
 
 #define XDL_EMIT_FUNCNAMES (1 << 0)
-#define XDL_EMIT_COMMON (1 << 1)
 #define XDL_EMIT_FUNCCONTEXT (1 << 2)
 
 #define XDL_MMB_READONLY (1 << 0)
index 4266ada23f3c37c1989c7fa4283b423d16c0891b..993724b11c40bacffee8df927018e5790a265bd4 100644 (file)
@@ -120,21 +120,6 @@ static long def_ff(const char *rec, long len, char *buf, long sz, void *priv)
        return -1;
 }
 
-static int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
-                           xdemitconf_t const *xecfg) {
-       xdfile_t *xdf = &xe->xdf2;
-       const char *rchg = xdf->rchg;
-       long ix;
-
-       for (ix = 0; ix < xdf->nrec; ix++) {
-               if (rchg[ix])
-                       continue;
-               if (xdl_emit_record(xdf, ix, "", ecb))
-                       return -1;
-       }
-       return 0;
-}
-
 struct func_line {
        long len;
        char buf[80];
@@ -170,9 +155,6 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
        long funclineprev = -1;
        struct func_line func_line = { 0 };
 
-       if (xecfg->flags & XDL_EMIT_COMMON)
-               return xdl_emit_common(xe, xscr, ecb, xecfg);
-
        for (xch = xscr; xch; xch = xche->next) {
                xche = xdl_get_hunk(&xch, xecfg);
                if (!xch)
index 625198e0585c52c20c778790c82126efd1b57009..d98f430c912bead3ee5381eafd195dde4d709c47 100644 (file)
@@ -109,7 +109,7 @@ static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
        return 0;
 }
 
-static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
 {
        xrecord_t **recs;
        int size = 0;
@@ -125,6 +125,12 @@ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add
        if (add_nl) {
                i = recs[count - 1]->size;
                if (i == 0 || recs[count - 1]->ptr[i - 1] != '\n') {
+                       if (needs_cr) {
+                               if (dest)
+                                       dest[size] = '\r';
+                               size++;
+                       }
+
                        if (dest)
                                dest[size] = '\n';
                        size++;
@@ -133,14 +139,58 @@ static int xdl_recs_copy_0(int use_orig, xdfenv_t *xe, int i, int count, int add
        return size;
 }
 
-static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int xdl_recs_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
+{
+       return xdl_recs_copy_0(0, xe, i, count, needs_cr, add_nl, dest);
+}
+
+static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int needs_cr, int add_nl, char *dest)
+{
+       return xdl_recs_copy_0(1, xe, i, count, needs_cr, add_nl, dest);
+}
+
+/*
+ * Returns 1 if the i'th line ends in CR/LF (if it is the last line and
+ * has no eol, the preceding line, if any), 0 if it ends in LF-only, and
+ * -1 if the line ending cannot be determined.
+ */
+static int is_eol_crlf(xdfile_t *file, int i)
 {
-       return xdl_recs_copy_0(0, xe, i, count, add_nl, dest);
+       long size;
+
+       if (i < file->nrec - 1)
+               /* All lines before the last *must* end in LF */
+               return (size = file->recs[i]->size) > 1 &&
+                       file->recs[i]->ptr[size - 2] == '\r';
+       if (!file->nrec)
+               /* Cannot determine eol style from empty file */
+               return -1;
+       if ((size = file->recs[i]->size) &&
+                       file->recs[i]->ptr[size - 1] == '\n')
+               /* Last line; ends in LF; Is it CR/LF? */
+               return size > 1 &&
+                       file->recs[i]->ptr[size - 2] == '\r';
+       if (!i)
+               /* The only line has no eol */
+               return -1;
+       /* Determine eol from second-to-last line */
+       return (size = file->recs[i - 1]->size) > 1 &&
+               file->recs[i - 1]->ptr[size - 2] == '\r';
 }
 
-static int xdl_orig_copy(xdfenv_t *xe, int i, int count, int add_nl, char *dest)
+static int is_cr_needed(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m)
 {
-       return xdl_recs_copy_0(1, xe, i, count, add_nl, dest);
+       int needs_cr;
+
+       /* Match post-images' preceding, or first, lines' end-of-line style */
+       needs_cr = is_eol_crlf(&xe1->xdf2, m->i1 ? m->i1 - 1 : 0);
+       if (needs_cr)
+               needs_cr = is_eol_crlf(&xe2->xdf2, m->i2 ? m->i2 - 1 : 0);
+       /* Look at pre-image's first line, unless we already settled on LF */
+       if (needs_cr)
+               needs_cr = is_eol_crlf(&xe1->xdf1, 0);
+       /* If still undecided, use LF-only */
+       return needs_cr < 0 ? 0 : needs_cr;
 }
 
 static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
@@ -152,16 +202,17 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
        int marker1_size = (name1 ? strlen(name1) + 1 : 0);
        int marker2_size = (name2 ? strlen(name2) + 1 : 0);
        int marker3_size = (name3 ? strlen(name3) + 1 : 0);
+       int needs_cr = is_cr_needed(xe1, xe2, m);
 
        if (marker_size <= 0)
                marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 
        /* Before conflicting part */
-       size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
+       size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
                              dest ? dest + size : NULL);
 
        if (!dest) {
-               size += marker_size + 1 + marker1_size;
+               size += marker_size + 1 + needs_cr + marker1_size;
        } else {
                memset(dest + size, '<', marker_size);
                size += marker_size;
@@ -170,17 +221,19 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
                        memcpy(dest + size + 1, name1, marker1_size - 1);
                        size += marker1_size;
                }
+               if (needs_cr)
+                       dest[size++] = '\r';
                dest[size++] = '\n';
        }
 
        /* Postimage from side #1 */
-       size += xdl_recs_copy(xe1, m->i1, m->chg1, 1,
+       size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, 1,
                              dest ? dest + size : NULL);
 
        if (style == XDL_MERGE_DIFF3) {
                /* Shared preimage */
                if (!dest) {
-                       size += marker_size + 1 + marker3_size;
+                       size += marker_size + 1 + needs_cr + marker3_size;
                } else {
                        memset(dest + size, '|', marker_size);
                        size += marker_size;
@@ -189,25 +242,29 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
                                memcpy(dest + size + 1, name3, marker3_size - 1);
                                size += marker3_size;
                        }
+                       if (needs_cr)
+                               dest[size++] = '\r';
                        dest[size++] = '\n';
                }
-               size += xdl_orig_copy(xe1, m->i0, m->chg0, 1,
+               size += xdl_orig_copy(xe1, m->i0, m->chg0, needs_cr, 1,
                                      dest ? dest + size : NULL);
        }
 
        if (!dest) {
-               size += marker_size + 1;
+               size += marker_size + 1 + needs_cr;
        } else {
                memset(dest + size, '=', marker_size);
                size += marker_size;
+               if (needs_cr)
+                       dest[size++] = '\r';
                dest[size++] = '\n';
        }
 
        /* Postimage from side #2 */
-       size += xdl_recs_copy(xe2, m->i2, m->chg2, 1,
+       size += xdl_recs_copy(xe2, m->i2, m->chg2, needs_cr, 1,
                              dest ? dest + size : NULL);
        if (!dest) {
-               size += marker_size + 1 + marker2_size;
+               size += marker_size + 1 + needs_cr + marker2_size;
        } else {
                memset(dest + size, '>', marker_size);
                size += marker_size;
@@ -216,6 +273,8 @@ static int fill_conflict_hunk(xdfenv_t *xe1, const char *name1,
                        memcpy(dest + size + 1, name2, marker2_size - 1);
                        size += marker2_size;
                }
+               if (needs_cr)
+                       dest[size++] = '\r';
                dest[size++] = '\n';
        }
        return size;
@@ -241,21 +300,24 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
                                                  marker_size);
                else if (m->mode & 3) {
                        /* Before conflicting part */
-                       size += xdl_recs_copy(xe1, i, m->i1 - i, 0,
+                       size += xdl_recs_copy(xe1, i, m->i1 - i, 0, 0,
                                              dest ? dest + size : NULL);
                        /* Postimage from side #1 */
-                       if (m->mode & 1)
-                               size += xdl_recs_copy(xe1, m->i1, m->chg1, (m->mode & 2),
+                       if (m->mode & 1) {
+                               int needs_cr = is_cr_needed(xe1, xe2, m);
+
+                               size += xdl_recs_copy(xe1, m->i1, m->chg1, needs_cr, (m->mode & 2),
                                                      dest ? dest + size : NULL);
+                       }
                        /* Postimage from side #2 */
                        if (m->mode & 2)
-                               size += xdl_recs_copy(xe2, m->i2, m->chg2, 0,
+                               size += xdl_recs_copy(xe2, m->i2, m->chg2, 0, 0,
                                                      dest ? dest + size : NULL);
                } else
                        continue;
                i = m->i1 + m->chg1;
        }
-       size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0,
+       size += xdl_recs_copy(xe1, i, xe1->xdf2.nrec - i, 0, 0,
                              dest ? dest + size : NULL);
        return size;
 }