From: Junio C Hamano Date: Wed, 17 Feb 2016 18:13:31 +0000 (-0800) Subject: Merge branch 'da/user-useconfigonly' X-Git-Tag: v2.8.0-rc0~51 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/c37f9a1bc38cad56c9eca40014802e7cd822c21c?hp=4d5c2956969a6690db2bbb2f3ff40459c09d7646 Merge branch 'da/user-useconfigonly' The "user.useConfigOnly" configuration variable can be used to force the user to always set user.email & user.name configuration variables, serving as a reminder for those who work on multiple projects and do not want to put these in their $HOME/.gitconfig. * da/user-useconfigonly: ident: add user.useConfigOnly boolean for when ident shouldn't be guessed fmt_ident: refactor strictness checks --- diff --git a/.gitignore b/.gitignore index 1c2f832138..5087ce1eb7 100644 --- a/.gitignore +++ b/.gitignore @@ -187,6 +187,7 @@ /test-dump-cache-tree /test-dump-split-index /test-dump-untracked-cache +/test-fake-ssh /test-scrap-cache-tree /test-genrandom /test-hashmap diff --git a/.travis.yml b/.travis.yml index c3bf9c6d4d..f8b73ec3da 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,11 @@ language: c +sudo: false + +cache: + directories: + - $HOME/travis-cache + os: - linux - osx @@ -18,7 +24,7 @@ env: - P4_VERSION="15.2" - GIT_LFS_VERSION="1.1.0" - DEFAULT_TEST_TARGET=prove - - GIT_PROVE_OPTS="--timer --jobs 3" + - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save" - GIT_TEST_OPTS="--verbose --tee" - CFLAGS="-g -O2 -Wall -Werror" - GIT_TEST_CLONE_2GB=YesPlease @@ -67,6 +73,8 @@ before_install: p4 -V | grep Rev.; echo "$(tput setaf 6)Git-LFS Version$(tput sgr0)"; git-lfs version; + mkdir -p $HOME/travis-cache; + ln -s $HOME/travis-cache/.prove t/.prove; before_script: make --jobs=2 diff --git a/Documentation/RelNotes/2.7.1.txt b/Documentation/RelNotes/2.7.1.txt new file mode 100644 index 0000000000..6553d69e33 --- /dev/null +++ b/Documentation/RelNotes/2.7.1.txt @@ -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.8.0.txt b/Documentation/RelNotes/2.8.0.txt new file mode 100644 index 0000000000..17e904cf4d --- /dev/null +++ b/Documentation/RelNotes/2.8.0.txt @@ -0,0 +1,275 @@ +Git 2.8 Release Notes +===================== + +Updates since v2.7 +------------------ + +UI, Workflows & Features + + * "branch --delete" has "branch -d" but "push --delete" does not. + + * "git blame" learned to produce the progress eye-candy when it takes + too much time before emitting the first line of the result. + + * "git grep" can now be configured (or told from the command line) + how many threads to use when searching in the working tree files. + + * Some "git notes" operations, e.g. "git log --notes=", should + be able to read notes from any tree-ish that is shaped like a notes + tree, but the notes infrastructure required that the argument must + be a ref under refs/notes/. Loosen it to require a valid ref only + when the operation would update the notes (in which case we must + have a place to store the updated notes tree, iow, a ref). + + * "git grep" by default does not fall back to its "--no-index" + behaviour outside a directory under Git's control (otherwise the + user may by mistake end up running a huge recursive search); with a + new configuration (set in $HOME/.gitconfig--by definition this + cannot be set in the config file per project), this safety can be + disabled. + + * "git pull --rebase" has been extended to allow invoking + "rebase -i". + + * "git p4" learned to cope with the type of a file getting changed. + + * "git format-patch" learned to notice format.outputDirectory + configuration variable. This allows "-o " option to be + omitted on the command line if you always use the same directory in + your workflow. + + * "interpret-trailers" has been taught to optionally update a file in + place, instead of always writing the result to the standard output. + + * Many commands that read files that are expected to contain text + that is generated (or can be edited) by the end user to control + their behaviour (e.g. "git grep -f ") have been updated + to be more tolerant to lines that are terminated with CRLF (they + used to treat such a line to contain payload that ends with CR, + which is usually not what the users expect). + + * "git notes merge" used to limit the source of the merged notes tree + to somewhere under refs/notes/ hierarchy, which was too limiting + when inventing a workflow to exchange notes with remote + repositories using remote-tracking notes trees (located in e.g. + refs/remote-notes/ or somesuch). + + * "git ls-files" learned a new "--eol" option to help diagnose + end-of-line problems. + + * "ls-remote" learned an option to show which branch the remote + repository advertises as its primary by pointing its HEAD at. + + * New http.proxyAuthMethod configuration variable can be used to + specify what authentication method to use, as a way to work around + proxies that do not give error response expected by libcurl when + CURLAUTH_ANY is used. Also, the codepath for proxy authentication + has been taught to use credential API to store the authentication + material in user's keyrings. + + * Update the untracked cache subsystem and change its primary UI from + "git update-index" to "git config". + + * There were a few "now I am doing this thing" progress messages in + the TCP connection code that can be triggered by setting a verbose + option internally in the code, but "git fetch -v" and friends never + passed the verbose option down to that codepath. + + * Clean/smudge filters defined in a configuration file of lower + precedence can now be overridden to be a pass-through no-op by + setting the variable to an empty string. + + * A new "^{/!-}" notation can be used to name a + commit that is reachable from that does not match the + given . + + +Performance, Internal Implementation, Development Support etc. + + * Add a framework to spawn a group of processes in parallel, and use + it to run "git fetch --recurse-submodules" in parallel. + + * A slight update to the Makefile to mark "phoney" targets + as such correctly. + + * In-core storage of the reverse index for .pack files (which lets + you go from a pack offset to an object name) has been streamlined. + + * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like + $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias + handling by overwriting GIT_WORK_TREE environment variable to + affect subprocesses when set_git_work_tree() gets called, which + resulted in a rather unpleasant regression to "clone" and "init". + Try to address the same issue by always restoring the environment + and respawning the real underlying command when handling alias. + + * The low-level code that is used to create symbolic references has + been updated to share more code with the code that deals with + normal references. + + * strbuf_getline() and friends have been redefined to make it easier + to identify which callsite of (new) strbuf_getline_lf() should + allow and silently ignore carriage-return at the end of the line to + help users on DOSsy systems. + + * "git shortlog" used to accumulate various pieces of information + regardless of what was asked to be shown in the final output. It + has been optimized by noticing what need not to be collected + (e.g. there is no need to collect the log messages when showing + only the number of changes). + + * "git checkout $branch" (and other operations that share the same + underlying machinery) has been optimized. + + * Automated tests in Travis CI environment has been optimized by + persisting runtime statistics of previous "prove" run, executing + tests that take longer before other ones; this reduces the total + wallclock time. + + +Also contains various documentation updates and code clean-ups. + + +Fixes since v2.7 +---------------- + +Unless otherwise noted, all the fixes since v2.7 in the maintenance +track are contained in this release (see the maintenance releases' +notes for details). + + * 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. + (merge df1e6ea nd/stop-setenv-work-tree later to maint). + + * 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. + (merge 2653a8c nd/dir-exclude-cleanup later to maint). + + * 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. + (merge 4d55200 nd/ita-cleanup later to maint). + + * "git send-email" was confused by escaped quotes stored in the alias + files saved by "mutt", which has been corrected. + (merge 2c510f2 ew/send-email-mutt-alias-fix later to maint). + + * A few unportable C construct have been spotted by clang compiler + and have been fixed. + (merge a0df2e5 jk/clang-pedantic later to maint). + + * The documentation has been updated to hint the connection between + the '--signoff' option and DCO. + (merge b2c150d dw/signoff-doc later to maint). + + * "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. + (merge aecad37 dk/reflog-walk-with-non-commit later to maint). + + * 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. + (merge 8c72236 nd/exclusion-regression-fix later to maint). + + * 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. + (merge ea56518 js/fopen-harder later to maint). + + * Asking gitweb for a nonexistent commit left a warning in the server + log. + + Somebody may want to follow this up with an additional test, perhaps? + IIRC, we do test that no Perl warnings are given to the server log, + so this should have been caught if our test coverage were good. + (merge a9eb90a ho/gitweb-squelch-undef-warning later to maint). + + * "git rebase", unlike all other callers of "gc --auto", did not + ignore the exit code from "gc --auto". + (merge 8c24f5b jk/ok-to-fail-gc-auto-in-rebase later to maint). + + * 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. + (merge d562102 js/close-packs-before-gc later to maint). + + * A recent optimization to filter-branch in v2.7.0 introduced a + regression when --prune-empty filter is used, which has been + corrected. + (merge 1dc413e jk/filter-branch-no-index later to maint). + + * The description for SANITY prerequisite the test suite uses has + been clarified both in the comment and in the implementation. + (merge 719c3da jk/sanity later to maint). + + * "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. + (merge 0571979 jk/list-tag-2.7-regression later to maint). + + * The way "git svn" uses auth parameter was broken by Subversion + 1.9.0 and later. + (merge 0b66415 ew/svn-1.9.0-auth later to maint). + + * The "split" subcommand of "git subtree" (in contrib/) incorrectly + skipped merges when it shouldn't, which was corrected. + (merge 933cfeb dw/subtree-split-do-not-drop-merge later to maint). + + * A few options of "git diff" did not work well when the command was + run from a subdirectory. + (merge a97262c nd/diff-with-path-params later to maint). + + * The command line completion learned a handful of additional options + and command specific syntax. + (merge fa4b5e3 jk/completion-rebase later to maint). + (merge f7c2e1a pw/completion-show-branch later to maint). + (merge d7d4ca8 pw/completion-stash later to maint). + (merge e6414b4 tb/complete-word-diff-regex later to maint). + + * dirname() emulation has been added, as Msys2 lacks it. + (merge e7d5ce8 js/dirname-basename later to maint). + + * 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. + (merge a2d5156 jk/ref-cache-non-repository-optim later to maint). + + * "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. + (merge 618244e nd/do-not-move-worktree-manually later to maint). + + * 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. + (merge 15980de js/xmerge-marker-eol later to maint). + + * "git push --force-with-lease" has been taught to report if the push + needed to force (or fast-forwarded). + (merge b2e93f8 aw/push-force-with-lease-reporting later to maint). + + * 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. + (merge 6129c93 js/test-lib-windows-emulated-yes later to maint). + + * Other minor clean-ups and documentation updates + (merge 99487cf ss/user-manual later to maint). + (merge e914ef0 ew/for-each-ref-doc later to maint). + (merge 36fc7d8 sg/t6050-failing-editor-test-fix later to maint). + (merge 60253a6 ss/clone-depth-single-doc later to maint). + (merge bd02e97 lv/add-doc-working-tree later to maint). diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index 760eab7428..02cb6845cd 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -69,6 +69,13 @@ include::line-range-format.txt[] iso format is used. For supported values, see the discussion of the --date option at linkgit:git-log[1]. +--[no-]progress:: + Progress status is reported on the standard error stream + by default when it is attached to a terminal. This flag + enables progress reporting even if not attached to a + terminal. Can't use `--progress` together with `--porcelain` + or `--incremental`. + -M||:: Detect moved or copied lines within a file. When a commit moves or copies a block of lines (e.g. the original file diff --git a/Documentation/config.txt b/Documentation/config.txt index 068e084885..01cca0a701 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -308,6 +308,15 @@ core.trustctime:: crawlers and some backup systems). See linkgit:git-update-index[1]. True by default. +core.untrackedCache:: + Determines what to do about the untracked cache feature of the + index. It will be kept, if this variable is unset or set to + `keep`. It will automatically be added if set to `true`. And + it will automatically be removed, if set to `false`. Before + setting it to `true`, you should check that mtime is working + properly on your system. + See linkgit:git-update-index[1]. `keep` by default. + core.checkStat:: Determines which stat fields to match between the index and work tree. The user can set this to 'default' or @@ -870,6 +879,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase' so that locally committed merge commits will not be flattened by running 'git pull'. + +When the value is `interactive`, the rebase is run in interactive mode. ++ *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand the implications (see linkgit:git-rebase[1] for details). @@ -1243,6 +1254,10 @@ format.coverLetter:: format-patch is invoked, but in addition can be set to "auto", to generate a cover-letter only when there's more than one patch. +format.outputDirectory:: + Set a custom directory to store the resulting files instead of the + current working directory. + filter..clean:: The command which is used to convert the content of a worktree file to a blob upon checkin. See linkgit:gitattributes[5] for @@ -1450,6 +1465,14 @@ grep.extendedRegexp:: option is ignored when the 'grep.patternType' option is set to a value other than 'default'. +grep.threads:: + Number of grep worker threads to use. + See `grep.threads` in linkgit:git-grep[1] for more information. + +grep.fallbackToNoIndex:: + If set to true, fall back to git grep --no-index if git grep + is executed outside of a git repository. Defaults to false. + gpg.program:: Use this custom program instead of "gpg" found on $PATH when making or verifying a PGP signature. The program must support the @@ -1596,9 +1619,34 @@ help.htmlPath:: http.proxy:: Override the HTTP proxy, normally configured using the 'http_proxy', - 'https_proxy', and 'all_proxy' environment variables (see - `curl(1)`). This can be overridden on a per-remote basis; see - remote..proxy + 'https_proxy', and 'all_proxy' environment variables (see `curl(1)`). In + addition to the syntax understood by curl, it is possible to specify a + proxy string with a user name but no password, in which case git will + attempt to acquire one in the same way it does for other credentials. See + linkgit:gitcredentials[7] for more information. The syntax thus is + '[protocol://][user[:password]@]proxyhost[:port]'. This can be overridden + on a per-remote basis; see remote..proxy + +http.proxyAuthMethod:: + Set the method with which to authenticate against the HTTP proxy. This + only takes effect if the configured proxy string contains a user name part + (i.e. is of the form 'user@host' or 'user@host:port'). This can be + overridden on a per-remote basis; see `remote..proxyAuthMethod`. + Both can be overridden by the 'GIT_HTTP_PROXY_AUTHMETHOD' environment + variable. Possible values are: ++ +-- +* `anyauth` - Automatically pick a suitable authentication method. It is + assumed that the proxy answers an unauthenticated request with a 407 + status code and one or more Proxy-authenticate headers with supported + authentication methods. This is the default. +* `basic` - HTTP Basic authentication +* `digest` - HTTP Digest authentication; this prevents the password from being + transmitted to the proxy in clear text +* `negotiate` - GSS-Negotiate authentication (compare the --negotiate option + of `curl(1)`) +* `ntlm` - NTLM authentication (compare the --ntlm option of `curl(1)`) +-- http.cookieFile:: File containing previously stored cookie lines which should be used @@ -2074,7 +2122,7 @@ pack.indexVersion:: larger than 2 GB. + If you have an old Git that does not understand the version 2 `*.idx` file, -cloning or fetching over a non native protocol (e.g. "http" and "rsync") +cloning or fetching over a non native protocol (e.g. "http") that will copy both `*.pack` file and corresponding `*.idx` file from the other side may give you a repository that cannot be accessed with your older version of Git. If the `*.pack` file is smaller than 2 GB, however, @@ -2149,6 +2197,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase' so that locally committed merge commits will not be flattened by running 'git pull'. + +When the value is `interactive`, the rebase is run in interactive mode. ++ *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand the implications (see linkgit:git-rebase[1] for details). @@ -2407,6 +2457,11 @@ remote..proxy:: the proxy to use for that remote. Set to the empty string to disable proxying for that remote. +remote..proxyAuthMethod:: + For remotes that require curl (http, https and ftp), the method to use for + authenticating against the proxy in use (probably set in + `remote..proxy`). See `http.proxyAuthMethod`. + remote..fetch:: The default set of "refspec" for linkgit:git-fetch[1]. See linkgit:git-fetch[1]. diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index 45583d8454..952dfdfef0 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -8,10 +8,11 @@ option old data in `.git/FETCH_HEAD` will be overwritten. --depth=:: - Deepen or shorten the history of a 'shallow' repository created by - `git clone` with `--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=` 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 @@ -100,6 +101,13 @@ ifndef::git-pull[] reference to a commit that isn't already in the local submodule clone. +-j:: +--jobs=:: + Number of parallel children to be used for fetching submodules. + Each will fetch from different submodules, such that fetching many + submodules will be faster. By default submodules will be fetched + one at a time. + --no-recurse-submodules:: Disable recursive fetching of submodules (this has the same effect as using the '--recurse-submodules=no' option). diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index fe5282f130..6a96a669c2 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -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. diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 452c1feb23..13cdd7f3b6 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -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:: diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index e6e947c808..ba5417567c 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -10,7 +10,8 @@ SYNOPSIS [verse] 'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L ] [-S ] [-M] [-C] [-C] [-C] [--since=] - [--abbrev=] [ | --contents | --reverse ] [--] + [--progress] [--abbrev=] [ | --contents | --reverse ] + [--] DESCRIPTION ----------- diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt index 0417562eb7..3a8120c3b3 100644 --- a/Documentation/git-bundle.txt +++ b/Documentation/git-bundle.txt @@ -20,7 +20,7 @@ DESCRIPTION Some workflows require that one or more branches of development on one machine be replicated on another machine, but the two machines cannot be directly connected, and therefore the interactive Git protocols (git, -ssh, rsync, http) cannot be used. This command provides support for +ssh, http) cannot be used. This command provides support for 'git fetch' and 'git pull' to operate by packaging objects and references in an archive at the originating machine, then importing those into another repository using 'git fetch' and 'git pull' diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 77da29a474..6154e57238 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -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[]:: --gpg-sign[=]:: diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 6bf000dac3..b7c467a001 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -115,8 +115,7 @@ objects from the source repository into a pack in the cloned repository. --quiet:: -q:: Operate quietly. Progress is not reported to the standard - error stream. This flag is also passed to the `rsync' - command when given. + error stream. --verbose:: -v:: @@ -190,15 +189,14 @@ objects from the source repository into a pack in the cloned repository. --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 diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 7f34a5b331..9ec6b3cc17 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -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:: diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index c6f073cea4..2e3e96f663 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -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=` is appended, strips `` + slash-separated path components from the front of the refname + (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`. + `` must be a positive integer. If a displayed ref has fewer + components than ``, 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 diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index e3cdaeb958..6821441d7d 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -57,7 +57,11 @@ The names of the output files are printed to standard output, unless the `--stdout` option is specified. If `-o` is specified, output files are created in . Otherwise -they are created in the current working directory. +they are created in the current working directory. The default path +can be set with the 'format.outputDirectory' configuration option. +The `-o` option takes precedence over `format.outputDirectory`. +To store patches in the current working directory even when +`format.outputDirectory` points elsewhere, use `-o .`. By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank @@ -109,6 +113,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, diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 4a44d6da13..cb0f6cf678 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -23,6 +23,7 @@ SYNOPSIS [--break] [--heading] [-p | --show-function] [-A ] [-B ] [-C ] [-W | --function-context] + [--threads ] [-f ] [-e] [--and|--or|--not|(|)|-e ...] [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | ...] @@ -53,9 +54,17 @@ grep.extendedRegexp:: option is ignored when the 'grep.patternType' option is set to a value other than 'default'. +grep.threads:: + Number of grep worker threads to use. If unset (or set to 0), + 8 threads are used by default (for now). + grep.fullName:: If set to true, enable '--full-name' option by default. +grep.fallbackToNoIndex:: + If set to true, fall back to git grep --no-index if git grep + is executed outside of a git repository. Defaults to false. + OPTIONS ------- @@ -227,6 +236,10 @@ OPTIONS effectively showing the whole function in which the match was found. +--threads :: + Number of grep worker threads to use. + See `grep.threads` in 'CONFIGURATION' for more information. + -f :: Read patterns from , one per line. diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt index 0ecd497c4d..a77b901f1d 100644 --- a/Documentation/git-interpret-trailers.txt +++ b/Documentation/git-interpret-trailers.txt @@ -8,7 +8,7 @@ git-interpret-trailers - help add structured information into commit messages SYNOPSIS -------- [verse] -'git interpret-trailers' [--trim-empty] [(--trailer [(=|:)])...] [...] +'git interpret-trailers' [--in-place] [--trim-empty] [(--trailer [(=|:)])...] [...] DESCRIPTION ----------- @@ -64,6 +64,9 @@ folding rules, the encoding rules and probably many other rules. OPTIONS ------- +--in-place:: + Edit the files in place. + --trim-empty:: If the part of any trailer contains only whitespace, the whole trailer will be removed from the resulting message. @@ -216,6 +219,25 @@ Signed-off-by: Alice Signed-off-by: Bob ------------ +* Use the '--in-place' option to edit a message file in place: ++ +------------ +$ cat msg.txt +subject + +message + +Signed-off-by: Bob +$ git interpret-trailers --trailer 'Acked-by: Alice ' --in-place msg.txt +$ cat msg.txt +subject + +message + +Signed-off-by: Bob +Acked-by: Alice +------------ + * Extract the last commit as a patch, and add a 'Cc' and a 'Reviewed-by' trailer to it: + diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index e26f01fb1d..0e08f567a1 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -12,6 +12,7 @@ SYNOPSIS 'git ls-files' [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])* + [--eol] [-x |--exclude=] [-X |--exclude-from=] [--exclude-per-directory=] @@ -147,6 +148,24 @@ a space) at the start of each line: possible for manual inspection; the exact format may change at any time. +--eol:: + Show and of files. + is the file content identification used by Git when + the "text" attribute is "auto" (or not set and core.autocrlf is not false). + is either "-text", "none", "lf", "crlf", "mixed" or "". ++ +"" means the file is not a regular file, it is not in the index or +not accessable in the working tree. ++ + is the attribute that is used when checking out or committing, +it is either "", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf". +Note: Currently Git does not support "text=auto eol=lf" or "text=auto eol=crlf", +that may change in the future. ++ +Both the in the index ("i/") +and in the working tree ("w/") are shown for regular files, +followed by the ("attr/"). + \--:: Do not interpret any more arguments as options. @@ -161,6 +180,9 @@ which case it outputs: [ ] +'git ls-files --eol' will show + i/w/attr/ + 'git ls-files --unmerged' and 'git ls-files --stage' can be used to examine detailed information on unmerged paths. diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt index d510c05e11..5f2628c8f8 100644 --- a/Documentation/git-ls-remote.txt +++ b/Documentation/git-ls-remote.txt @@ -9,8 +9,9 @@ git-ls-remote - List references in a remote repository SYNOPSIS -------- [verse] -'git ls-remote' [--heads] [--tags] [--upload-pack=] - [--exit-code] [...] +'git ls-remote' [--heads] [--tags] [--refs] [--upload-pack=] + [-q | --quiet] [--exit-code] [--get-url] + [--symref] [ [...]] DESCRIPTION ----------- @@ -29,6 +30,13 @@ OPTIONS both, references stored in refs/heads and refs/tags are displayed. +--refs:: + Do not show peeled tags or pseudorefs like HEAD in the output. + +-q:: +--quiet:: + Do not print remote URL to stderr. + --upload-pack=:: Specify the full path of 'git-upload-pack' on the remote host. This allows listing references from repositories accessed via @@ -46,6 +54,12 @@ OPTIONS "url..insteadOf" config setting (See linkgit:git-config[1]) and exit without talking to the remote. +--symref:: + In addition to the object pointed by it, show the underlying + ref pointed by it when showing a symbolic ref. Currently, + upload-pack only shows the symref HEAD, so it will be the only + one shown by ls-remote. + :: The "remote" repository to query. This parameter can be either a URL or the name of a remote (see the GIT URLS and diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 93c72a29ce..a62a2a615d 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -101,7 +101,7 @@ Options related to merging include::merge-options.txt[] -r:: ---rebase[=false|true|preserve]:: +--rebase[=false|true|preserve|interactive]:: When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream branch and the upstream branch @@ -113,6 +113,8 @@ to `git rebase` so that locally created merge commits will not be flattened. + When false, merge the current branch into the upstream branch. + +When `interactive`, enable the interactive mode of rebase. ++ See `pull.rebase`, `branch..rebase` and `branch.autoSetupRebase` in linkgit:git-config[1] if you want to make `git pull` always use `--rebase` instead of merging. diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 4c775bcec4..32482cec42 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -10,7 +10,7 @@ SYNOPSIS -------- [verse] 'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=] - [--repo=] [-f | --force] [--prune] [-v | --verbose] + [--repo=] [-f | --force] [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream] [--[no-]signed|--sign=(true|false|if-asked)] [--force-with-lease[=[:]]] diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 0e0bd363d6..af230d0647 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -133,7 +133,7 @@ By default, the command passes `--delta-base-offset` option to 'git pack-objects'; this typically results in slightly smaller packs, but the generated packs are incompatible with versions of Git older than version 1.4.4. If you need to share your repository with such ancient Git -versions, either directly or via the dumb http or rsync protocol, then you +versions, either directly or via the dumb http protocol, then you need to set the configuration variable `repack.UseDeltaBaseOffset` to "false" and repack. Access from old Git versions over the native protocol is unaffected by this option as the conversion is performed on the fly diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index b15139ffdc..573616a04a 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -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=:: Use the given merge strategy. Should only be used once. diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 7220e5eca1..abab4814ec 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -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 []:: Only list tags whose tips are reachable, or not reachable diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index f4e5a85351..c6cbed189c 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -18,7 +18,7 @@ SYNOPSIS [--[no-]skip-worktree] [--ignore-submodules] [--[no-]split-index] - [--[no-|force-]untracked-cache] + [--[no-|test-|force-]untracked-cache] [--really-refresh] [--unresolve] [--again | -g] [--info-only] [--index-info] [-z] [--stdin] [--index-version ] @@ -174,17 +174,30 @@ may not support it yet. --untracked-cache:: --no-untracked-cache:: - Enable or disable untracked cache extension. This could speed - up for commands that involve determining untracked files such - as `git status`. The underlying operating system and file - system must change `st_mtime` field of a directory if files - are added or deleted in that directory. + Enable or disable untracked cache feature. Please use + `--test-untracked-cache` before enabling it. ++ +These options take effect whatever the value of the `core.untrackedCache` +configuration variable (see linkgit:git-config[1]). But a warning is +emitted when the change goes against the configured value, as the +configured value will take effect next time the index is read and this +will remove the intended effect of the option. + +--test-untracked-cache:: + Only perform tests on the working directory to make sure + untracked cache can be used. You have to manually enable + untracked cache using `--untracked-cache` or + `--force-untracked-cache` or the `core.untrackedCache` + configuration variable afterwards if you really want to use + it. If a test fails the exit code is 1 and a message + explains what is not working as needed, otherwise the exit + code is 0 and OK is printed. --force-untracked-cache:: - For safety, `--untracked-cache` performs tests on the working - directory to make sure untracked cache can be used. These - tests can take a few seconds. `--force-untracked-cache` can be - used to skip the tests. + Same as `--untracked-cache`. Provided for backwards + compatibility with older versions of Git where + `--untracked-cache` used to imply `--test-untracked-cache` but + this option would enable the extension unconditionally. \--:: Do not interpret any more arguments as options. @@ -375,6 +388,37 @@ Although this bit looks similar to assume-unchanged bit, its goal is different from assume-unchanged bit's. Skip-worktree also takes precedence over assume-unchanged bit when both are set. +Untracked cache +--------------- + +This cache is meant to speed up commands that involve determining +untracked files such as `git status`. + +This feature works by recording the mtime of the working tree +directories and then omitting reading directories and stat calls +against files in those directories whose mtime hasn't changed. For +this to work the underlying operating system and file system must +change the `st_mtime` field of directories if files in the directory +are added, modified or deleted. + +You can test whether the filesystem supports that with the +`--test-untracked-cache` option. The `--untracked-cache` option used +to implicitly perform that test in older versions of Git, but that's +no longer the case. + +If you want to enable (or disable) this feature, it is easier to use +the `core.untrackedCache` configuration variable (see +linkgit:git-config[1]) than using the `--untracked-cache` option to +`git update-index` in each repository, especially if you want to do so +across all repositories you use, because you can set the configuration +variable to `true` (or `false`) in your `$HOME/.gitconfig` just once +and have it affect all repositories you touch. + +When the `core.untrackedCache` configuration variable is changed, the +untracked cache is added to or removed from the index the next time a +command reads the index; while when `--[no-|force-]untracked-cache` +are used, the untracked cache is immediately added to or removed from +the index. Configuration ------------- @@ -400,6 +444,9 @@ It can be useful when the inode change time is regularly modified by something outside Git (file system crawlers and backup systems use ctime for marking files processed) (see linkgit:git-config[1]). +The untracked cache extension can be enabled by the +`core.untrackedCache` configuration variable (see +linkgit:git-config[1]). SEE ALSO -------- diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 5b9ad0429c..62c76c1c89 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -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 diff --git a/Documentation/git.txt b/Documentation/git.txt index bff6302c0d..a48c1e8024 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,10 @@ 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.1/git.html[documentation for release 2.7.1] * release notes for + 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] @@ -1123,8 +1124,6 @@ of clones and fetches. - `ssh`: git over ssh (including `host:path` syntax, `git+ssh://`, etc). - - `rsync`: git over rsync - - `http`: git over http, both "smart http" and "dumb http". Note that this does _not_ include `https`; if you want both, you should specify both as `http:https`. diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index 36e9ab3e16..15b3bfa8db 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -710,7 +710,7 @@ files). Again, this can all be simplified with ---------------- -$ git clone rsync://rsync.kernel.org/pub/scm/git/git.git/ my-git +$ git clone git://git.kernel.org/pub/scm/git/git.git/ my-git $ cd my-git $ git checkout ---------------- @@ -1011,20 +1011,6 @@ $ git fetch One of the following transports can be used to name the repository to download from: -Rsync:: - `rsync://remote.machine/path/to/repo.git/` -+ -Rsync transport is usable for both uploading and downloading, -but is completely unaware of what git does, and can produce -unexpected results when you download from the public repository -while the repository owner is uploading into it via `rsync` -transport. Most notably, it could update the files under -`refs/` which holds the object name of the topmost commits -before uploading the files in `objects/` -- the downloader would -obtain head commit object name while that object itself is still -not available in the repository. For this reason, it is -considered deprecated. - SSH:: `remote.machine:/path/to/repo.git/` or + @@ -1430,7 +1416,7 @@ while, depending on how active your project is. When a repository is synchronized via `git push` and `git pull` objects packed in the source repository are usually stored -unpacked in the destination, unless rsync transport is used. +unpacked in the destination. While this allows you to use different packing strategies on both ends, it also means you may need to repack both repositories every once in a while. diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 79a1948a0b..473623d631 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -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 -------- diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt index b00c67df46..b3b58d324e 100644 --- a/Documentation/gittutorial.txt +++ b/Documentation/gittutorial.txt @@ -451,7 +451,7 @@ perform clones and pulls using the ssh protocol: bob$ git clone alice.org:/home/alice/project myrepo ------------------------------------- -Alternatively, Git has a native protocol, or can use rsync or http; +Alternatively, Git has a native protocol, or can use http; see linkgit:git-pull[1] for details. Git can also be used in a CVS-like mode, with a central repository diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt index e225974253..cafc284359 100644 --- a/Documentation/glossary-content.txt +++ b/Documentation/glossary-content.txt @@ -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_shallow_clone]]shallow clone:: + Mostly a synonym to <> + but the phrase makes it more explicit that it was created by + running `git clone --depth=...` command. + [[def_shallow_repository]]shallow repository:: A shallow <> has an incomplete history some of whose <> have <> cauterized away (in other diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt index 4b659ac1a6..54b88b6dca 100644 --- a/Documentation/pretty-options.txt +++ b/Documentation/pretty-options.txt @@ -43,7 +43,7 @@ people using 80-column terminals. commit may be copied to the output. ifndef::git-rev-list[] ---notes[=]:: +--notes[=]:: Show the notes (see linkgit:git-notes[1]) that annotate the commit, when showing the commit log message. This is the default for `git log`, `git show` and `git whatchanged` commands when @@ -54,8 +54,8 @@ By default, the notes shown are from the notes refs listed in the 'core.notesRef' and 'notes.displayRef' variables (or corresponding environment overrides). See linkgit:git-config[1] for more details. + -With an optional '' argument, show this notes ref instead of the -default notes ref(s). The ref specifies the full refname when it begins +With an optional '' argument, use the treeish to find the notes +to display. The treeish can specify the full refname when it begins with `refs/notes/`; when it begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed to form a full name of the ref. + @@ -71,7 +71,7 @@ being displayed. Examples: "--notes=foo" will show only notes from "--notes --notes=foo --no-notes --notes=bar" will only show notes from "refs/notes/bar". ---show-notes[=]:: +--show-notes[=]:: --[no-]standard-notes:: These options are deprecated. Use the above --notes/--no-notes options instead. diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index d85e303364..19314e3b7f 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -61,11 +61,11 @@ some output processing may assume ref names in UTF-8. '@':: '@' alone is a shortcut for 'HEAD'. -'@\{\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}':: +'@{}', e.g. 'master@\{yesterday\}', 'HEAD@{5 minutes ago}':: A ref followed by the suffix '@' with a date specification enclosed in a brace - pair (e.g. '\{yesterday\}', '\{1 month 2 weeks 3 days 1 hour 1 - second ago\}' or '\{1979-02-26 18:30:00\}') specifies the value + pair (e.g. '\{yesterday\}', '{1 month 2 weeks 3 days 1 hour 1 + second ago}' or '{1979-02-26 18:30:00}') specifies the value of the ref at a prior point in time. This suffix may only be used immediately following a ref name and the ref must have an existing log ('$GIT_DIR/logs/'). Note that this looks up the state @@ -73,7 +73,7 @@ some output processing may assume ref names in UTF-8. 'master' branch last week. If you want to look at commits made during certain times, see '--since' and '--until'. -'@\{\}', e.g. 'master@\{1\}':: +'@{}', e.g. 'master@\{1\}':: A ref followed by the suffix '@' with an ordinal specification enclosed in a brace pair (e.g. '\{1\}', '\{15\}') specifies the n-th prior value of that ref. For example 'master@\{1\}' @@ -82,13 +82,13 @@ some output processing may assume ref names in UTF-8. immediately following a ref name and the ref must have an existing log ('$GIT_DIR/logs/'). -'@\{\}', e.g. '@\{1\}':: +'@{}', e.g. '@\{1\}':: You can use the '@' construct with an empty ref part to get at a reflog entry of the current branch. For example, if you are on branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'. -'@\{-\}', e.g. '@\{-1\}':: - The construct '@\{-\}' means the th branch/commit checked out +'@{-}', e.g. '@{-1}':: + The construct '@{-}' means the th branch/commit checked out before the current one. '@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}':: @@ -139,7 +139,7 @@ from one location and push to another. In a non-triangular workflow, '{caret}1{caret}1{caret}1'. See below for an illustration of the usage of this form. -'{caret}\{\}', e.g. 'v0.99.8{caret}\{commit\}':: +'{caret}{}', e.g. 'v0.99.8{caret}\{commit\}':: A suffix '{caret}' followed by an object type name enclosed in brace pair means dereference the object at '' recursively until an object of type '' is found or the object cannot be @@ -159,13 +159,13 @@ it does not have to be dereferenced even once to get to an object. 'rev{caret}\{tag\}' can be used to ensure that 'rev' identifies an existing tag object. -'{caret}\{\}', e.g. 'v0.99.8{caret}\{\}':: +'{caret}{}', e.g. 'v0.99.8{caret}{}':: A suffix '{caret}' followed by an empty brace pair means the object could be a tag, and dereference the tag recursively until a non-tag object is found. -'{caret}\{/\}', e.g. 'HEAD^{/fix nasty bug}':: +'{caret}{/}', e.g. 'HEAD^{/fix nasty bug}':: A suffix '{caret}' to a revision parameter, followed by a brace pair that contains a text led by a slash, is the same as the ':/fix nasty bug' syntax below except that @@ -176,11 +176,12 @@ existing tag object. A colon, followed by a slash, followed by a text, names a commit whose commit message matches the specified regular expression. This name returns the youngest matching commit which is - reachable from any ref. If the commit message starts with a - '!' you have to repeat that; the special sequence ':/!', - followed by something else than '!', is reserved for now. - The regular expression can match any part of the commit message. To - match messages starting with a string, one can use e.g. ':/^foo'. + reachable from any ref. The regular expression can match any part of the + commit message. To match messages starting with a string, one can use + e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what + is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a + literal '!' character, followed by 'foo'. Any other sequence beginning with + ':/!' is reserved for now. ':', e.g. 'HEAD:README', ':README', 'master:./README':: A suffix ':' followed by a path names the blob or tree diff --git a/Documentation/technical/api-remote.txt b/Documentation/technical/api-remote.txt index 2cfdd224a8..f10941b2e8 100644 --- a/Documentation/technical/api-remote.txt +++ b/Documentation/technical/api-remote.txt @@ -51,6 +51,10 @@ struct remote The proxy to use for curl (http, https, ftp, etc.) URLs. +`http_proxy_authmethod`:: + + The method used for authenticating against `http_proxy`. + struct remotes can be found by name with remote_get(), and iterated through with for_each_remote(). remote_get(NULL) will return the default remote, given the current branch and configuration. diff --git a/Documentation/urls.txt b/Documentation/urls.txt index 9ccb24677e..b05da95788 100644 --- a/Documentation/urls.txt +++ b/Documentation/urls.txt @@ -7,9 +7,8 @@ Depending on the transport protocol, some of this information may be absent. Git supports ssh, git, http, and https protocols (in addition, ftp, -and ftps can be used for fetching and rsync can be used for fetching -and pushing, but these are inefficient and deprecated; do not use -them). +and ftps can be used for fetching, but this is inefficient and +deprecated; do not use it). The native transport (i.e. git:// URL) does no authentication and should be used with caution on unsecured networks. @@ -20,7 +19,6 @@ The following syntaxes may be used with them: - git://host.xz{startsb}:port{endsb}/path/to/repo.git/ - http{startsb}s{endsb}://host.xz{startsb}:port{endsb}/path/to/repo.git/ - ftp{startsb}s{endsb}://host.xz{startsb}:port{endsb}/path/to/repo.git/ -- rsync://host.xz/path/to/repo.git/ An alternative scp-like syntax may also be used with the ssh protocol: diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 1c790ac74a..ec6bacfcdf 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -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 <>, 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 <> 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 <> 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. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 51aa9e6806..5873f163e5 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.7.0 +DEF_VER=v2.7.0.GIT LF=' ' diff --git a/Makefile b/Makefile index fd19b544c2..10566d6481 100644 --- a/Makefile +++ b/Makefile @@ -583,6 +583,7 @@ TEST_PROGRAMS_NEED_X += test-delta TEST_PROGRAMS_NEED_X += test-dump-cache-tree TEST_PROGRAMS_NEED_X += test-dump-split-index TEST_PROGRAMS_NEED_X += test-dump-untracked-cache +TEST_PROGRAMS_NEED_X += test-fake-ssh TEST_PROGRAMS_NEED_X += test-genrandom TEST_PROGRAMS_NEED_X += test-hashmap TEST_PROGRAMS_NEED_X += test-index-version @@ -2025,6 +2026,7 @@ $(VCSSVN_LIB): $(VCSSVN_OBJS) export DEFAULT_EDITOR DEFAULT_PAGER +.PHONY: doc man html info pdf doc: $(MAKE) -C Documentation all @@ -2068,6 +2070,7 @@ po/git.pot: $(GENERATED_H) FORCE $(LOCALIZED_PERL) mv $@+ $@ +.PHONY: pot pot: po/git.pot POFILES := $(wildcard po/*.po) @@ -2277,6 +2280,7 @@ mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir)) install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X) +.PHONY: profile-install profile-fast-install profile-install: profile $(MAKE) install @@ -2343,6 +2347,8 @@ endif done && \ ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" +.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf +.PHONY: quick-install-doc quick-install-man quick-install-html install-gitweb: $(MAKE) -C gitweb install @@ -2402,6 +2408,7 @@ rpm: dist htmldocs = git-htmldocs-$(GIT_VERSION) manpages = git-manpages-$(GIT_VERSION) +.PHONY: dist-doc distclean dist-doc: $(RM) -r .doc-tmp-dir mkdir .doc-tmp-dir @@ -2470,6 +2477,8 @@ ALL_COMMANDS += git ALL_COMMANDS += gitk ALL_COMMANDS += gitweb ALL_COMMANDS += git-gui git-citool + +.PHONY: check-docs check-docs:: @(for v in $(ALL_COMMANDS); \ do \ @@ -2514,6 +2523,7 @@ check-builtins:: ### Test suite coverage testing # .PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report +.PHONY: coverage-untested-functions cover_db cover_db_html .PHONY: coverage-clean-results coverage: diff --git a/RelNotes b/RelNotes index 3ba13ce253..7db30403c3 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes/2.7.0.txt \ No newline at end of file +Documentation/RelNotes/2.8.0.txt \ No newline at end of file diff --git a/bisect.c b/bisect.c index 42aa7aa6aa..06ec54e599 100644 --- a/bisect.c +++ b/bisect.c @@ -440,7 +440,7 @@ static void read_bisect_paths(struct argv_array *array) if (!fp) die_errno("Could not open file '%s'", filename); - while (strbuf_getline(&str, fp, '\n') != EOF) { + while (strbuf_getline_lf(&str, fp) != EOF) { strbuf_trim(&str); if (sq_dequote_to_argv_array(str.buf, array)) die("Badly quoted content in file '%s': %s", @@ -668,7 +668,7 @@ static int is_expected_rev(const struct object_id *oid) if (!fp) return 0; - if (strbuf_getline(&str, fp, '\n') != EOF) + if (strbuf_getline_lf(&str, fp) != EOF) res = !strcmp(str.buf, oid_to_hex(oid)); strbuf_release(&str); @@ -914,9 +914,9 @@ void read_bisect_terms(const char **read_bad, const char **read_good) strerror(errno)); } } else { - strbuf_getline(&str, fp, '\n'); + strbuf_getline_lf(&str, fp); *read_bad = strbuf_detach(&str, NULL); - strbuf_getline(&str, fp, '\n'); + strbuf_getline_lf(&str, fp); *read_good = strbuf_detach(&str, NULL); } strbuf_release(&str); diff --git a/builtin/am.c b/builtin/am.c index 9fb42fdd71..259dc1cd11 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -45,21 +45,6 @@ static int is_empty_file(const char *filename) return !st.st_size; } -/** - * Like strbuf_getline(), but treats both '\n' and "\r\n" as line terminators. - */ -static int strbuf_getline_crlf(struct strbuf *sb, FILE *fp) -{ - if (strbuf_getwholeline(sb, fp, '\n')) - return EOF; - if (sb->buf[sb->len - 1] == '\n') { - strbuf_setlen(sb, sb->len - 1); - if (sb->len > 0 && sb->buf[sb->len - 1] == '\r') - strbuf_setlen(sb, sb->len - 1); - } - return 0; -} - /** * Returns the length of the first line of msg. */ @@ -284,7 +269,7 @@ static char *read_shell_var(FILE *fp, const char *key) struct strbuf sb = STRBUF_INIT; const char *str; - if (strbuf_getline(&sb, fp, '\n')) + if (strbuf_getline_lf(&sb, fp)) goto fail; if (!skip_prefix(sb.buf, key, &str)) @@ -573,7 +558,7 @@ static int copy_notes_for_rebase(const struct am_state *state) fp = xfopen(am_path(state, "rewritten"), "r"); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { unsigned char from_obj[GIT_SHA1_RAWSZ], to_obj[GIT_SHA1_RAWSZ]; if (sb.len != GIT_SHA1_HEXSZ * 2 + 1) { @@ -628,7 +613,7 @@ static int is_mail(FILE *fp) if (regcomp(®ex, header_regex, REG_NOSUB | REG_EXTENDED)) die("invalid pattern: %s", header_regex); - while (!strbuf_getline_crlf(&sb, fp)) { + while (!strbuf_getline(&sb, fp)) { if (!sb.len) break; /* End of header */ @@ -675,7 +660,7 @@ static int detect_patch_format(const char **paths) fp = xfopen(*paths, "r"); - while (!strbuf_getline_crlf(&l1, fp)) { + while (!strbuf_getline(&l1, fp)) { if (l1.len) break; } @@ -696,9 +681,9 @@ static int detect_patch_format(const char **paths) } strbuf_reset(&l2); - strbuf_getline_crlf(&l2, fp); + strbuf_getline(&l2, fp); strbuf_reset(&l3); - strbuf_getline_crlf(&l3, fp); + strbuf_getline(&l3, fp); /* * If the second line is empty and the third is a From, Author or Date @@ -817,7 +802,7 @@ static int stgit_patch_to_mail(FILE *out, FILE *in, int keep_cr) struct strbuf sb = STRBUF_INIT; int subject_printed = 0; - while (!strbuf_getline(&sb, in, '\n')) { + while (!strbuf_getline_lf(&sb, in)) { const char *str; if (str_isspace(sb.buf)) @@ -875,7 +860,7 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths, return error(_("could not open '%s' for reading: %s"), *paths, strerror(errno)); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { if (*sb.buf == '#') continue; /* skip comment lines */ @@ -900,7 +885,7 @@ static int hg_patch_to_mail(FILE *out, FILE *in, int keep_cr) { struct strbuf sb = STRBUF_INIT; - while (!strbuf_getline(&sb, in, '\n')) { + while (!strbuf_getline_lf(&sb, in)) { const char *str; if (skip_prefix(sb.buf, "# User ", &str)) @@ -1317,7 +1302,7 @@ static int parse_mail(struct am_state *state, const char *mail) /* Extract message and author information */ fp = xfopen(am_path(state, "info"), "r"); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { const char *x; if (skip_prefix(sb.buf, "Subject: ", &x)) { @@ -1383,7 +1368,7 @@ static int get_mail_commit_sha1(unsigned char *commit_id, const char *mail) FILE *fp = xfopen(mail, "r"); const char *x; - if (strbuf_getline(&sb, fp, '\n')) + if (strbuf_getline_lf(&sb, fp)) return -1; if (!skip_prefix(sb.buf, "From ", &x)) @@ -1657,7 +1642,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); @@ -1939,6 +1924,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); } } diff --git a/builtin/apply.c b/builtin/apply.c index deb1364fa8..d61ac65dab 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -4464,16 +4464,6 @@ static int option_parse_p(const struct option *opt, return 0; } -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - if (unset) - line_termination = '\n'; - else - line_termination = 0; - return 0; -} - static int option_parse_space_change(const struct option *opt, const char *arg, int unset) { @@ -4546,9 +4536,9 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) N_( "attempt three-way merge if a patch does not apply")), OPT_FILENAME(0, "build-fake-ancestor", &fake_ancestor, N_("build a temporary index based on embedded index information")), - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + /* Think twice before adding "--nul" synonym to this */ + OPT_SET_INT('z', NULL, &line_termination, + N_("paths are separated with NUL character"), '\0'), OPT_INTEGER('C', NULL, &p_context, N_("ensure at least lines of context match")), { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, N_("action"), diff --git a/builtin/blame.c b/builtin/blame.c index 1df13cf7f4..55bf5fae9d 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -28,6 +28,7 @@ #include "line-range.h" #include "line-log.h" #include "dir.h" +#include "progress.h" static char blame_usage[] = N_("git blame [] [] [] [--] "); @@ -50,6 +51,7 @@ static int incremental; static int xdl_opts; static int abbrev = -1; static int no_whole_file_rename; +static int show_progress; static struct date_mode blame_date_mode = { DATE_ISO8601 }; static size_t blame_date_width; @@ -127,6 +129,11 @@ struct origin { char path[FLEX_ARRAY]; }; +struct progress_info { + struct progress *progress; + int blamed_lines; +}; + static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen, xdl_emit_hunk_consume_func_t hunk_func, void *cb_data) { @@ -1746,7 +1753,8 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat) * The blame_entry is found to be guilty for the range. * Show it in incremental output. */ -static void found_guilty_entry(struct blame_entry *ent) +static void found_guilty_entry(struct blame_entry *ent, + struct progress_info *pi) { if (incremental) { struct origin *suspect = ent->suspect; @@ -1758,6 +1766,8 @@ static void found_guilty_entry(struct blame_entry *ent) write_filename_info(suspect->path); maybe_flush_or_die(stdout, "stdout"); } + pi->blamed_lines += ent->num_lines; + display_progress(pi->progress, pi->blamed_lines); } /* @@ -1768,6 +1778,11 @@ static void assign_blame(struct scoreboard *sb, int opt) { struct rev_info *revs = sb->revs; struct commit *commit = prio_queue_get(&sb->commits); + struct progress_info pi = { NULL, 0 }; + + if (show_progress) + pi.progress = start_progress_delay(_("Blaming lines"), + sb->num_lines, 50, 1); while (commit) { struct blame_entry *ent; @@ -1809,7 +1824,7 @@ static void assign_blame(struct scoreboard *sb, int opt) suspect->guilty = 1; for (;;) { struct blame_entry *next = ent->next; - found_guilty_entry(ent); + found_guilty_entry(ent, &pi); if (next) { ent = next; continue; @@ -1825,6 +1840,8 @@ static void assign_blame(struct scoreboard *sb, int opt) if (DEBUG) /* sanity */ sanity_check_refcnt(sb); } + + stop_progress(&pi.progress); } static const char *format_time(unsigned long time, const char *tz_str, @@ -2392,11 +2409,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; @@ -2520,6 +2532,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) OPT_BOOL('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")), OPT_BOOL(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")), OPT_BOOL(0, "show-stats", &show_stats, N_("Show work cost statistics")), + OPT_BOOL(0, "progress", &show_progress, N_("Force progress reporting")), OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE), OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME), OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER), @@ -2555,6 +2568,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) save_commit_buffer = 0; dashdash_pos = 0; + show_progress = -1; parse_options_start(&ctx, argc, argv, prefix, options, PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0); @@ -2579,6 +2593,13 @@ int cmd_blame(int argc, const char **argv, const char *prefix) DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES); argc = parse_options_end(&ctx); + if (incremental || (output_option & OUTPUT_PORCELAIN)) { + if (show_progress > 0) + die("--progress can't be used with --incremental or porcelain formats"); + show_progress = 0; + } else if (show_progress < 0) + show_progress = isatty(2); + if (0 < abbrev) /* one more abbrev length is needed for the boundary commit */ abbrev++; @@ -2828,11 +2849,11 @@ int cmd_blame(int argc, const char **argv, const char *prefix) read_mailmap(&mailmap, NULL); + assign_blame(&sb, opt); + if (!incremental) setup_pager(); - assign_blame(&sb, opt); - free(final_commit_name); if (incremental) diff --git a/builtin/cat-file.c b/builtin/cat-file.c index c0fd8dbb1c..54db1184a0 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -401,7 +401,7 @@ static int batch_objects(struct batch_options *opt) save_warning = warn_on_object_refname_ambiguity; warn_on_object_refname_ambiguity = 0; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline(&buf, stdin) != EOF) { if (data.split_on_whitespace) { /* * Split at first whitespace, tying off the beginning diff --git a/builtin/check-attr.c b/builtin/check-attr.c index 265c9ba022..53a5a18c16 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -72,23 +72,23 @@ static void check_attr(const char *prefix, int cnt, static void check_attr_stdin_paths(const char *prefix, int cnt, struct git_attr_check *check) { - struct strbuf buf, nbuf; - int line_termination = nul_term_line ? 0 : '\n'; - - strbuf_init(&buf, 0); - strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; + strbuf_getline_fn getline_fn; + + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } check_attr(prefix, cnt, check, buf.buf); maybe_flush_or_die(stdout, "attribute to stdout"); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); } static NORETURN void error_with_usage(const char *msg) diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 43f361797a..1d73d3ca3d 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -115,19 +115,19 @@ static int check_ignore(struct dir_struct *dir, static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) { - struct strbuf buf, nbuf; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; char *pathspec[2] = { NULL, NULL }; - int line_termination = nul_term_line ? 0 : '\n'; + strbuf_getline_fn getline_fn; int num_ignored = 0; - strbuf_init(&buf, 0); - strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } pathspec[0] = buf.buf; num_ignored += check_ignore(dir, prefix, @@ -135,7 +135,7 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) maybe_flush_or_die(stdout, "check-ignore to stdout"); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); return num_ignored; } diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index eaaea546d3..cf0f54f6b9 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -54,7 +54,7 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix) if (use_stdin) { struct strbuf buf = STRBUF_INIT; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline_lf(&buf, stdin) != EOF) { check_mailmap(&mailmap, buf.buf); maybe_flush_or_die(stdout, "stdout"); } diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 8028c3768f..92c69672e9 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -11,7 +11,7 @@ #include "parse-options.h" #define CHECKOUT_ALL 4 -static int line_termination = '\n'; +static int nul_term_line; static int checkout_stage; /* default to checkout stage0 */ static int to_tempfile; static char topath[4][TEMPORARY_FILENAME_LENGTH + 1]; @@ -35,7 +35,8 @@ static void write_tempfile_record(const char *name, const char *prefix) fputs(topath[checkout_stage], stdout); putchar('\t'); - write_name_quoted_relative(name, prefix, stdout, line_termination); + write_name_quoted_relative(name, prefix, stdout, + nul_term_line ? '\0' : '\n'); for (i = 0; i < 4; i++) { topath[i][0] = 0; @@ -129,36 +130,6 @@ static const char * const builtin_checkout_index_usage[] = { static struct lock_file lock_file; -static int option_parse_u(const struct option *opt, - const char *arg, int unset) -{ - int *newfd = opt->value; - - state.refresh_cache = 1; - state.istate = &the_index; - if (*newfd < 0) - *newfd = hold_locked_index(&lock_file, 1); - return 0; -} - -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - if (unset) - line_termination = '\n'; - else - line_termination = 0; - return 0; -} - -static int option_parse_prefix(const struct option *opt, - const char *arg, int unset) -{ - state.base_dir = arg; - state.base_dir_len = strlen(arg); - return 0; -} - static int option_parse_stage(const struct option *opt, const char *arg, int unset) { @@ -170,7 +141,7 @@ static int option_parse_stage(const struct option *opt, if ('1' <= ch && ch <= '3') checkout_stage = arg[0] - '0'; else - die("stage should be between 1 and 3 or all"); + die(_("stage should be between 1 and 3 or all")); } return 0; } @@ -183,6 +154,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) int read_from_stdin = 0; int prefix_length; int force = 0, quiet = 0, not_new = 0; + int index_opt = 0; struct option builtin_checkout_index_options[] = { OPT_BOOL('a', "all", &all, N_("check out all files in the index")), @@ -191,22 +163,19 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) N_("no warning for existing files and files not in index")), OPT_BOOL('n', "no-create", ¬_new, N_("don't checkout new files")), - { OPTION_CALLBACK, 'u', "index", &newfd, NULL, - N_("update stat information in the index file"), - PARSE_OPT_NOARG, option_parse_u }, - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + OPT_BOOL('u', "index", &index_opt, + N_("update stat information in the index file")), + OPT_BOOL('z', NULL, &nul_term_line, + N_("paths are separated with NUL character")), OPT_BOOL(0, "stdin", &read_from_stdin, N_("read list of paths from the standard input")), OPT_BOOL(0, "temp", &to_tempfile, N_("write the content to temporary files")), - OPT_CALLBACK(0, "prefix", NULL, N_("string"), - N_("when creating files, prepend "), - option_parse_prefix), - OPT_CALLBACK(0, "stage", NULL, NULL, + OPT_STRING(0, "prefix", &state.base_dir, N_("string"), + N_("when creating files, prepend ")), + { OPTION_CALLBACK, 0, "stage", NULL, "1-3|all", N_("copy out the files from named stage"), - option_parse_stage), + PARSE_OPT_NONEG, option_parse_stage }, OPT_END() }; @@ -214,7 +183,6 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) usage_with_options(builtin_checkout_index_usage, builtin_checkout_index_options); git_config(git_default_config, NULL); - state.base_dir = ""; prefix_length = prefix ? strlen(prefix) : 0; if (read_cache() < 0) { @@ -227,15 +195,17 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) state.quiet = quiet; state.not_new = not_new; - if (state.base_dir_len || to_tempfile) { - /* when --prefix is specified we do not - * want to update cache. - */ - if (state.refresh_cache) { - rollback_lock_file(&lock_file); - newfd = -1; - } - state.refresh_cache = 0; + if (!state.base_dir) + state.base_dir = ""; + state.base_dir_len = strlen(state.base_dir); + + /* + * when --prefix is specified we do not want to update cache. + */ + if (index_opt && !state.base_dir_len && !to_tempfile) { + state.refresh_cache = 1; + state.istate = &the_index; + newfd = hold_locked_index(&lock_file, 1); } /* Check out named files first */ @@ -253,24 +223,27 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) } if (read_from_stdin) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; + strbuf_getline_fn getline_fn; if (all) die("git checkout-index: don't mix '--all' and '--stdin'"); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { char *p; - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } p = prefix_path(prefix, prefix_length, buf.buf); checkout_file(p, prefix); free(p); } - strbuf_release(&nbuf); + strbuf_release(&unquoted); strbuf_release(&buf); } diff --git a/builtin/checkout.c b/builtin/checkout.c index e8110a9243..5af84a3118 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -661,7 +661,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts, describe_detached_head(_("HEAD is now at"), new->commit); } } else if (new->path) { /* Switch branches. */ - create_symref("HEAD", new->path, msg.buf); + if (create_symref("HEAD", new->path, msg.buf) < 0) + die("unable to update HEAD"); if (!opts->quiet) { if (old->path && !strcmp(new->path, old->path)) { if (opts->new_branch_force) diff --git a/builtin/clean.c b/builtin/clean.c index d7acb94a95..7b08237480 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -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, "ed); printf(dry_run ? _(msg_would_skip_git_dir) : _(msg_skip_git_dir), @@ -594,7 +570,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) clean_get_color(CLEAN_COLOR_RESET)); } - if (strbuf_getline(&choice, stdin, '\n') != EOF) { + if (strbuf_getline_lf(&choice, stdin) != EOF) { strbuf_trim(&choice); } else { eof = 1; @@ -676,7 +652,7 @@ static int filter_by_patterns_cmd(void) clean_print_color(CLEAN_COLOR_PROMPT); printf(_("Input ignore patterns>> ")); clean_print_color(CLEAN_COLOR_RESET); - if (strbuf_getline(&confirm, stdin, '\n') != EOF) + if (strbuf_getline_lf(&confirm, stdin) != EOF) strbuf_trim(&confirm); else putchar('\n'); @@ -774,7 +750,7 @@ static int ask_each_cmd(void) qname = quote_path_relative(item->string, NULL, &buf); /* TRANSLATORS: Make sure to keep [y/N] as is */ printf(_("Remove %s [y/N]? "), qname); - if (strbuf_getline(&confirm, stdin, '\n') != EOF) { + if (strbuf_getline_lf(&confirm, stdin) != EOF) { strbuf_trim(&confirm); } else { putchar('\n'); diff --git a/builtin/clone.c b/builtin/clone.c index a0b3cd9e56..bcba0805e1 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -339,7 +339,7 @@ static void copy_alternates(struct strbuf *src, struct strbuf *dst, FILE *in = fopen(src->buf, "r"); struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, in, '\n') != EOF) { + while (strbuf_getline(&line, in) != EOF) { char *abs_path; if (!line.len || line.buf[0] == '#') continue; @@ -636,9 +636,11 @@ static void update_remote_refs(const struct ref *refs, struct strbuf head_ref = STRBUF_INIT; strbuf_addstr(&head_ref, branch_top); strbuf_addstr(&head_ref, "HEAD"); - create_symref(head_ref.buf, - remote_head_points_at->peer_ref->name, - msg); + if (create_symref(head_ref.buf, + remote_head_points_at->peer_ref->name, + msg) < 0) + die("unable to update %s", head_ref.buf); + strbuf_release(&head_ref); } } @@ -648,7 +650,8 @@ static void update_head(const struct ref *our, const struct ref *remote, const char *head; if (our && skip_prefix(our->name, "refs/heads/", &head)) { /* Local default branch link */ - create_symref("HEAD", our->name, NULL); + if (create_symref("HEAD", our->name, NULL) < 0) + die("unable to update HEAD"); if (!option_bare) { update_ref(msg, "HEAD", our->old_oid.hash, NULL, 0, UPDATE_REFS_DIE_ON_ERR); diff --git a/builtin/column.c b/builtin/column.c index 449413c8a8..33314b4d71 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -51,7 +51,7 @@ int cmd_column(int argc, const char **argv, const char *prefix) die(_("--command must be the first argument")); } finalize_colopts(&colopts, -1); - while (!strbuf_getline(&sb, stdin, '\n')) + while (!strbuf_getline(&sb, stdin)) string_list_append(&list, sb.buf); print_columns(&list, colopts, &copts); diff --git a/builtin/commit.c b/builtin/commit.c index d054f84960..b3bd2d4181 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -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)); @@ -1690,7 +1690,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (fp == NULL) die_errno(_("could not open '%s' for reading"), git_path_merge_head()); - while (strbuf_getline(&m, fp, '\n') != EOF) { + while (strbuf_getline_lf(&m, fp) != EOF) { struct commit *parent; parent = get_merge_parent(m.buf); diff --git a/builtin/diff.c b/builtin/diff.c index ed0acca91f..52c98a9217 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -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; diff --git a/builtin/fast-export.c b/builtin/fast-export.c index d9ac5d8410..2471297f71 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -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); diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index cf3019e05b..9b2a514e1d 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -158,7 +158,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) else { /* read from stdin one ref per line, until EOF */ struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) + while (strbuf_getline_lf(&line, stdin) != EOF) add_sought_entry(&sought, &nr_sought, &alloc_sought, line.buf); strbuf_release(&line); } diff --git a/builtin/fetch.c b/builtin/fetch.c index c85f3471d4..8e742135f0 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -37,6 +37,7 @@ static int prune = -1; /* unspecified */ static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity; static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT; static int tags = TAGS_DEFAULT, unshallow, update_shallow; +static int max_children = 1; static const char *depth; static const char *upload_pack; static struct strbuf default_rla = STRBUF_INIT; @@ -99,6 +100,8 @@ static struct option builtin_fetch_options[] = { N_("fetch all tags and associated objects"), TAGS_SET), OPT_SET_INT('n', NULL, &tags, N_("do not fetch all tags (--no-tags)"), TAGS_UNSET), + OPT_INTEGER('j', "jobs", &max_children, + N_("number of submodules fetched in parallel")), OPT_BOOL('p', "prune", &prune, N_("prune remote-tracking branches no longer on remote")), { OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"), @@ -837,7 +840,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)); @@ -1213,7 +1216,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) result = fetch_populated_submodules(&options, submodule_prefix, recurse_submodules, - verbosity < 0); + verbosity < 0, + max_children); argv_array_clear(&options); } @@ -1221,6 +1225,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"); diff --git a/builtin/grep.c b/builtin/grep.c index 4229cae390..8c516a9543 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -24,11 +24,11 @@ static char const * const grep_usage[] = { NULL }; -static int use_threads = 1; +#define GREP_NUM_THREADS_DEFAULT 8 +static int num_threads; #ifndef NO_PTHREADS -#define THREADS 8 -static pthread_t threads[THREADS]; +static pthread_t *threads; /* We use one producer thread and THREADS consumer * threads. The producer adds struct work_items to 'todo' and the @@ -63,13 +63,13 @@ static pthread_mutex_t grep_mutex; static inline void grep_lock(void) { - if (use_threads) + if (num_threads) pthread_mutex_lock(&grep_mutex); } static inline void grep_unlock(void) { - if (use_threads) + if (num_threads) pthread_mutex_unlock(&grep_mutex); } @@ -206,7 +206,8 @@ static void start_threads(struct grep_opt *opt) strbuf_init(&todo[i].out, 0); } - for (i = 0; i < ARRAY_SIZE(threads); i++) { + threads = xcalloc(num_threads, sizeof(*threads)); + for (i = 0; i < num_threads; i++) { int err; struct grep_opt *o = grep_opt_dup(opt); o->output = strbuf_out; @@ -238,12 +239,14 @@ static int wait_all(void) pthread_cond_broadcast(&cond_add); grep_unlock(); - for (i = 0; i < ARRAY_SIZE(threads); i++) { + for (i = 0; i < num_threads; i++) { void *h; pthread_join(threads[i], &h); hit |= (int) (intptr_t) h; } + free(threads); + pthread_mutex_destroy(&grep_mutex); pthread_mutex_destroy(&grep_read_mutex); pthread_mutex_destroy(&grep_attr_mutex); @@ -267,6 +270,14 @@ static int grep_cmd_config(const char *var, const char *value, void *cb) int st = grep_config(var, value, cb); if (git_color_default_config(var, value, cb) < 0) st = -1; + + if (!strcmp(var, "grep.threads")) { + num_threads = git_config_int(var, value); + if (num_threads < 0) + die(_("invalid number of threads specified (%d) for %s"), + num_threads, var); + } + return st; } @@ -294,7 +305,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, } #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); return 0; @@ -323,7 +334,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) strbuf_addstr(&buf, filename); #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { add_work(opt, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); return 0; @@ -375,7 +386,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; @@ -562,7 +573,7 @@ static int file_callback(const struct option *opt, const char *arg, int unset) patterns = from_stdin ? stdin : fopen(arg, "r"); if (!patterns) die_errno(_("cannot open '%s'"), arg); - while (strbuf_getline(&sb, patterns, '\n') == 0) { + while (strbuf_getline(&sb, patterns) == 0) { /* ignore empty line like grep does */ if (sb.len == 0) continue; @@ -697,6 +708,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) N_("show context lines before matches")), OPT_INTEGER('A', "after-context", &opt.post_context, N_("show context lines after matches")), + OPT_INTEGER(0, "threads", &num_threads, + N_("use worker threads")), OPT_NUMBER_CALLBACK(&opt, N_("shortcut for -C NUM"), context_callback), OPT_BOOL('p', "show-function", &opt.funcname, @@ -755,9 +768,15 @@ int cmd_grep(int argc, const char **argv, const char *prefix) PARSE_OPT_STOP_AT_NON_OPTION); grep_commit_pattern_type(pattern_type_arg, &opt); - if (use_index && !startup_info->have_repository) - /* die the same way as if we did it at the beginning */ - setup_git_directory(); + if (use_index && !startup_info->have_repository) { + int fallback = 0; + git_config_get_bool("grep.fallbacktonoindex", &fallback); + if (fallback) + use_index = 0; + else + /* die the same way as if we did it at the beginning */ + setup_git_directory(); + } /* * skip a -- separator; we know it cannot be @@ -786,7 +805,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix) opt.output_priv = &path_list; opt.output = append_path; string_list_append(&path_list, show_in_pager); - use_threads = 0; } if (!opt.pattern_list) @@ -817,14 +835,18 @@ int cmd_grep(int argc, const char **argv, const char *prefix) } #ifndef NO_PTHREADS - if (list.nr || cached || online_cpus() == 1) - use_threads = 0; + if (list.nr || cached || show_in_pager) + num_threads = 0; + else if (num_threads == 0) + num_threads = GREP_NUM_THREADS_DEFAULT; + else if (num_threads < 0) + die(_("invalid number of threads specified (%d)"), num_threads); #else - use_threads = 0; + num_threads = 0; #endif #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { if (!(opt.name_only || opt.unmatch_name_only || opt.count) && (opt.pre_context || opt.post_context || opt.file_break || opt.funcbody)) @@ -894,7 +916,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) hit = grep_objects(&opt, &pathspec, &list); } - if (use_threads) + if (num_threads) hit |= wait_all(); if (hit && show_in_pager) run_pager(&opt, prefix); diff --git a/builtin/hash-object.c b/builtin/hash-object.c index 43b098b76c..f7d3567dd0 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -58,20 +58,21 @@ static void hash_object(const char *path, const char *type, const char *vpath, static void hash_stdin_paths(const char *type, int no_filters, unsigned flags, int literally) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline(&buf, stdin) != EOF) { if (buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } hash_object(buf.buf, type, no_filters ? NULL : buf.buf, flags, literally); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); } int cmd_hash_object(int argc, const char **argv, const char *prefix) diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c index 46838d24a9..b99ae4be88 100644 --- a/builtin/interpret-trailers.c +++ b/builtin/interpret-trailers.c @@ -12,16 +12,18 @@ #include "trailer.h" static const char * const git_interpret_trailers_usage[] = { - N_("git interpret-trailers [--trim-empty] [(--trailer [(=|:)])...] [...]"), + N_("git interpret-trailers [--in-place] [--trim-empty] [(--trailer [(=|:)])...] [...]"), NULL }; int cmd_interpret_trailers(int argc, const char **argv, const char *prefix) { + int in_place = 0; int trim_empty = 0; struct string_list trailers = STRING_LIST_INIT_DUP; struct option options[] = { + OPT_BOOL(0, "in-place", &in_place, N_("edit files in place")), OPT_BOOL(0, "trim-empty", &trim_empty, N_("trim empty trailers")), OPT_STRING_LIST(0, "trailer", &trailers, N_("trailer"), N_("trailer(s) to add")), @@ -34,9 +36,12 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix) if (argc) { int i; for (i = 0; i < argc; i++) - process_trailers(argv[i], trim_empty, &trailers); - } else - process_trailers(NULL, trim_empty, &trailers); + process_trailers(argv[i], in_place, trim_empty, &trailers); + } else { + if (in_place) + die(_("no input file given for in-place editing")); + process_trailers(NULL, in_place, trim_empty, &trailers); + } string_list_clear(&trailers, 0); diff --git a/builtin/log.c b/builtin/log.c index e00cea75cc..0d738d6ddc 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -699,6 +699,7 @@ static int do_signoff; static const char *signature = git_version_string; static const char *signature_file; static int config_cover_letter; +static const char *config_output_directory; enum { COVER_UNSET, @@ -777,6 +778,8 @@ static int git_format_config(const char *var, const char *value, void *cb) config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF; return 0; } + if (!strcmp(var, "format.outputdirectory")) + return git_config_string(&config_output_directory, var, value); return git_log_config(var, value, cb); } @@ -1391,6 +1394,9 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (rev.show_notes) init_display_notes(&rev.notes_opt); + if (!output_directory && !use_stdout) + output_directory = config_output_directory; + if (!use_stdout) output_directory = set_outdir(prefix, output_directory); else diff --git a/builtin/ls-files.c b/builtin/ls-files.c index b6a7cb0c7c..f02e3d23bb 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -27,6 +27,7 @@ static int show_killed; static int show_valid_bit; static int line_terminator = '\n'; static int debug_mode; +static int show_eol; static const char *prefix; static int max_prefix_len; @@ -47,6 +48,23 @@ static const char *tag_modified = ""; static const char *tag_skip_worktree = ""; static const char *tag_resolve_undo = ""; +static void write_eolinfo(const struct cache_entry *ce, const char *path) +{ + if (!show_eol) + return; + else { + struct stat st; + const char *i_txt = ""; + const char *w_txt = ""; + const char *a_txt = get_convert_attr_ascii(path); + if (ce && S_ISREG(ce->ce_mode)) + i_txt = get_cached_convert_stats_ascii(ce->name); + if (!lstat(path, &st) && S_ISREG(st.st_mode)) + w_txt = get_wt_convert_stats_ascii(path); + printf("i/%-5s w/%-5s attr/%-17s\t", i_txt, w_txt, a_txt); + } +} + static void write_name(const char *name) { /* @@ -68,6 +86,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent) return; fputs(tag, stdout); + write_eolinfo(NULL, ent->name); write_name(ent->name); } @@ -170,6 +189,7 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce) find_unique_abbrev(ce->sha1,abbrev), ce_stage(ce)); } + write_eolinfo(ce, ce->name); write_name(ce->name); if (debug_mode) { const struct stat_data *sd = &ce->ce_stat_data; @@ -359,14 +379,6 @@ static const char * const ls_files_usage[] = { NULL }; -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - line_terminator = unset ? '\n' : '\0'; - - return 0; -} - static int option_parse_exclude(const struct option *opt, const char *arg, int unset) { @@ -408,9 +420,9 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) struct exclude_list *el; struct string_list exclude_list = STRING_LIST_INIT_NODUP; struct option builtin_ls_files_options[] = { - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + /* Think twice before adding "--nul" synonym to this */ + OPT_SET_INT('z', NULL, &line_terminator, + N_("paths are separated with NUL character"), '\0'), OPT_BOOL('t', NULL, &show_tag, N_("identify the file status with tags")), OPT_BOOL('v', NULL, &show_valid_bit, @@ -433,6 +445,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) OPT_BIT(0, "directory", &dir.flags, N_("show 'other' directories' names only"), DIR_SHOW_OTHER_DIRECTORIES), + OPT_BOOL(0, "eol", &show_eol, N_("show line endings of files")), OPT_NEGBIT(0, "empty-directory", &dir.flags, N_("don't show empty directories"), DIR_HIDE_EMPTY_DIRECTORIES), diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index fa65a8448a..66cdd45cc1 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -3,9 +3,12 @@ #include "transport.h" #include "remote.h" -static const char ls_remote_usage[] = -"git ls-remote [--heads] [--tags] [--upload-pack=]\n" -" [-q | --quiet] [--exit-code] [--get-url] [ [...]]"; +static const char * const ls_remote_usage[] = { + N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=]\n" + " [-q | --quiet] [--exit-code] [--get-url]\n" + " [--symref] [ [...]]"), + NULL +}; /* * Is there one among the list of patterns that match the tail part @@ -30,12 +33,12 @@ static int tail_match(const char **pattern, const char *path) int cmd_ls_remote(int argc, const char **argv, const char *prefix) { - int i; const char *dest = NULL; unsigned flags = 0; int get_url = 0; int quiet = 0; int status = 0; + int show_symref_target = 0; const char *uploadpack = NULL; const char **pattern = NULL; @@ -43,59 +46,36 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) struct transport *transport; const struct ref *ref; - if (argc == 2 && !strcmp("-h", argv[1])) - usage(ls_remote_usage); + struct option options[] = { + OPT__QUIET(&quiet, N_("do not print remote URL")), + OPT_STRING(0, "upload-pack", &uploadpack, N_("exec"), + N_("path of git-upload-pack on the remote host")), + { OPTION_STRING, 0, "exec", &uploadpack, N_("exec"), + N_("path of git-upload-pack on the remote host"), + PARSE_OPT_HIDDEN }, + OPT_BIT('t', "tags", &flags, N_("limit to tags"), REF_TAGS), + OPT_BIT('h', "heads", &flags, N_("limit to heads"), REF_HEADS), + OPT_BIT(0, "refs", &flags, N_("do not show peeled tags"), REF_NORMAL), + OPT_BOOL(0, "get-url", &get_url, + N_("take url..insteadOf into account")), + OPT_SET_INT(0, "exit-code", &status, + N_("exit with exit code 2 if no matching refs are found"), 2), + OPT_BOOL(0, "symref", &show_symref_target, + N_("show underlying ref in addition to the object pointed by it")), + OPT_END() + }; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; + argc = parse_options(argc, argv, prefix, options, ls_remote_usage, + PARSE_OPT_STOP_AT_NON_OPTION); + dest = argv[0]; - if (*arg == '-') { - if (starts_with(arg, "--upload-pack=")) { - uploadpack = arg + 14; - continue; - } - if (starts_with(arg, "--exec=")) { - uploadpack = arg + 7; - continue; - } - if (!strcmp("--tags", arg) || !strcmp("-t", arg)) { - flags |= REF_TAGS; - continue; - } - if (!strcmp("--heads", arg) || !strcmp("-h", arg)) { - flags |= REF_HEADS; - continue; - } - if (!strcmp("--refs", arg)) { - flags |= REF_NORMAL; - continue; - } - if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) { - quiet = 1; - continue; - } - if (!strcmp("--get-url", arg)) { - get_url = 1; - continue; - } - if (!strcmp("--exit-code", arg)) { - /* return this code if no refs are reported */ - status = 2; - continue; - } - usage(ls_remote_usage); - } - dest = arg; - i++; - break; + if (argc > 1) { + int i; + pattern = xcalloc(argc, sizeof(const char *)); + for (i = 1; i < argc; i++) + pattern[i - 1] = xstrfmt("*/%s", argv[i]); } - if (argv[i]) { - int j; - pattern = xcalloc(argc - i + 1, sizeof(const char *)); - for (j = i; j < argc; j++) - pattern[j - i] = xstrfmt("*/%s", argv[j]); - } remote = remote_get(dest); if (!remote) { if (dest) @@ -125,7 +105,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) continue; if (!tail_match(pattern, ref->name)) continue; - printf("%s %s\n", oid_to_hex(&ref->old_oid), ref->name); + if (show_symref_target && ref->symref) + printf("ref: %s\t%s\n", ref->symref, ref->name); + printf("%s\t%s\n", oid_to_hex(&ref->old_oid), ref->name); status = 0; /* we found something */ } return status; diff --git a/builtin/merge.c b/builtin/merge.c index 15bf95b3ac..b98a3489bf 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -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); } } diff --git a/builtin/mktree.c b/builtin/mktree.c index a964d6be52..a237caacfd 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -65,7 +65,7 @@ static const char *mktree_usage[] = { NULL }; -static void mktree_line(char *buf, size_t len, int line_termination, int allow_missing) +static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_missing) { char *ptr, *ntr; unsigned mode; @@ -97,7 +97,7 @@ static void mktree_line(char *buf, size_t len, int line_termination, int allow_m *ntr++ = 0; /* now at the beginning of SHA1 */ path = ntr + 41; /* at the beginning of name */ - if (line_termination && path[0] == '"') { + if (!nul_term_line && path[0] == '"') { struct strbuf p_uq = STRBUF_INIT; if (unquote_c_style(&p_uq, path, NULL)) die("invalid quoting"); @@ -141,23 +141,25 @@ int cmd_mktree(int ac, const char **av, const char *prefix) { struct strbuf sb = STRBUF_INIT; unsigned char sha1[20]; - int line_termination = '\n'; + int nul_term_line = 0; int allow_missing = 0; int is_batch_mode = 0; int got_eof = 0; + strbuf_getline_fn getline_fn; const struct option option[] = { - OPT_SET_INT('z', NULL, &line_termination, N_("input is NUL terminated"), '\0'), + OPT_BOOL('z', NULL, &nul_term_line, N_("input is NUL terminated")), OPT_SET_INT( 0 , "missing", &allow_missing, N_("allow missing objects"), 1), OPT_SET_INT( 0 , "batch", &is_batch_mode, N_("allow creation of more than one tree"), 1), OPT_END() }; ac = parse_options(ac, av, prefix, option, mktree_usage, 0); + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; while (!got_eof) { while (1) { - if (strbuf_getline(&sb, stdin, line_termination) == EOF) { + if (getline_fn(&sb, stdin) == EOF) { got_eof = 1; break; } @@ -167,7 +169,7 @@ int cmd_mktree(int ac, const char **av, const char *prefix) break; die("input format error: (blank line only valid in batch mode)"); } - mktree_line(sb.buf, sb.len, line_termination, allow_missing); + mktree_line(sb.buf, sb.len, nul_term_line, allow_missing); } if (is_batch_mode && got_eof && used < 1) { /* diff --git a/builtin/notes.c b/builtin/notes.c index 52aa9af74b..ed6f2222f4 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -286,11 +286,11 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd) if (!c) return 0; } else { - init_notes(NULL, NULL, NULL, 0); + init_notes(NULL, NULL, NULL, NOTES_INIT_WRITABLE); t = &default_notes_tree; } - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline_lf(&buf, stdin) != EOF) { unsigned char from_obj[20], to_obj[20]; struct strbuf **split; int err; @@ -329,15 +329,18 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd) return ret; } -static struct notes_tree *init_notes_check(const char *subcommand) +static struct notes_tree *init_notes_check(const char *subcommand, + int flags) { struct notes_tree *t; - init_notes(NULL, NULL, NULL, 0); + const char *ref; + init_notes(NULL, NULL, NULL, flags); t = &default_notes_tree; - if (!starts_with(t->ref, "refs/notes/")) + ref = (flags & NOTES_INIT_WRITABLE) ? t->update_ref : t->ref; + if (!starts_with(ref, "refs/notes/")) die("Refusing to %s notes in %s (outside of refs/notes/)", - subcommand, t->ref); + subcommand, ref); return t; } @@ -360,7 +363,7 @@ static int list(int argc, const char **argv, const char *prefix) usage_with_options(git_notes_list_usage, options); } - t = init_notes_check("list"); + t = init_notes_check("list", 0); if (argc) { if (get_sha1(argv[0], object)) die(_("Failed to resolve '%s' as a valid ref."), argv[0]); @@ -420,7 +423,7 @@ static int add(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("add"); + t = init_notes_check("add", NOTES_INIT_WRITABLE); note = get_note(t, object); if (note) { @@ -511,7 +514,7 @@ static int copy(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("copy"); + t = init_notes_check("copy", NOTES_INIT_WRITABLE); note = get_note(t, object); if (note) { @@ -589,7 +592,7 @@ static int append_edit(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check(argv[0]); + t = init_notes_check(argv[0], NOTES_INIT_WRITABLE); note = get_note(t, object); prepare_note_data(object, &d, edit ? note : NULL); @@ -652,7 +655,7 @@ static int show(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("show"); + t = init_notes_check("show", 0); note = get_note(t, object); if (!note) @@ -806,10 +809,10 @@ static int merge(int argc, const char **argv, const char *prefix) o.local_ref = default_notes_ref(); strbuf_addstr(&remote_ref, argv[0]); - expand_notes_ref(&remote_ref); + expand_loose_notes_ref(&remote_ref); o.remote_ref = remote_ref.buf; - t = init_notes_check("merge"); + t = init_notes_check("merge", NOTES_INIT_WRITABLE); if (strategy) { if (parse_notes_merge_strategy(strategy, &o.strategy)) { @@ -901,7 +904,7 @@ static int remove_cmd(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, git_notes_remove_usage, 0); - t = init_notes_check("remove"); + t = init_notes_check("remove", NOTES_INIT_WRITABLE); if (!argc && !from_stdin) { retval = remove_one_note(t, "HEAD", flag); @@ -943,7 +946,7 @@ static int prune(int argc, const char **argv, const char *prefix) usage_with_options(git_notes_prune_usage, options); } - t = init_notes_check("prune"); + t = init_notes_check("prune", NOTES_INIT_WRITABLE); prune_notes(t, (verbose ? NOTES_PRUNE_VERBOSE : 0) | (show_only ? NOTES_PRUNE_VERBOSE|NOTES_PRUNE_DRYRUN : 0) ); diff --git a/builtin/pull.c b/builtin/pull.c index 5145fc60a0..10eff03967 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -22,7 +22,8 @@ enum rebase_type { REBASE_INVALID = -1, REBASE_FALSE = 0, REBASE_TRUE, - REBASE_PRESERVE + REBASE_PRESERVE, + REBASE_INTERACTIVE }; /** @@ -42,6 +43,8 @@ static enum rebase_type parse_config_rebase(const char *key, const char *value, return REBASE_TRUE; else if (!strcmp(value, "preserve")) return REBASE_PRESERVE; + else if (!strcmp(value, "interactive")) + return REBASE_INTERACTIVE; if (fatal) die(_("Invalid value for %s: %s"), key, value); @@ -95,6 +98,7 @@ static int opt_force; static char *opt_tags; static char *opt_prune; static char *opt_recurse_submodules; +static char *max_children; static int opt_dry_run; static char *opt_keep; static char *opt_depth; @@ -112,7 +116,7 @@ static struct option pull_options[] = { /* Options passed to git-merge or git-rebase */ OPT_GROUP(N_("Options related to merging")), { OPTION_CALLBACK, 'r', "rebase", &opt_rebase, - "false|true|preserve", + "false|true|preserve|interactive", N_("incorporate changes by rebasing rather than merging"), PARSE_OPT_OPTARG, parse_opt_rebase }, OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL, @@ -178,6 +182,9 @@ static struct option pull_options[] = { N_("on-demand"), N_("control recursive fetching of submodules"), PARSE_OPT_OPTARG), + OPT_PASSTHRU('j', "jobs", &max_children, N_("n"), + N_("number of submodules pulled in parallel"), + PARSE_OPT_OPTARG), OPT_BOOL(0, "dry-run", &opt_dry_run, N_("dry run")), OPT_PASSTHRU('k', "keep", &opt_keep, NULL, @@ -378,7 +385,7 @@ static void get_merge_heads(struct sha1_array *merge_heads) if (!(fp = fopen(filename, "r"))) die_errno(_("could not open '%s' for reading"), filename); - while (strbuf_getline(&sb, fp, '\n') != EOF) { + while (strbuf_getline_lf(&sb, fp) != EOF) { if (get_sha1_hex(sb.buf, sha1)) continue; /* invalid line: does not start with SHA1 */ if (starts_with(sb.buf + GIT_SHA1_HEXSZ, "\tnot-for-merge\t")) @@ -525,6 +532,8 @@ static int run_fetch(const char *repo, const char **refspecs) argv_array_push(&args, opt_prune); if (opt_recurse_submodules) argv_array_push(&args, opt_recurse_submodules); + if (max_children) + argv_array_push(&args, max_children); if (opt_dry_run) argv_array_push(&args, "--dry-run"); if (opt_keep) @@ -772,6 +781,8 @@ static int run_rebase(const unsigned char *curr_head, /* Options passed to git-rebase */ if (opt_rebase == REBASE_PRESERVE) argv_array_push(&args, "--preserve-merges"); + else if (opt_rebase == REBASE_INTERACTIVE) + argv_array_push(&args, "--interactive"); if (opt_diffstat) argv_array_push(&args, opt_diffstat); argv_array_pushv(&args, opt_strategies.argv); diff --git a/builtin/push.c b/builtin/push.c index 8963dbdf3d..960ffc31e1 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -538,7 +538,7 @@ int cmd_push(int argc, const char **argv, const char *prefix) OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL), OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"), (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)), - OPT_BOOL( 0, "delete", &deleterefs, N_("delete refs")), + OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")), OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")), OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN), OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN), diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index ca38131873..f2d6761af6 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -1618,7 +1618,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]++; } @@ -1796,6 +1796,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) diff --git a/builtin/remote.c b/builtin/remote.c index 6694cf20ef..2b2ff9b7d2 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -251,7 +251,7 @@ static int add(int argc, const char **argv) struct branch_info { char *remote_name; struct string_list merge; - int rebase; + enum { NO_REBASE, NORMAL_REBASE, INTERACTIVE_REBASE } rebase; }; static struct string_list branch_list; @@ -311,7 +311,9 @@ static int config_read_branches(const char *key, const char *value, void *cb) if (v >= 0) info->rebase = v; else if (!strcmp(value, "preserve")) - info->rebase = 1; + info->rebase = NORMAL_REBASE; + else if (!strcmp(value, "interactive")) + info->rebase = INTERACTIVE_REBASE; } } return 0; @@ -980,7 +982,9 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data) printf(" %-*s ", show_info->width, item->string); if (branch_info->rebase) { - printf_ln(_("rebases onto remote %s"), merge->items[0].string); + printf_ln(_(branch_info->rebase == INTERACTIVE_REBASE ? + "rebases interactively onto remote %s" : + "rebases onto remote %s"), merge->items[0].string); return 0; } else if (show_info->any_rebase) { printf_ln(_(" merges with remote %s"), merge->items[0].string); diff --git a/builtin/repack.c b/builtin/repack.c index 945611006a..858db38f52 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -266,7 +266,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) return ret; out = xfdopen(cmd.out, "r"); - while (strbuf_getline(&line, out, '\n') != EOF) { + while (strbuf_getline_lf(&line, out) != EOF) { if (line.len != 40) die("repack: Expecting 40 character sha1 lines only from pack-objects."); string_list_append(&names, line.buf); diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 7e074aad40..bd16876df5 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -383,7 +383,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) /* get the usage up to the first line with a -- on it */ for (;;) { - if (strbuf_getline(&sb, stdin, '\n') == EOF) + if (strbuf_getline(&sb, stdin) == EOF) die("premature end of input"); ALLOC_GROW(usage, unb + 1, usz); if (!strcmp("--", sb.buf)) { @@ -396,7 +396,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) } /* parse: (|,|)[*=?!]*? SP+ */ - while (strbuf_getline(&sb, stdin, '\n') != EOF) { + while (strbuf_getline(&sb, stdin) != EOF) { const char *s; const char *help; struct option *o; diff --git a/builtin/rm.c b/builtin/rm.c index 80b972f92f..8829b09d0b 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -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) { diff --git a/builtin/send-pack.c b/builtin/send-pack.c index f6e5d643c1..5b9dd6a9d8 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -212,7 +212,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) argv_array_push(&all_refspecs, buf); } else { struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) + while (strbuf_getline(&line, stdin) != EOF) argv_array_push(&all_refspecs, line.buf); strbuf_release(&line); } diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 35ebd17f80..bfc082e584 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -14,7 +14,26 @@ static char const * const shortlog_usage[] = { NULL }; -static int compare_by_number(const void *a1, const void *a2) +/* + * The util field of our string_list_items will contain one of two things: + * + * - if --summary is not in use, it will point to a string list of the + * oneline subjects assigned to this author + * + * - if --summary is in use, we don't need that list; we only need to know + * its size. So we abuse the pointer slot to store our integer counter. + * + * This macro accesses the latter. + */ +#define UTIL_TO_INT(x) ((intptr_t)(x)->util) + +static int compare_by_counter(const void *a1, const void *a2) +{ + const struct string_list_item *i1 = a1, *i2 = a2; + return UTIL_TO_INT(i2) - UTIL_TO_INT(i1); +} + +static int compare_by_list(const void *a1, const void *a2) { const struct string_list_item *i1 = a1, *i2 = a2; const struct string_list *l1 = i1->util, *l2 = i2->util; @@ -31,13 +50,9 @@ static void insert_one_record(struct shortlog *log, const char *author, const char *oneline) { - const char *dot3 = log->common_repo_prefix; - char *buffer, *p; struct string_list_item *item; const char *mailbuf, *namebuf; size_t namelen, maillen; - const char *eol; - struct strbuf subject = STRBUF_INIT; struct strbuf namemailbuf = STRBUF_INIT; struct ident_split ident; @@ -56,98 +71,95 @@ static void insert_one_record(struct shortlog *log, strbuf_addf(&namemailbuf, " <%.*s>", (int)maillen, mailbuf); item = string_list_insert(&log->list, namemailbuf.buf); - if (item->util == NULL) - item->util = xcalloc(1, sizeof(struct string_list)); - - /* Skip any leading whitespace, including any blank lines. */ - while (*oneline && isspace(*oneline)) - oneline++; - eol = strchr(oneline, '\n'); - if (!eol) - eol = oneline + strlen(oneline); - if (starts_with(oneline, "[PATCH")) { - char *eob = strchr(oneline, ']'); - if (eob && (!eol || eob < eol)) - oneline = eob + 1; - } - while (*oneline && isspace(*oneline) && *oneline != '\n') - oneline++; - format_subject(&subject, oneline, " "); - buffer = strbuf_detach(&subject, NULL); - - if (dot3) { - int dot3len = strlen(dot3); - if (dot3len > 5) { - while ((p = strstr(buffer, dot3)) != NULL) { - int taillen = strlen(p) - dot3len; - memcpy(p, "/.../", 5); - memmove(p + 5, p + dot3len, taillen + 1); + + if (log->summary) + item->util = (void *)(UTIL_TO_INT(item) + 1); + else { + const char *dot3 = log->common_repo_prefix; + char *buffer, *p; + struct strbuf subject = STRBUF_INIT; + const char *eol; + + /* Skip any leading whitespace, including any blank lines. */ + while (*oneline && isspace(*oneline)) + oneline++; + eol = strchr(oneline, '\n'); + if (!eol) + eol = oneline + strlen(oneline); + if (starts_with(oneline, "[PATCH")) { + char *eob = strchr(oneline, ']'); + if (eob && (!eol || eob < eol)) + oneline = eob + 1; + } + while (*oneline && isspace(*oneline) && *oneline != '\n') + oneline++; + format_subject(&subject, oneline, " "); + buffer = strbuf_detach(&subject, NULL); + + if (dot3) { + int dot3len = strlen(dot3); + if (dot3len > 5) { + while ((p = strstr(buffer, dot3)) != NULL) { + int taillen = strlen(p) - dot3len; + memcpy(p, "/.../", 5); + memmove(p + 5, p + dot3len, taillen + 1); + } } } - } - string_list_append(item->util, buffer); + if (item->util == NULL) + item->util = xcalloc(1, sizeof(struct string_list)); + string_list_append(item->util, buffer); + } } static void read_from_stdin(struct shortlog *log) { - char author[1024], oneline[1024]; + struct strbuf author = STRBUF_INIT; + struct strbuf oneline = STRBUF_INIT; - while (fgets(author, sizeof(author), stdin) != NULL) { - if (!(author[0] == 'A' || author[0] == 'a') || - !starts_with(author + 1, "uthor: ")) + while (strbuf_getline_lf(&author, stdin) != EOF) { + const char *v; + if (!skip_prefix(author.buf, "Author: ", &v) && + !skip_prefix(author.buf, "author ", &v)) continue; - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] != '\n') + while (strbuf_getline_lf(&oneline, stdin) != EOF && + oneline.len) ; /* discard headers */ - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] == '\n') + while (strbuf_getline_lf(&oneline, stdin) != EOF && + !oneline.len) ; /* discard blanks */ - insert_one_record(log, author + 8, oneline); + insert_one_record(log, v, oneline.buf); } + strbuf_release(&author); + strbuf_release(&oneline); } void shortlog_add_commit(struct shortlog *log, struct commit *commit) { - const char *author = NULL, *buffer; - struct strbuf buf = STRBUF_INIT; - struct strbuf ufbuf = STRBUF_INIT; - - pp_commit_easy(CMIT_FMT_RAW, commit, &buf); - buffer = buf.buf; - while (*buffer && *buffer != '\n') { - const char *eol = strchr(buffer, '\n'); - - if (eol == NULL) - eol = buffer + strlen(buffer); + struct strbuf author = STRBUF_INIT; + struct strbuf oneline = STRBUF_INIT; + struct pretty_print_context ctx = {0}; + + ctx.fmt = CMIT_FMT_USERFORMAT; + ctx.abbrev = log->abbrev; + ctx.subject = ""; + ctx.after_subject = ""; + ctx.date_mode.type = DATE_NORMAL; + ctx.output_encoding = get_log_output_encoding(); + + format_commit_message(commit, "%an <%ae>", &author, &ctx); + if (!log->summary) { + if (log->user_format) + pretty_print_commit(&ctx, commit, &oneline); else - eol++; - - if (starts_with(buffer, "author ")) - author = buffer + 7; - buffer = eol; - } - if (!author) { - warning(_("Missing author: %s"), - oid_to_hex(&commit->object.oid)); - return; + format_commit_message(commit, "%s", &oneline, &ctx); } - if (log->user_format) { - struct pretty_print_context ctx = {0}; - ctx.fmt = CMIT_FMT_USERFORMAT; - ctx.abbrev = log->abbrev; - ctx.subject = ""; - ctx.after_subject = ""; - ctx.date_mode.type = DATE_NORMAL; - ctx.output_encoding = get_log_output_encoding(); - pretty_print_commit(&ctx, commit, &ufbuf); - buffer = ufbuf.buf; - } else if (*buffer) { - buffer++; - } - insert_one_record(log, author, !*buffer ? "" : buffer); - strbuf_release(&ufbuf); - strbuf_release(&buf); + + insert_one_record(log, author.buf, oneline.len ? oneline.buf : ""); + + strbuf_release(&author); + strbuf_release(&oneline); } static void get_from_rev(struct rev_info *rev, struct shortlog *log) @@ -294,14 +306,14 @@ void shortlog_output(struct shortlog *log) if (log->sort_by_number) qsort(log->list.items, log->list.nr, sizeof(struct string_list_item), - compare_by_number); + log->summary ? compare_by_counter : compare_by_list); for (i = 0; i < log->list.nr; i++) { - struct string_list *onelines = log->list.items[i].util; - + const struct string_list_item *item = &log->list.items[i]; if (log->summary) { - printf("%6d\t%s\n", onelines->nr, log->list.items[i].string); + printf("%6d\t%s\n", (int)UTIL_TO_INT(item), item->string); } else { - printf("%s (%d):\n", log->list.items[i].string, onelines->nr); + struct string_list *onelines = item->util; + printf("%s (%d):\n", item->string, onelines->nr); for (j = onelines->nr - 1; j >= 0; j--) { const char *msg = onelines->items[j].string; @@ -314,11 +326,11 @@ void shortlog_output(struct shortlog *log) printf(" %s\n", msg); } putchar('\n'); + onelines->strdup_strings = 1; + string_list_clear(onelines, 0); + free(onelines); } - onelines->strdup_strings = 1; - string_list_clear(onelines, 0); - free(onelines); log->list.items[i].util = NULL; } diff --git a/builtin/tag.c b/builtin/tag.c index 8db8c87e57..1705c94665 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -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); diff --git a/builtin/update-index.c b/builtin/update-index.c index 7431938fa6..1c94ca59bf 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -35,6 +35,15 @@ static int mark_skip_worktree_only; #define UNMARK_FLAG 2 static struct strbuf mtime_dir = STRBUF_INIT; +/* Untracked cache mode */ +enum uc_mode { + UC_UNSPECIFIED = -1, + UC_DISABLE = 0, + UC_ENABLE, + UC_TEST, + UC_FORCE +}; + __attribute__((format (printf, 1, 2))) static void report(const char *fmt, ...) { @@ -121,7 +130,7 @@ static int test_if_untracked_cache_is_supported(void) if (!mkdtemp(mtime_dir.buf)) die_errno("Could not make temporary directory"); - fprintf(stderr, _("Testing ")); + fprintf(stderr, _("Testing mtime in '%s' "), xgetcwd()); atexit(remove_test_directory); xstat_mtime_dir(&st); fill_stat_data(&base, &st); @@ -468,12 +477,14 @@ static void update_one(const char *path) report("add '%s'", path); } -static void read_index_info(int line_termination) +static void read_index_info(int nul_term_line) { struct strbuf buf = STRBUF_INIT; struct strbuf uq = STRBUF_INIT; + strbuf_getline_fn getline_fn; - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { char *ptr, *tab; char *path_name; unsigned char sha1[20]; @@ -522,7 +533,7 @@ static void read_index_info(int line_termination) goto bad_line; path_name = ptr; - if (line_termination && path_name[0] == '"') { + if (!nul_term_line && path_name[0] == '"') { strbuf_reset(&uq); if (unquote_c_style(&uq, path_name, NULL)) { die("git update-index: bad quoting of path name"); @@ -844,12 +855,12 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx, static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx, const struct option *opt, int unset) { - int *line_termination = opt->value; + int *nul_term_line = opt->value; if (ctx->argc != 1) return error("option '%s' must be the last argument", opt->long_name); allow_add = allow_replace = allow_remove = 1; - read_index_info(*line_termination); + read_index_info(*nul_term_line); return 0; } @@ -901,8 +912,8 @@ static int reupdate_callback(struct parse_opt_ctx_t *ctx, int cmd_update_index(int argc, const char **argv, const char *prefix) { - int newfd, entries, has_errors = 0, line_termination = '\n'; - int untracked_cache = -1; + int newfd, entries, has_errors = 0, nul_term_line = 0; + enum uc_mode untracked_cache = UC_UNSPECIFIED; int read_from_stdin = 0; int prefix_length = prefix ? strlen(prefix) : 0; int preferred_index_format = 0; @@ -912,6 +923,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) int split_index = -1; struct lock_file *lock_file; struct parse_opt_ctx_t ctx; + strbuf_getline_fn getline_fn; int parseopt_state = PARSE_OPT_UNKNOWN; struct option options[] = { OPT_BIT('q', NULL, &refresh_args.flags, @@ -963,13 +975,13 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) N_("add to index only; do not add content to object database"), 1), OPT_SET_INT(0, "force-remove", &force_remove, N_("remove named paths even if present in worktree"), 1), - OPT_SET_INT('z', NULL, &line_termination, - N_("with --stdin: input lines are terminated by null bytes"), '\0'), + OPT_BOOL('z', NULL, &nul_term_line, + N_("with --stdin: input lines are terminated by null bytes")), {OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL, N_("read list of paths to be updated from standard input"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_callback}, - {OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &line_termination, NULL, + {OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &nul_term_line, NULL, N_("add entries from standard input to the index"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_cacheinfo_callback}, @@ -996,8 +1008,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) N_("enable or disable split index")), OPT_BOOL(0, "untracked-cache", &untracked_cache, N_("enable/disable untracked cache")), + OPT_SET_INT(0, "test-untracked-cache", &untracked_cache, + N_("test if the filesystem supports untracked cache"), UC_TEST), OPT_SET_INT(0, "force-untracked-cache", &untracked_cache, - N_("enable untracked cache without testing the filesystem"), 2), + N_("enable untracked cache without testing the filesystem"), UC_FORCE), OPT_END() }; @@ -1057,6 +1071,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } } argc = parse_options_end(&ctx); + + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; if (preferred_index_format) { if (preferred_index_format < INDEX_FORMAT_LB || INDEX_FORMAT_UB < preferred_index_format) @@ -1070,16 +1086,17 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } if (read_from_stdin) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; setup_work_tree(); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + while (getline_fn(&buf, stdin) != EOF) { char *p; - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } p = prefix_path(prefix, prefix_length, buf.buf); update_one(p); @@ -1087,7 +1104,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) chmod_path(set_executable_bit, p); free(p); } - strbuf_release(&nbuf); + strbuf_release(&unquoted); strbuf_release(&buf); } @@ -1104,27 +1121,32 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) the_index.split_index = NULL; the_index.cache_changed |= SOMETHING_CHANGED; } - if (untracked_cache > 0) { - struct untracked_cache *uc; - if (untracked_cache < 2) { - setup_work_tree(); - if (!test_if_untracked_cache_is_supported()) - return 1; - } - if (!the_index.untracked) { - uc = xcalloc(1, sizeof(*uc)); - strbuf_init(&uc->ident, 100); - uc->exclude_per_dir = ".gitignore"; - /* should be the same flags used by git-status */ - uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; - the_index.untracked = uc; - } - add_untracked_ident(the_index.untracked); - the_index.cache_changed |= UNTRACKED_CHANGED; - } else if (!untracked_cache && the_index.untracked) { - the_index.untracked = NULL; - the_index.cache_changed |= UNTRACKED_CHANGED; + switch (untracked_cache) { + case UC_UNSPECIFIED: + break; + case UC_DISABLE: + if (git_config_get_untracked_cache() == 1) + warning("core.untrackedCache is set to true; " + "remove or change it, if you really want to " + "disable the untracked cache"); + remove_untracked_cache(&the_index); + report(_("Untracked cache disabled")); + break; + case UC_TEST: + setup_work_tree(); + return !test_if_untracked_cache_is_supported(); + case UC_ENABLE: + case UC_FORCE: + if (git_config_get_untracked_cache() == 0) + warning("core.untrackedCache is set to false; " + "remove or change it, if you really want to " + "enable the untracked cache"); + add_untracked_cache(&the_index); + report(_("Untracked cache enabled for '%s'"), get_git_work_tree()); + break; + default: + die("Bug: bad untracked_cache value: %d", untracked_cache); } if (active_cache_changed) { diff --git a/cache-tree.c b/cache-tree.c index a59e6f1e1f..20ee7b52df 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -377,7 +377,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 c63fcc113a..26640b421d 100644 --- a/cache.h +++ b/cache.h @@ -9,6 +9,7 @@ #include "convert.h" #include "trace.h" #include "string-list.h" +#include "pack-revindex.h" #include SHA1_HEADER #ifndef platform_SHA_CTX @@ -214,7 +215,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) @@ -259,6 +260,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 +458,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 +468,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 @@ -1299,6 +1319,7 @@ extern struct packed_git { freshened:1, do_not_close:1; unsigned char sha1[20]; + struct revindex_entry *revindex; /* something like ".git/objects/pack/xxxxx.pack" */ char pack_name[FLEX_ARRAY]; /* more */ } *packed_git; @@ -1603,6 +1624,14 @@ extern int git_config_get_bool(const char *key, int *dest); extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest); extern int git_config_get_maybe_bool(const char *key, int *dest); extern int git_config_get_pathname(const char *key, const char **dest); +extern int git_config_get_untracked_cache(void); + +/* + * This is a hack for test programs like test-dump-untracked-cache to + * ensure that they do not modify the untracked cache when reading it. + * Do not use it otherwise! + */ +extern int ignore_untracked_cache_config; struct key_value_info { const char *filename; diff --git a/compat/basename.c b/compat/basename.c index d8f8a3c6dc..96bd9533b4 100644 --- a/compat/basename.c +++ b/compat/basename.c @@ -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; +} diff --git a/compat/bswap.h b/compat/bswap.h index 7fed637ed0..d47c003544 100644 --- a/compat/bswap.h +++ b/compat/bswap.h @@ -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)) diff --git a/compat/mingw.c b/compat/mingw.c index 5edea29508..fbe69b874b 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -6,6 +6,8 @@ #include "../run-command.h" #include "../cache.h" +#define HCAST(type, handle) ((type)(intptr_t)handle) + static const int delay[] = { 0, 1, 10, 20, 40 }; int err_win_to_posix(DWORD winerr) @@ -452,6 +454,39 @@ static inline time_t filetime_to_time_t(const FILETIME *ft) return (time_t)(filetime_to_hnsec(ft) / 10000000); } +/** + * Verifies that safe_create_leading_directories() would succeed. + */ +static int has_valid_directory_prefix(wchar_t *wfilename) +{ + int n = wcslen(wfilename); + + while (n > 0) { + wchar_t c = wfilename[--n]; + DWORD attributes; + + if (!is_dir_sep(c)) + continue; + + wfilename[n] = L'\0'; + attributes = GetFileAttributesW(wfilename); + wfilename[n] = c; + if (attributes == FILE_ATTRIBUTE_DIRECTORY || + attributes == FILE_ATTRIBUTE_DEVICE) + return 1; + if (attributes == INVALID_FILE_ATTRIBUTES) + switch (GetLastError()) { + case ERROR_PATH_NOT_FOUND: + continue; + case ERROR_FILE_NOT_FOUND: + /* This implies parent directory exists. */ + return 1; + } + return 0; + } + return 1; +} + /* We keep the do_lstat code in a separate function to avoid recursion. * When a path ends with a slash, the stat will fail with ENOENT. In * this case, we strip the trailing slashes and stat again. @@ -512,6 +547,12 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf) case ERROR_NOT_ENOUGH_MEMORY: errno = ENOMEM; break; + case ERROR_PATH_NOT_FOUND: + if (!has_valid_directory_prefix(wfilename)) { + errno = ENOTDIR; + break; + } + /* fallthru */ default: errno = ENOENT; break; @@ -691,13 +732,13 @@ int pipe(int filedes[2]) errno = err_win_to_posix(GetLastError()); return -1; } - filedes[0] = _open_osfhandle((int)h[0], O_NOINHERIT); + filedes[0] = _open_osfhandle(HCAST(int, h[0]), O_NOINHERIT); if (filedes[0] < 0) { CloseHandle(h[0]); CloseHandle(h[1]); return -1; } - filedes[1] = _open_osfhandle((int)h[1], O_NOINHERIT); + filedes[1] = _open_osfhandle(HCAST(int, h[1]), O_NOINHERIT); if (filedes[1] < 0) { close(filedes[0]); CloseHandle(h[1]); @@ -1601,7 +1642,12 @@ int mingw_rename(const char *pold, const char *pnew) if (gle == ERROR_ACCESS_DENIED && (attrs = GetFileAttributesW(wpnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { - errno = EISDIR; + DWORD attrsold = GetFileAttributesW(wpold); + if (attrsold == INVALID_FILE_ATTRIBUTES || + !(attrsold & FILE_ATTRIBUTE_DIRECTORY)) + errno = EISDIR; + else if (!_wrmdir(wpnew)) + goto repeat; return -1; } if ((attrs & FILE_ATTRIBUTE_READONLY) && @@ -1846,7 +1892,8 @@ void mingw_open_html(const char *unixpath) die("cannot run browser"); printf("Launching default browser to display HTML ...\n"); - r = (int)ShellExecute(NULL, "open", htmlpath, NULL, "\\", SW_SHOWNORMAL); + r = HCAST(int, ShellExecute(NULL, "open", htmlpath, + NULL, "\\", SW_SHOWNORMAL)); FreeLibrary(shell32); /* see the MSDN documentation referring to the result codes here */ if (r <= 32) { @@ -1932,28 +1979,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) @@ -2041,6 +2091,37 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen) return -1; } +static void setup_windows_environment() +{ + char *tmp = getenv("TMPDIR"); + + /* on Windows it is TMP and TEMP */ + if (!tmp) { + if (!(tmp = getenv("TMP"))) + tmp = getenv("TEMP"); + if (tmp) { + setenv("TMPDIR", tmp, 1); + tmp = getenv("TMPDIR"); + } + } + + if (tmp) { + /* + * Convert all dir separators to forward slashes, + * to help shell commands called from the Git + * executable (by not mistaking the dir separators + * for escape characters). + */ + for (; *tmp; tmp++) + if (*tmp == '\\') + *tmp = '/'; + } + + /* simulate TERM to enable auto-color (see color.c) */ + if (!getenv("TERM")) + setenv("TERM", "cygwin", 1); +} + /* * Disable MSVCRT command line wildcard expansion (__getmainargs called from * mingw startup code, see init.c in mingw runtime). @@ -2119,19 +2200,7 @@ void mingw_startup() qsort(environ, i, sizeof(char*), compareenv); /* fix Windows specific environment settings */ - - /* on Windows it is TMP and TEMP */ - if (!mingw_getenv("TMPDIR")) { - const char *tmp = mingw_getenv("TMP"); - if (!tmp) - tmp = mingw_getenv("TEMP"); - if (tmp) - setenv("TMPDIR", tmp, 1); - } - - /* simulate TERM to enable auto-color (see color.c) */ - if (!getenv("TERM")) - setenv("TERM", "cygwin", 1); + setup_windows_environment(); /* initialize critical section for waitpid pinfo_t list */ InitializeCriticalSection(&pinfo_cs); diff --git a/compat/mingw.h b/compat/mingw.h index 57ca477d1f..8c5bf5076b 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -1,27 +1,43 @@ +#ifdef __MINGW64_VERSION_MAJOR +#include +#include +typedef _sigset_t sigset_t; +#endif #include #include +/* MinGW-w64 reports to have flockfile, but it does not actually have it. */ +#ifdef __MINGW64_VERSION_MAJOR +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#endif + /* * things that are not available in header files */ -typedef int pid_t; typedef int uid_t; typedef int socklen_t; +#ifndef __MINGW64_VERSION_MAJOR +typedef int pid_t; #define hstrerror strerror +#endif #define S_IFLNK 0120000 /* Symbolic link */ #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) #define S_ISSOCK(x) 0 +#ifndef S_IRWXG #define S_IRGRP 0 #define S_IWGRP 0 #define S_IXGRP 0 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +#endif +#ifndef S_IRWXO #define S_IROTH 0 #define S_IWOTH 0 #define S_IXOTH 0 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#endif #define S_ISUID 0004000 #define S_ISGID 0002000 @@ -100,8 +116,10 @@ static inline int symlink(const char *oldpath, const char *newpath) { errno = ENOSYS; return -1; } static inline int fchmod(int fildes, mode_t mode) { errno = ENOSYS; return -1; } +#ifndef __MINGW64_VERSION_MAJOR static inline pid_t fork(void) { errno = ENOSYS; return -1; } +#endif static inline unsigned int alarm(unsigned int seconds) { return 0; } static inline int fsync(int fd) @@ -176,8 +194,10 @@ int pipe(int filedes[2]); unsigned int sleep (unsigned int seconds); int mkstemp(char *template); int gettimeofday(struct timeval *tv, void *tz); +#ifndef __MINGW64_VERSION_MAJOR struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime_r(const time_t *timep, struct tm *result); +#endif int getpagesize(void); /* defined in MinGW's libgcc.a */ struct passwd *getpwuid(uid_t uid); int setitimer(int type, struct itimerval *in, struct itimerval *out); @@ -301,8 +321,10 @@ static inline int getrlimit(int resource, struct rlimit *rlp) /* * Use mingw specific stat()/lstat()/fstat() implementations on Windows. */ +#ifndef __MINGW64_VERSION_MAJOR #define off_t off64_t #define lseek _lseeki64 +#endif /* use struct stat with 64 bit st_size */ #ifdef stat @@ -361,7 +383,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) { @@ -375,8 +400,12 @@ static inline char *mingw_find_last_dir_sep(const char *path) int mingw_offset_1st_component(const char *path); #define offset_1st_component mingw_offset_1st_component #define PATH_SEP ';' +#ifndef __MINGW64_VERSION_MAJOR #define PRIuMAX "I64u" #define PRId64 "I64d" +#else +#include +#endif void mingw_open_html(const char *path); #define open_html mingw_open_html diff --git a/compat/nedmalloc/malloc.c.h b/compat/nedmalloc/malloc.c.h index f216a2a7d3..b833ff9225 100644 --- a/compat/nedmalloc/malloc.c.h +++ b/compat/nedmalloc/malloc.c.h @@ -720,6 +720,9 @@ struct mallinfo { inlining are defined as macros, so these aren't used for them. */ +#ifdef __MINGW64_VERSION_MAJOR +#undef FORCEINLINE +#endif #ifndef FORCEINLINE #if defined(__GNUC__) #define FORCEINLINE __inline __attribute__ ((always_inline)) @@ -1382,6 +1385,7 @@ LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value); /*** Atomic operations ***/ #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 + #undef _ReadWriteBarrier #define _ReadWriteBarrier() __sync_synchronize() #else static __inline__ __attribute__((always_inline)) long __sync_lock_test_and_set(volatile long * const Target, const long Value) @@ -1798,9 +1802,10 @@ struct win32_mlock_t volatile long threadid; }; +static inline int return_0(int i) { return 0; } #define MLOCK_T struct win32_mlock_t #define CURRENT_THREAD win32_getcurrentthreadid() -#define INITIAL_LOCK(sl) (memset(sl, 0, sizeof(MLOCK_T)), 0) +#define INITIAL_LOCK(sl) (memset(sl, 0, sizeof(MLOCK_T)), return_0(0)) #define ACQUIRE_LOCK(sl) win32_acquire_lock(sl) #define RELEASE_LOCK(sl) win32_release_lock(sl) #define TRY_LOCK(sl) win32_try_lock(sl) diff --git a/compat/poll/poll.c b/compat/poll/poll.c index db4e03ed79..b10adc780f 100644 --- a/compat/poll/poll.c +++ b/compat/poll/poll.c @@ -76,7 +76,7 @@ #ifdef WIN32_NATIVE -#define IsConsoleHandle(h) (((long) (h) & 3) == 3) +#define IsConsoleHandle(h) (((long) (intptr_t) (h) & 3) == 3) static BOOL IsSocketHandle (HANDLE h) diff --git a/compat/terminal.c b/compat/terminal.c index 313897d581..fa13ee672d 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -122,7 +122,7 @@ char *git_terminal_prompt(const char *prompt, int echo) fputs(prompt, output_fh); fflush(output_fh); - r = strbuf_getline(&buf, input_fh, '\n'); + r = strbuf_getline_lf(&buf, input_fh); if (!echo) { putc('\n', output_fh); fflush(output_fh); diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h index 8ad187344f..20b35a283c 100644 --- a/compat/win32/pthread.h +++ b/compat/win32/pthread.h @@ -18,7 +18,10 @@ */ #define pthread_mutex_t CRITICAL_SECTION -#define pthread_mutex_init(a,b) (InitializeCriticalSection((a)), 0) +static inline int return_0(int i) { + return 0; +} +#define pthread_mutex_init(a,b) return_0((InitializeCriticalSection((a)), 0)) #define pthread_mutex_destroy(a) DeleteCriticalSection((a)) #define pthread_mutex_lock EnterCriticalSection #define pthread_mutex_unlock LeaveCriticalSection @@ -77,7 +80,7 @@ extern pthread_t pthread_self(void); static inline int pthread_exit(void *ret) { - ExitThread((DWORD)ret); + ExitThread((DWORD)(intptr_t)ret); } typedef DWORD pthread_key_t; diff --git a/compat/winansi.c b/compat/winansi.c index ceff55bd67..5dfa5ed61f 100644 --- a/compat/winansi.c +++ b/compat/winansi.c @@ -23,6 +23,7 @@ static HANDLE hthread, hread, hwrite; static HANDLE hconsole1, hconsole2; #ifdef __MINGW32__ +#if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 5 typedef struct _CONSOLE_FONT_INFOEX { ULONG cbSize; DWORD nFont; @@ -32,6 +33,7 @@ typedef struct _CONSOLE_FONT_INFOEX { WCHAR FaceName[LF_FACESIZE]; } CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX; #endif +#endif typedef BOOL (WINAPI *PGETCURRENTCONSOLEFONTEX)(HANDLE, BOOL, PCONSOLE_FONT_INFOEX); @@ -452,7 +454,8 @@ static HANDLE duplicate_handle(HANDLE hnd) HANDLE hresult, hproc = GetCurrentProcess(); if (!DuplicateHandle(hproc, hnd, hproc, &hresult, 0, TRUE, DUPLICATE_SAME_ACCESS)) - die_lasterr("DuplicateHandle(%li) failed", (long) hnd); + die_lasterr("DuplicateHandle(%li) failed", + (long) (intptr_t) hnd); return hresult; } diff --git a/config.c b/config.c index 86a5eb2571..b95ac3a9cd 100644 --- a/config.c +++ b/config.c @@ -1594,6 +1594,30 @@ int git_config_get_pathname(const char *key, const char **dest) return ret; } +int git_config_get_untracked_cache(void) +{ + int val = -1; + const char *v; + + /* Hack for test programs like test-dump-untracked-cache */ + if (ignore_untracked_cache_config) + return -1; + + if (!git_config_get_maybe_bool("core.untrackedcache", &val)) + return val; + + if (!git_config_get_value("core.untrackedcache", &v)) { + if (!strcasecmp(v, "keep")) + return -1; + + error("unknown core.untrackedCache value '%s'; " + "using 'keep' default value", v); + return -1; + } + + return -1; /* default value */ +} + NORETURN void git_die_config_linenr(const char *key, const char *filename, int linenr) { diff --git a/config.mak.uname b/config.mak.uname index f34dcaad20..d6f7980bb9 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -518,13 +518,12 @@ ifneq (,$(findstring MINGW,$(uname_S))) NO_INET_NTOP = YesPlease NO_POSIX_GOODIES = UnfortunatelyYes DEFAULT_HELP_FORMAT = html - COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -D_USE_32BIT_TIME_T -DNOGDI -Icompat -Icompat/win32 + COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32 COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" COMPAT_OBJS += compat/mingw.o compat/winansi.o \ compat/win32/pthread.o compat/win32/syslog.o \ compat/win32/dirent.o BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1 - BASIC_LDFLAGS += -Wl,--large-address-aware EXTLIBS += -lws2_32 GITLIBS += git.res PTHREAD_LIBS = @@ -541,8 +540,35 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT)) INTERNAL_QSORT = YesPlease HAVE_LIBCHARSET_H = YesPlease NO_GETTEXT = YesPlease + COMPAT_CLFAGS += -D__USE_MINGW_ACCESS else - NO_CURL = YesPlease + ifeq ($(shell expr "$(uname_R)" : '2\.'),2) + # MSys2 + prefix = /usr/ + ifeq (MINGW32,$(MSYSTEM)) + prefix = /mingw32 + endif + ifeq (MINGW64,$(MSYSTEM)) + prefix = /mingw64 + else + COMPAT_CFLAGS += -D_USE_32BIT_TIME_T + BASIC_LDFLAGS += -Wl,--large-address-aware + endif + CC = gcc + COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 + INSTALL = /bin/install + NO_R_TO_GCC_LINKER = YesPlease + INTERNAL_QSORT = YesPlease + HAVE_LIBCHARSET_H = YesPlease + NO_GETTEXT = + USE_GETTEXT_SCHEME = fallthrough + USE_LIBPCRE= YesPlease + NO_CURL = + USE_NED_ALLOCATOR = YesPlease + else + COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO + NO_CURL = YesPlease + endif endif endif ifeq ($(uname_S),QNX) diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 6956807519..45ec47f2b1 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -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= @@ -1312,6 +1312,7 @@ _git_grep () --full-name --line-number --extended-regexp --basic-regexp --fixed-strings --perl-regexp + --threads --files-with-matches --name-only --files-without-match --max-depth @@ -1687,8 +1688,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 @@ -1808,7 +1813,7 @@ _git_config () return ;; branch.*.rebase) - __gitcomp "false true" + __gitcomp "false true preserve interactive" return ;; remote.pushdefault) @@ -2055,6 +2060,7 @@ _git_config () core.sparseCheckout core.symlinks core.trustctime + core.untrackedCache core.warnAmbiguousRefs core.whitespace core.worktree @@ -2368,7 +2374,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 +2387,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 +2409,20 @@ _git_stash () apply,--*|pop,--*) __gitcomp "--index --quiet" ;; - show,--*|drop,--*|branch,--*) + drop,--*) + __gitcomp "--quiet" + ;; + 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,*|branch,*) + show,*|apply,*|drop,*|pop,*) __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ | sed -n -e 's/:.*//p')" ;; diff --git a/contrib/examples/git-commit.sh b/contrib/examples/git-commit.sh index 934505bab9..86c9cfa0c7 100755 --- a/contrib/examples/git-commit.sh +++ b/contrib/examples/git-commit.sh @@ -574,10 +574,10 @@ then if test "$templatefile" != "" then # Test whether this is just the unaltered template. - if cnt=`sed -e '/^#/d' < "$templatefile" | + if cnt=$(sed -e '/^#/d' < "$templatefile" | git stripspace | diff "$GIT_DIR"/COMMIT_BAREMSG - | - wc -l` && + wc -l) && test 0 -lt $cnt then have_commitmsg=t @@ -630,8 +630,8 @@ then fi if test -z "$quiet" then - commit=`git diff-tree --always --shortstat --pretty="format:%h: %s"\ - --abbrev --summary --root HEAD --` + commit=$(git diff-tree --always --shortstat --pretty="format:%h: %s"\ + --abbrev --summary --root HEAD --) echo "Created${initial_commit:+ initial} commit $commit" fi fi diff --git a/contrib/examples/git-fetch.sh b/contrib/examples/git-fetch.sh index 554070909c..57d2e5616f 100755 --- a/contrib/examples/git-fetch.sh +++ b/contrib/examples/git-fetch.sh @@ -146,13 +146,13 @@ esac reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then - taglist=`IFS=' ' && + taglist=$(IFS=' ' && echo "$ls_remote_result" | git show-ref --exclude-existing=refs/tags/ | while read sha1 name do echo ".${name}:${name}" - done` || exit + done) || exit if test "$#" -gt 1 then # remote URL plus explicit refspecs; we need to merge them. diff --git a/contrib/examples/git-merge.sh b/contrib/examples/git-merge.sh index 52f2aafb9d..ee99f1a4ee 100755 --- a/contrib/examples/git-merge.sh +++ b/contrib/examples/git-merge.sh @@ -523,10 +523,10 @@ do if test "$exit" -eq 1 then - cnt=`{ + cnt=$({ git diff-files --name-only git ls-files --unmerged - } | wc -l` + } | wc -l) if test $best_cnt -le 0 || test $cnt -le $best_cnt then best_strategy=$strategy diff --git a/contrib/examples/git-repack.sh b/contrib/examples/git-repack.sh index 96e3fed326..672af93443 100755 --- a/contrib/examples/git-repack.sh +++ b/contrib/examples/git-repack.sh @@ -67,8 +67,8 @@ case ",$all_into_one," in ,t,) args= existing= if [ -d "$PACKDIR" ]; then - for e in `cd "$PACKDIR" && find . -type f -name '*.pack' \ - | sed -e 's/^\.\///' -e 's/\.pack$//'` + for e in $(cd "$PACKDIR" && find . -type f -name '*.pack' \ + | sed -e 's/^\.\///' -e 's/\.pack$//') do if [ -e "$PACKDIR/$e.keep" ]; then : keep diff --git a/contrib/examples/git-revert.sh b/contrib/examples/git-revert.sh index 7e2aad5491..197838d10b 100755 --- a/contrib/examples/git-revert.sh +++ b/contrib/examples/git-revert.sh @@ -138,8 +138,8 @@ cherry-pick) }' logmsg=$(git show -s --pretty=raw --encoding="$encoding" "$commit") - set_author_env=`echo "$logmsg" | - LANG=C LC_ALL=C sed -ne "$pick_author_script"` + set_author_env=$(echo "$logmsg" | + LANG=C LC_ALL=C sed -ne "$pick_author_script") eval "$set_author_env" export GIT_AUTHOR_NAME export GIT_AUTHOR_EMAIL @@ -160,9 +160,9 @@ cherry-pick) esac >.msg eval GITHEAD_$head=HEAD -eval GITHEAD_$next='`git show -s \ +eval GITHEAD_$next='$(git show -s \ --pretty=oneline --encoding="$encoding" "$commit" | - sed -e "s/^[^ ]* //"`' + sed -e "s/^[^ ]* //")' export GITHEAD_$head GITHEAD_$next # This three way merge is an interesting one. We are at diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile index 3071baf493..6afa9aafdf 100644 --- a/contrib/subtree/Makefile +++ b/contrib/subtree/Makefile @@ -37,6 +37,7 @@ GIT_SUBTREE_DOC := git-subtree.1 GIT_SUBTREE_XML := git-subtree.xml GIT_SUBTREE_TXT := git-subtree.txt GIT_SUBTREE_HTML := git-subtree.html +GIT_SUBTREE_TEST := ../../git-subtree all:: $(GIT_SUBTREE) @@ -71,7 +72,10 @@ $(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT) $(ASCIIDOC) -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \ -agit_version=$(GIT_VERSION) $^ -test: +$(GIT_SUBTREE_TEST): $(GIT_SUBTREE) + cp $< $@ + +test: $(GIT_SUBTREE_TEST) $(MAKE) -C t/ test clean: diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index edf36f8c36..7a39b30ad0 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -245,7 +245,10 @@ find_latest_squash() case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; - git-subtree-split:) sub="$b" ;; + git-subtree-split:) + sub="$(git rev-parse "$b^0")" || + die "could not rev-parse split hash $b from commit $sq" + ;; END) if [ -n "$sub" ]; then if [ -n "$main" ]; then @@ -278,7 +281,10 @@ find_existing_splits() case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; - git-subtree-split:) sub="$b" ;; + git-subtree-split:) + sub="$(git rev-parse "$b^0")" || + die "could not rev-parse split hash $b from commit $sq" + ;; END) debug " Main is: '$main'" if [ -z "$main" -a -n "$sub" ]; then @@ -479,8 +485,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 $? diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh index 751aee3a0c..3bf96a9bb6 100755 --- a/contrib/subtree/t/t7900-subtree.sh +++ b/contrib/subtree/t/t7900-subtree.sh @@ -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 diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh index 8dc73ece15..1053872eea 100755 --- a/contrib/thunderbird-patch-inline/appp.sh +++ b/contrib/thunderbird-patch-inline/appp.sh @@ -31,8 +31,8 @@ BODY=$(sed -e "1,/${SEP}/d" $1) CMT_MSG=$(sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}") DIFF=$(sed -e '1,/^---$/d' "${PATCH}") -CCS=`echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \ - -e 's/^Signed-off-by: \(.*\)/\1,/gp'` +CCS=$(echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \ + -e 's/^Signed-off-by: \(.*\)/\1,/gp') echo "$SUBJECT" > $1 echo "Cc: $CCS" >> $1 diff --git a/convert.c b/convert.c index 814e814438..8cd6222a26 100644 --- a/convert.c +++ b/convert.c @@ -13,6 +13,11 @@ * translation when the "text" attribute or "auto_crlf" option is set. */ +/* Stat bits: When BIN is set, the txt bits are unset */ +#define CONVERT_STAT_BITS_TXT_LF 0x1 +#define CONVERT_STAT_BITS_TXT_CRLF 0x2 +#define CONVERT_STAT_BITS_BIN 0x4 + enum crlf_action { CRLF_GUESS = -1, CRLF_BINARY = 0, @@ -75,26 +80,75 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat * /* * The same heuristics as diff.c::mmfile_is_binary() + * We treat files with bare CR as binary */ -static int is_binary(unsigned long size, struct text_stat *stats) +static int convert_is_binary(unsigned long size, const struct text_stat *stats) { - + if (stats->cr != stats->crlf) + return 1; if (stats->nul) return 1; if ((stats->printable >> 7) < stats->nonprintable) return 1; - /* - * Other heuristics? Average line length might be relevant, - * as might LF vs CR vs CRLF counts.. - * - * NOTE! It might be normal to have a low ratio of CRLF to LF - * (somebody starts with a LF-only file and edits it with an editor - * that adds CRLF only to lines that are added..). But do we - * want to support CR-only? Probably not. - */ return 0; } +static unsigned int gather_convert_stats(const char *data, unsigned long size) +{ + struct text_stat stats; + if (!data || !size) + return 0; + gather_stats(data, size, &stats); + if (convert_is_binary(size, &stats)) + return CONVERT_STAT_BITS_BIN; + else if (stats.crlf && stats.crlf == stats.lf) + return CONVERT_STAT_BITS_TXT_CRLF; + else if (stats.crlf && stats.lf) + return CONVERT_STAT_BITS_TXT_CRLF | CONVERT_STAT_BITS_TXT_LF; + else if (stats.lf) + return CONVERT_STAT_BITS_TXT_LF; + else + return 0; +} + +static const char *gather_convert_stats_ascii(const char *data, unsigned long size) +{ + unsigned int convert_stats = gather_convert_stats(data, size); + + if (convert_stats & CONVERT_STAT_BITS_BIN) + return "-text"; + switch (convert_stats) { + case CONVERT_STAT_BITS_TXT_LF: + return "lf"; + case CONVERT_STAT_BITS_TXT_CRLF: + return "crlf"; + case CONVERT_STAT_BITS_TXT_LF | CONVERT_STAT_BITS_TXT_CRLF: + return "mixed"; + default: + return "none"; + } +} + +const char *get_cached_convert_stats_ascii(const char *path) +{ + const char *ret; + unsigned long sz; + void *data = read_blob_data_from_cache(path, &sz); + ret = gather_convert_stats_ascii(data, sz); + free(data); + return ret; +} + +const char *get_wt_convert_stats_ascii(const char *path) +{ + const char *ret = ""; + struct strbuf sb = STRBUF_INIT; + if (strbuf_read_file(&sb, path, 0) >= 0) + ret = gather_convert_stats_ascii(sb.buf, sb.len); + strbuf_release(&sb); + return ret; +} + static enum eol output_eol(enum crlf_action crlf_action) { switch (crlf_action) { @@ -187,18 +241,7 @@ static int crlf_to_git(const char *path, const char *src, size_t len, gather_stats(src, len, &stats); if (crlf_action == CRLF_AUTO || crlf_action == CRLF_GUESS) { - /* - * We're currently not going to even try to convert stuff - * that has bare CR characters. Does anybody do that crazy - * stuff? - */ - if (stats.cr != stats.crlf) - return 0; - - /* - * And add some heuristics for binary vs text, of course... - */ - if (is_binary(len, &stats)) + if (convert_is_binary(len, &stats)) return 0; if (crlf_action == CRLF_GUESS) { @@ -277,11 +320,7 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len, return 0; } - /* If we have any bare CR characters, we're not going to touch it */ - if (stats.cr != stats.crlf) - return 0; - - if (is_binary(len, &stats)) + if (convert_is_binary(len, &stats)) return 0; } @@ -395,7 +434,7 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd, struct async async; struct filter_params params; - if (!cmd) + if (!cmd || !*cmd) return 0; if (!dst) @@ -777,6 +816,30 @@ int would_convert_to_git_filter_fd(const char *path) return apply_filter(path, NULL, 0, -1, NULL, ca.drv->clean); } +const char *get_convert_attr_ascii(const char *path) +{ + struct conv_attrs ca; + enum crlf_action crlf_action; + + convert_attrs(&ca, path); + crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr); + switch (crlf_action) { + case CRLF_GUESS: + return ""; + case CRLF_BINARY: + return "-text"; + case CRLF_TEXT: + return "text"; + case CRLF_INPUT: + return "text eol=lf"; + case CRLF_CRLF: + return "text=auto eol=crlf"; + case CRLF_AUTO: + return "text=auto"; + } + return ""; +} + int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst, enum safe_crlf checksafe) { diff --git a/convert.h b/convert.h index d9d853cd3d..ccf436bfbf 100644 --- a/convert.h +++ b/convert.h @@ -32,6 +32,9 @@ enum eol { }; extern enum eol core_eol; +extern const char *get_cached_convert_stats_ascii(const char *path); +extern const char *get_wt_convert_stats_ascii(const char *path); +extern const char *get_convert_attr_ascii(const char *path); /* returns 1 if *dst was used */ extern int convert_to_git(const char *path, const char *src, size_t len, diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c index 9365f2ce5c..cc65a9c0d3 100644 --- a/credential-cache--daemon.c +++ b/credential-cache--daemon.c @@ -96,12 +96,12 @@ static int read_request(FILE *fh, struct credential *c, static struct strbuf item = STRBUF_INIT; const char *p; - strbuf_getline(&item, fh, '\n'); + strbuf_getline_lf(&item, fh); if (!skip_prefix(item.buf, "action=", &p)) return error("client sent bogus action line: %s", item.buf); strbuf_addstr(action, p); - strbuf_getline(&item, fh, '\n'); + strbuf_getline_lf(&item, fh); if (!skip_prefix(item.buf, "timeout=", &p)) return error("client sent bogus timeout line: %s", item.buf); *timeout = atoi(p); diff --git a/credential-store.c b/credential-store.c index 54c4e04737..57141679ab 100644 --- a/credential-store.c +++ b/credential-store.c @@ -23,7 +23,7 @@ static int parse_credential_file(const char *fn, return found_credential; } - while (strbuf_getline(&line, fh, '\n') != EOF) { + while (strbuf_getline_lf(&line, fh) != EOF) { credential_from_url(&entry, line.buf); if (entry.username && entry.password && credential_match(c, &entry)) { diff --git a/credential.c b/credential.c index b146ad8481..7d6501d190 100644 --- a/credential.c +++ b/credential.c @@ -142,7 +142,7 @@ int credential_read(struct credential *c, FILE *fp) { struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, fp, '\n') != EOF) { + while (strbuf_getline_lf(&line, fp) != EOF) { char *key = line.buf; char *value = strchr(key, '='); diff --git a/daemon.c b/daemon.c index be70cd4da0..46b411c7d9 100644 --- a/daemon.c +++ b/daemon.c @@ -424,7 +424,7 @@ static void copy_to_log(int fd) return; } - while (strbuf_getline(&line, fp, '\n') != EOF) { + while (strbuf_getline_lf(&line, fp) != EOF) { logerror("%s", line.buf); strbuf_setlen(&line, 0); } diff --git a/diff-no-index.c b/diff-no-index.c index 8e0fd270b5..03daadb25a 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -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 80eb0c2156..2136b6970b 100644 --- a/diff.c +++ b/diff.c @@ -3693,12 +3693,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 +3919,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 +3959,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 diff --git a/diff.h b/diff.h index f7208ad103..70b2d70d64 100644 --- 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) @@ -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,7 +345,7 @@ 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); diff --git a/dir.c b/dir.c index d2a8f06b02..f0b6d0a3ea 100644 --- a/dir.c +++ b/dir.c @@ -564,9 +564,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) @@ -882,25 +880,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 +887,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 +900,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 +935,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; } @@ -1913,31 +1839,67 @@ static const char *get_ident_string(void) return sb.buf; if (uname(&uts) < 0) die_errno(_("failed to get kernel name and information")); - strbuf_addf(&sb, "Location %s, system %s %s %s", get_git_work_tree(), - uts.sysname, uts.release, uts.version); + strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(), + uts.sysname); return sb.buf; } static int ident_in_untracked(const struct untracked_cache *uc) { - const char *end = uc->ident.buf + uc->ident.len; - const char *p = uc->ident.buf; + /* + * Previous git versions may have saved many NUL separated + * strings in the "ident" field, but it is insane to manage + * many locations, so just take care of the first one. + */ - for (p = uc->ident.buf; p < end; p += strlen(p) + 1) - if (!strcmp(p, get_ident_string())) - return 1; - return 0; + return !strcmp(uc->ident.buf, get_ident_string()); } -void add_untracked_ident(struct untracked_cache *uc) +static void set_untracked_ident(struct untracked_cache *uc) { - if (ident_in_untracked(uc)) - return; + strbuf_reset(&uc->ident); strbuf_addstr(&uc->ident, get_ident_string()); - /* this strbuf contains a list of strings, save NUL too */ + + /* + * This strbuf used to contain a list of NUL separated + * strings, so save NUL too for backward compatibility. + */ strbuf_addch(&uc->ident, 0); } +static void new_untracked_cache(struct index_state *istate) +{ + struct untracked_cache *uc = xcalloc(1, sizeof(*uc)); + strbuf_init(&uc->ident, 100); + uc->exclude_per_dir = ".gitignore"; + /* should be the same flags used by git-status */ + uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; + set_untracked_ident(uc); + istate->untracked = uc; + istate->cache_changed |= UNTRACKED_CHANGED; +} + +void add_untracked_cache(struct index_state *istate) +{ + if (!istate->untracked) { + new_untracked_cache(istate); + } else { + if (!ident_in_untracked(istate->untracked)) { + free_untracked_cache(istate->untracked); + new_untracked_cache(istate); + } + } +} + +void remove_untracked_cache(struct index_state *istate) +{ + if (istate->untracked) { + free_untracked_cache(istate->untracked); + istate->untracked = NULL; + istate->cache_changed |= UNTRACKED_CHANGED; + } +} + static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir, int base_len, const struct pathspec *pathspec) @@ -1995,7 +1957,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d return NULL; if (!ident_in_untracked(dir->untracked)) { - warning(_("Untracked cache is disabled on this system.")); + warning(_("Untracked cache is disabled on this system or location.")); return NULL; } diff --git a/dir.h b/dir.h index 7b5855dd80..cd46f30017 100644 --- a/dir.h +++ b/dir.h @@ -307,5 +307,6 @@ void untracked_cache_add_to_index(struct index_state *, const char *); void free_untracked_cache(struct untracked_cache *); struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz); void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked); -void add_untracked_ident(struct untracked_cache *); +void add_untracked_cache(struct index_state *istate); +void remove_untracked_cache(struct index_state *istate); #endif diff --git a/environment.c b/environment.c index 2da7fe2e06..6dec9d0403 100644 --- a/environment.c +++ b/environment.c @@ -87,6 +87,13 @@ int auto_comment_line_char; /* Parallel index stat data preload? */ int core_preload_index = 1; +/* + * This is a hack for test programs like test-dump-untracked-cache to + * ensure that they do not modify the untracked cache when reading it. + * Do not use it otherwise! + */ +int ignore_untracked_cache_config; + /* This is set by setup_git_dir_gently() and/or git_default_config() */ char *git_work_tree_cfg; static char *work_tree; @@ -235,8 +242,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) diff --git a/fast-import.c b/fast-import.c index 3c65edb5c4..bf01b34221 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1888,7 +1888,7 @@ static int read_next_command(void) struct recent_command *rc; strbuf_detach(&command_buf, NULL); - stdin_eof = strbuf_getline(&command_buf, stdin, '\n'); + stdin_eof = strbuf_getline_lf(&command_buf, stdin); if (stdin_eof) return EOF; @@ -1960,7 +1960,7 @@ static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res) strbuf_detach(&command_buf, NULL); for (;;) { - if (strbuf_getline(&command_buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(&command_buf, stdin) == EOF) die("EOF in data (terminator '%s' not found)", term); if (term_len == command_buf.len && !strcmp(term, command_buf.buf)) diff --git a/git-compat-util.h b/git-compat-util.h index 2da0a75a38..693a336ff5 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -253,6 +253,8 @@ struct itimerval { #else #define basename gitbasename extern char *gitbasename(char *); +#define dirname gitdirname +extern char *gitdirname(char *); #endif #ifndef NO_ICONV @@ -335,6 +337,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) { @@ -733,6 +743,7 @@ 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 REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x))) diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 98f1779cf3..86b2ff1e07 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -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 || diff --git a/git-gui/po/glossary/txt-to-pot.sh b/git-gui/po/glossary/txt-to-pot.sh index 49bf7c5365..8249915d3c 100755 --- a/git-gui/po/glossary/txt-to-pot.sh +++ b/git-gui/po/glossary/txt-to-pot.sh @@ -11,7 +11,7 @@ if [ $# -eq 0 ] then cat < git-gui-glossary.pot +Usage: $(basename $0) git-gui-glossary.txt > git-gui-glossary.pot ! exit 1; fi @@ -33,7 +33,7 @@ cat <\n" "Language-Team: LANGUAGE \n" diff --git a/git-p4.py b/git-p4.py index c33dece5d2..825b9f32d5 100755 --- a/git-p4.py +++ b/git-p4.py @@ -253,8 +253,8 @@ def p4_add(f): def p4_delete(f): p4_system(["delete", wildcard_encode(f)]) -def p4_edit(f): - p4_system(["edit", wildcard_encode(f)]) +def p4_edit(f, *options): + p4_system(["edit"] + list(options) + [wildcard_encode(f)]) def p4_revert(f): p4_system(["revert", wildcard_encode(f)]) @@ -1554,6 +1554,7 @@ def applyCommit(self, id): diff = read_pipe_lines("git diff-tree -r %s \"%s^\" \"%s\"" % (self.diffOpts, id, id)) filesToAdd = set() + filesToChangeType = set() filesToDelete = set() editedFiles = set() pureRenameCopy = set() @@ -1614,6 +1615,8 @@ def applyCommit(self, id): os.unlink(dest) filesToDelete.add(src) editedFiles.add(dest) + elif modifier == "T": + filesToChangeType.add(path) else: die("unknown modifier %s for %s" % (modifier, path)) @@ -1673,6 +1676,8 @@ def applyCommit(self, id): # system(applyPatchCmd) + for f in filesToChangeType: + p4_edit(f, "-t", "auto") for f in filesToAdd: p4_add(f) for f in filesToDelete: diff --git a/git-rebase.sh b/git-rebase.sh index af7ba5fd90..cf60c43908 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -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" } diff --git a/git-send-email.perl b/git-send-email.perl index 6caa5b563f..d356901348 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -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 6ed824cacf..6c64c9430e 100644 --- a/git.c +++ b/git.c @@ -25,14 +25,14 @@ static const char *env_names[] = { GIT_PREFIX_ENVIRONMENT }; static char *orig_env[4]; -static int saved_environment; +static int save_restore_env_balance; -static void save_env(void) +static void save_env_before_alias(void) { int i; - if (saved_environment) - return; - saved_environment = 1; + + assert(save_restore_env_balance == 0); + save_restore_env_balance = 1; orig_cwd = xgetcwd(); for (i = 0; i < ARRAY_SIZE(env_names); i++) { orig_env[i] = getenv(env_names[i]); @@ -41,17 +41,25 @@ static void save_env(void) } } -static void restore_env(void) +static void restore_env(int external_alias) { int i; - if (orig_cwd && chdir(orig_cwd)) + + assert(save_restore_env_balance == 1); + save_restore_env_balance = 0; + if (!external_alias && orig_cwd && chdir(orig_cwd)) die_errno("could not move to %s", orig_cwd); free(orig_cwd); for (i = 0; i < ARRAY_SIZE(env_names); i++) { - if (orig_env[i]) + if (external_alias && + !strcmp(env_names[i], GIT_PREFIX_ENVIRONMENT)) + continue; + if (orig_env[i]) { setenv(env_names[i], orig_env[i], 1); - else + free(orig_env[i]); + } else { unsetenv(env_names[i]); + } } } @@ -226,14 +234,14 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) static int handle_alias(int *argcp, const char ***argv) { int envchanged = 0, ret = 0, saved_errno = errno; - const char *subdir; int count, option_count; const char **new_argv; const char *alias_command; char *alias_string; int unused_nongit; - subdir = setup_git_directory_gently(&unused_nongit); + save_env_before_alias(); + setup_git_directory_gently(&unused_nongit); alias_command = (*argv)[0]; alias_string = alias_lookup(alias_command); @@ -243,6 +251,7 @@ static int handle_alias(int *argcp, const char ***argv) int argc = *argcp, i; commit_pager_choice(); + restore_env(1); /* build alias_argv */ alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1)); @@ -291,8 +300,7 @@ static int handle_alias(int *argcp, const char ***argv) ret = 1; } - if (subdir && chdir(subdir)) - die_errno("Cannot change to '%s'", subdir); + restore_env(0); errno = saved_errno; @@ -307,7 +315,6 @@ static int handle_alias(int *argcp, const char ***argv) * RUN_SETUP for reading from the configuration file. */ #define NEED_WORK_TREE (1<<3) -#define NO_SETUP (1<<4) struct cmd_struct { const char *cmd; @@ -389,7 +396,7 @@ static struct cmd_struct commands[] = { { "cherry", cmd_cherry, RUN_SETUP }, { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, - { "clone", cmd_clone, NO_SETUP }, + { "clone", cmd_clone }, { "column", cmd_column, RUN_SETUP_GENTLY }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, { "commit-tree", cmd_commit_tree, RUN_SETUP }, @@ -415,8 +422,8 @@ static struct cmd_struct commands[] = { { "hash-object", cmd_hash_object }, { "help", cmd_help }, { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY }, - { "init", cmd_init_db, NO_SETUP }, - { "init-db", cmd_init_db, NO_SETUP }, + { "init", cmd_init_db }, + { "init-db", cmd_init_db }, { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY }, { "log", cmd_log, RUN_SETUP }, { "ls-files", cmd_ls_files, RUN_SETUP }, @@ -529,12 +536,8 @@ static void handle_builtin(int argc, const char **argv) } builtin = get_builtin(cmd); - if (builtin) { - if (saved_environment && (builtin->option & NO_SETUP)) - restore_env(); - else - exit(run_builtin(builtin, argc, argv)); - } + if (builtin) + exit(run_builtin(builtin, argc, argv)); } static void execv_dashed_external(const char **argv) @@ -578,8 +581,17 @@ static int run_argv(int *argcp, const char ***argv) int done_alias = 0; while (1) { - /* See if it's a builtin */ - handle_builtin(*argcp, *argv); + /* + * If we tried alias and futzed with our environment, + * it no longer is safe to invoke builtins directly in + * general. We have to spawn them as dashed externals. + * + * NEEDSWORK: if we can figure out cases + * where it is safe to do, we can avoid spawning a new + * process. + */ + if (!done_alias) + handle_builtin(*argcp, *argv); /* .. then try the external ones */ execv_dashed_external(*argv); @@ -590,7 +602,6 @@ static int run_argv(int *argcp, const char ***argv) */ if (done_alias) break; - save_env(); if (!handle_alias(argcp, argv)) break; done_alias = 1; diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 7a5b23acf2..05d7910b7c 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -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/http.c b/http.c index 0da9e66398..dfc53c1e25 100644 --- a/http.c +++ b/http.c @@ -62,6 +62,26 @@ static long curl_low_speed_limit = -1; static long curl_low_speed_time = -1; static int curl_ftp_no_epsv; static const char *curl_http_proxy; +static const char *http_proxy_authmethod; +static struct { + const char *name; + long curlauth_param; +} proxy_authmethods[] = { + { "basic", CURLAUTH_BASIC }, + { "digest", CURLAUTH_DIGEST }, + { "negotiate", CURLAUTH_GSSNEGOTIATE }, + { "ntlm", CURLAUTH_NTLM }, +#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY + { "anyauth", CURLAUTH_ANY }, +#endif + /* + * CURLAUTH_DIGEST_IE has no corresponding command-line option in + * curl(1) and is not included in CURLAUTH_ANY, so we leave it out + * here, too + */ +}; +static struct credential proxy_auth = CREDENTIAL_INIT; +static const char *curl_proxyuserpwd; static const char *curl_cookie_file; static int curl_save_cookies; struct credential http_auth = CREDENTIAL_INIT; @@ -159,6 +179,9 @@ static void finish_active_slot(struct active_request_slot *slot) #else slot->results->auth_avail = 0; #endif + + curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CONNECTCODE, + &slot->results->http_connectcode); } /* Run callback if appropriate */ @@ -256,6 +279,9 @@ static int http_options(const char *var, const char *value, void *cb) if (!strcmp("http.proxy", var)) return git_config_string(&curl_http_proxy, var, value); + if (!strcmp("http.proxyauthmethod", var)) + return git_config_string(&http_proxy_authmethod, var, value); + if (!strcmp("http.cookiefile", var)) return git_config_string(&curl_cookie_file, var, value); if (!strcmp("http.savecookies", var)) { @@ -304,6 +330,64 @@ static void init_curl_http_auth(CURL *result) #endif } +/* *var must be free-able */ +static void var_override(const char **var, char *value) +{ + if (value) { + free((void *)*var); + *var = xstrdup(value); + } +} + +static void set_proxyauth_name_password(CURL *result) +{ +#if LIBCURL_VERSION_NUM >= 0x071301 + curl_easy_setopt(result, CURLOPT_PROXYUSERNAME, + proxy_auth.username); + curl_easy_setopt(result, CURLOPT_PROXYPASSWORD, + proxy_auth.password); +#else + struct strbuf s = STRBUF_INIT; + + strbuf_addstr_urlencode(&s, proxy_auth.username, 1); + strbuf_addch(&s, ':'); + strbuf_addstr_urlencode(&s, proxy_auth.password, 1); + curl_proxyuserpwd = strbuf_detach(&s, NULL); + curl_easy_setopt(result, CURLOPT_PROXYUSERPWD, curl_proxyuserpwd); +#endif +} + +static void init_curl_proxy_auth(CURL *result) +{ + if (proxy_auth.username) { + if (!proxy_auth.password) + credential_fill(&proxy_auth); + set_proxyauth_name_password(result); + } + + var_override(&http_proxy_authmethod, getenv("GIT_HTTP_PROXY_AUTHMETHOD")); + +#if LIBCURL_VERSION_NUM >= 0x070a07 /* CURLOPT_PROXYAUTH and CURLAUTH_ANY */ + if (http_proxy_authmethod) { + int i; + for (i = 0; i < ARRAY_SIZE(proxy_authmethods); i++) { + if (!strcmp(http_proxy_authmethod, proxy_authmethods[i].name)) { + curl_easy_setopt(result, CURLOPT_PROXYAUTH, + proxy_authmethods[i].curlauth_param); + break; + } + } + if (i == ARRAY_SIZE(proxy_authmethods)) { + warning("unsupported proxy authentication method %s: using anyauth", + http_proxy_authmethod); + curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + } + } + else + curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); +#endif +} + static int has_cert_password(void) { if (ssl_cert == NULL || ssl_cert_password_required != 1) @@ -462,6 +546,31 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_USE_SSL, CURLUSESSL_TRY); #endif + /* + * CURL also examines these variables as a fallback; but we need to query + * them here in order to decide whether to prompt for missing password (cf. + * init_curl_proxy_auth()). + * + * Unlike many other common environment variables, these are historically + * lowercase only. It appears that CURL did not know this and implemented + * only uppercase variants, which was later corrected to take both - with + * the exception of http_proxy, which is lowercase only also in CURL. As + * the lowercase versions are the historical quasi-standard, they take + * precedence here, as in CURL. + */ + if (!curl_http_proxy) { + if (!strcmp(http_auth.protocol, "https")) { + var_override(&curl_http_proxy, getenv("HTTPS_PROXY")); + var_override(&curl_http_proxy, getenv("https_proxy")); + } else { + var_override(&curl_http_proxy, getenv("http_proxy")); + } + if (!curl_http_proxy) { + var_override(&curl_http_proxy, getenv("ALL_PROXY")); + var_override(&curl_http_proxy, getenv("all_proxy")); + } + } + if (curl_http_proxy) { curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy); #if LIBCURL_VERSION_NUM >= 0x071800 @@ -475,10 +584,18 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); #endif + if (strstr(curl_http_proxy, "://")) + credential_from_url(&proxy_auth, curl_http_proxy); + else { + struct strbuf url = STRBUF_INIT; + strbuf_addf(&url, "http://%s", curl_http_proxy); + credential_from_url(&proxy_auth, url.buf); + strbuf_release(&url); + } + + curl_easy_setopt(result, CURLOPT_PROXY, proxy_auth.host); } -#if LIBCURL_VERSION_NUM >= 0x070a07 - curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); -#endif + init_curl_proxy_auth(result); set_curl_keepalive(result); @@ -519,6 +636,9 @@ void http_init(struct remote *remote, const char *url, int proactive_auth) if (remote && remote->http_proxy) curl_http_proxy = xstrdup(remote->http_proxy); + if (remote) + var_override(&http_proxy_authmethod, remote->http_proxy_authmethod); + pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache"); no_pragma_header = curl_slist_append(no_pragma_header, "Pragma:"); @@ -617,6 +737,18 @@ void http_cleanup(void) curl_http_proxy = NULL; } + if (proxy_auth.password) { + memset(proxy_auth.password, 0, strlen(proxy_auth.password)); + free(proxy_auth.password); + proxy_auth.password = NULL; + } + + free((void *)curl_proxyuserpwd); + curl_proxyuserpwd = NULL; + + free((void *)http_proxy_authmethod); + http_proxy_authmethod = NULL; + if (cert_auth.password != NULL) { memset(cert_auth.password, 0, strlen(cert_auth.password)); free(cert_auth.password); @@ -946,6 +1078,8 @@ static int handle_curl_result(struct slot_results *results) if (results->curl_result == CURLE_OK) { credential_approve(&http_auth); + if (proxy_auth.password) + credential_approve(&proxy_auth); return HTTP_OK; } else if (missing_target(results)) return HTTP_MISSING_TARGET; @@ -960,6 +1094,8 @@ static int handle_curl_result(struct slot_results *results) return HTTP_REAUTH; } } else { + if (results->http_connectcode == 407) + credential_reject(&proxy_auth); #if LIBCURL_VERSION_NUM >= 0x070c00 if (!curl_errorstr[0]) strlcpy(curl_errorstr, diff --git a/http.h b/http.h index 4f97b60b5c..f83cfa6868 100644 --- a/http.h +++ b/http.h @@ -54,6 +54,7 @@ struct slot_results { CURLcode curl_result; long http_code; long auth_avail; + long http_connectcode; }; struct active_request_slot { diff --git a/ident.c b/ident.c index 4bd80842bc..6e125821f0 100644 --- a/ident.c +++ b/ident.c @@ -79,7 +79,7 @@ static int add_mailname_host(struct strbuf *buf) strerror(errno)); return -1; } - if (strbuf_getline(&mailnamebuf, mailname, '\n') == EOF) { + if (strbuf_getline(&mailnamebuf, mailname) == EOF) { if (ferror(mailname)) warning("cannot read /etc/mailname: %s", strerror(errno)); diff --git a/mailinfo.c b/mailinfo.c index f289941f7e..9f19ca1080 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -732,7 +732,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) struct strbuf continuation = STRBUF_INIT; /* Get the first part of the line. */ - if (strbuf_getline(line, in, '\n')) + if (strbuf_getline_lf(line, in)) return 0; /* @@ -756,7 +756,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) peek = fgetc(in); ungetc(peek, in); if (peek != ' ' && peek != '\t') break; - if (strbuf_getline(&continuation, in, '\n')) + if (strbuf_getline_lf(&continuation, in)) break; continuation.buf[0] = ' '; strbuf_rtrim(&continuation); @@ -769,7 +769,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) static int find_boundary(struct mailinfo *mi, struct strbuf *line) { - while (!strbuf_getline(line, mi->input, '\n')) { + while (!strbuf_getline_lf(line, mi->input)) { if (*(mi->content_top) && is_multipart_boundary(mi, line)) return 1; } @@ -820,7 +820,7 @@ static int handle_boundary(struct mailinfo *mi, struct strbuf *line) strbuf_release(&newline); /* replenish line */ - if (strbuf_getline(line, mi->input, '\n')) + if (strbuf_getline_lf(line, mi->input)) return 0; strbuf_addch(line, '\n'); return 1; diff --git a/notes-cache.c b/notes-cache.c index c4e9bb7f6c..5dfc5cbd08 100644 --- a/notes-cache.c +++ b/notes-cache.c @@ -32,14 +32,14 @@ void notes_cache_init(struct notes_cache *c, const char *name, const char *validity) { struct strbuf ref = STRBUF_INIT; - int flags = 0; + int flags = NOTES_INIT_WRITABLE; memset(c, 0, sizeof(*c)); c->validity = xstrdup(validity); strbuf_addf(&ref, "refs/notes/%s", name); if (!notes_cache_match_validity(ref.buf, validity)) - flags = NOTES_INIT_EMPTY; + flags |= NOTES_INIT_EMPTY; init_notes(&c->tree, ref.buf, combine_notes_overwrite, flags); strbuf_release(&ref); } @@ -49,7 +49,8 @@ int notes_cache_write(struct notes_cache *c) unsigned char tree_sha1[20]; unsigned char commit_sha1[20]; - if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref) + if (!c || !c->tree.initialized || !c->tree.update_ref || + !*c->tree.update_ref) return -1; if (!c->tree.dirty) return 0; @@ -59,8 +60,8 @@ int notes_cache_write(struct notes_cache *c) if (commit_tree(c->validity, strlen(c->validity), tree_sha1, NULL, commit_sha1, NULL, NULL) < 0) return -1; - if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL, - 0, UPDATE_REFS_QUIET_ON_ERR) < 0) + if (update_ref("update notes cache", c->tree.update_ref, commit_sha1, + NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0) return -1; return 0; diff --git a/notes-utils.c b/notes-utils.c index 299e34bccc..24a33616a4 100644 --- a/notes-utils.c +++ b/notes-utils.c @@ -37,7 +37,7 @@ void commit_notes(struct notes_tree *t, const char *msg) if (!t) t = &default_notes_tree; - if (!t->initialized || !t->ref || !*t->ref) + if (!t->initialized || !t->update_ref || !*t->update_ref) die(_("Cannot commit uninitialized/unreferenced notes tree")); if (!t->dirty) return; /* don't have to commit an unchanged tree */ @@ -48,7 +48,7 @@ void commit_notes(struct notes_tree *t, const char *msg) create_notes_commit(t, NULL, buf.buf, buf.len, commit_sha1); strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */ - update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, + update_ref(buf.buf, t->update_ref, commit_sha1, NULL, 0, UPDATE_REFS_DIE_ON_ERR); strbuf_release(&buf); @@ -148,7 +148,7 @@ struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd) free(c); return NULL; } - c->trees = load_notes_trees(c->refs); + c->trees = load_notes_trees(c->refs, NOTES_INIT_WRITABLE); string_list_clear(c->refs, 0); free(c->refs); return c; diff --git a/notes.c b/notes.c index db77922130..c1e5035590 100644 --- a/notes.c +++ b/notes.c @@ -1011,13 +1011,16 @@ void init_notes(struct notes_tree *t, const char *notes_ref, t->first_non_note = NULL; t->prev_non_note = NULL; t->ref = xstrdup_or_null(notes_ref); + t->update_ref = (flags & NOTES_INIT_WRITABLE) ? t->ref : NULL; t->combine_notes = combine_notes; t->initialized = 1; t->dirty = 0; if (flags & NOTES_INIT_EMPTY || !notes_ref || - read_ref(notes_ref, object_sha1)) + get_sha1_treeish(notes_ref, object_sha1)) return; + if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, object_sha1)) + die("Cannot use notes ref %s", notes_ref); if (get_tree_entry(object_sha1, "", sha1, &mode)) die("Failed to read notes tree referenced by %s (%s)", notes_ref, sha1_to_hex(object_sha1)); @@ -1027,7 +1030,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref, load_subtree(t, &root_tree, t->root, 0); } -struct notes_tree **load_notes_trees(struct string_list *refs) +struct notes_tree **load_notes_trees(struct string_list *refs, int flags) { struct string_list_item *item; int counter = 0; @@ -1035,7 +1038,7 @@ struct notes_tree **load_notes_trees(struct string_list *refs) trees = xmalloc((refs->nr+1) * sizeof(struct notes_tree *)); 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); + init_notes(t, item->string, combine_notes_ignore, flags); trees[counter++] = t; } trees[counter] = NULL; @@ -1071,7 +1074,7 @@ void init_display_notes(struct display_notes_opt *opt) item->string); } - display_notes_trees = load_notes_trees(&display_notes_refs); + display_notes_trees = load_notes_trees(&display_notes_refs, 0); string_list_clear(&display_notes_refs, 0); } @@ -1303,3 +1306,13 @@ void expand_notes_ref(struct strbuf *sb) else strbuf_insert(sb, 0, "refs/notes/", 11); } + +void expand_loose_notes_ref(struct strbuf *sb) +{ + unsigned char object[20]; + + if (get_sha1(sb->buf, object)) { + /* fallback to expand_notes_ref */ + expand_notes_ref(sb); + } +} diff --git a/notes.h b/notes.h index 2a3f923380..5345642cfd 100644 --- a/notes.h +++ b/notes.h @@ -44,6 +44,7 @@ extern struct notes_tree { struct int_node *root; struct non_note *first_non_note, *prev_non_note; char *ref; + char *update_ref; combine_notes_fn combine_notes; int initialized; int dirty; @@ -71,6 +72,13 @@ const char *default_notes_ref(void); */ #define NOTES_INIT_EMPTY 1 +/* + * By default, the notes tree is only readable, and the notes ref can be + * any treeish. The notes tree can however be made writable with this flag, + * in which case only strict ref names can be used. + */ +#define NOTES_INIT_WRITABLE 2 + /* * Initialize the given notes_tree with the notes tree structure at the given * ref. If given ref is NULL, the value of the $GIT_NOTES_REF environment @@ -276,7 +284,7 @@ void format_display_notes(const unsigned char *object_sha1, * Load the notes tree from each ref listed in 'refs'. The output is * an array of notes_tree*, terminated by a NULL. */ -struct notes_tree **load_notes_trees(struct string_list *refs); +struct notes_tree **load_notes_trees(struct string_list *refs, int flags); /* * Add all refs that match 'glob' to the 'list'. @@ -294,4 +302,11 @@ void string_list_add_refs_from_colon_sep(struct string_list *list, /* Expand inplace a note ref like "foo" or "notes/foo" into "refs/notes/foo" */ void expand_notes_ref(struct strbuf *sb); +/* + * Similar to expand_notes_ref, but will check whether the ref can be located + * via get_sha1 first, and only falls back to expand_notes_ref in the case + * where get_sha1 fails. + */ +void expand_loose_notes_ref(struct strbuf *sb); + #endif diff --git a/pack-bitmap.c b/pack-bitmap.c index cb9c622803..dd8dc16e67 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -33,9 +33,6 @@ static struct bitmap_index { /* Packfile to which this bitmap index belongs to */ struct packed_git *pack; - /* reverse index for the packfile */ - struct pack_revindex *reverse_index; - /* * Mark the first `reuse_objects` in the packfile as reused: * they will be sent as-is without using them for repacking @@ -308,7 +305,7 @@ static int load_pack_bitmap(void) bitmap_git.bitmaps = kh_init_sha1(); bitmap_git.ext_index.positions = kh_init_sha1_pos(); - bitmap_git.reverse_index = revindex_for_pack(bitmap_git.pack); + load_pack_revindex(bitmap_git.pack); if (!(bitmap_git.commits = read_bitmap_1(&bitmap_git)) || !(bitmap_git.trees = read_bitmap_1(&bitmap_git)) || @@ -380,7 +377,7 @@ static inline int bitmap_position_packfile(const unsigned char *sha1) if (!offset) return -1; - return find_revindex_position(bitmap_git.reverse_index, offset); + return find_revindex_position(bitmap_git.pack, offset); } static int bitmap_position(const unsigned char *sha1) @@ -630,7 +627,7 @@ static void show_objects_for_type( if (pos + offset < bitmap_git.reuse_objects) continue; - entry = &bitmap_git.reverse_index->revindex[pos + offset]; + entry = &bitmap_git.pack->revindex[pos + offset]; sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); if (bitmap_git.hashes) @@ -804,7 +801,7 @@ int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, return -1; bitmap_git.reuse_objects = *entries = reuse_objects; - *up_to = bitmap_git.reverse_index->revindex[reuse_objects].offset; + *up_to = bitmap_git.pack->revindex[reuse_objects].offset; *packfile = bitmap_git.pack; return 0; @@ -1038,7 +1035,7 @@ int rebuild_existing_bitmaps(struct packing_data *mapping, struct revindex_entry *entry; struct object_entry *oe; - entry = &bitmap_git.reverse_index->revindex[i]; + entry = &bitmap_git.pack->revindex[i]; sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); oe = packlist_find(mapping, sha1, NULL); diff --git a/pack-revindex.c b/pack-revindex.c index e542ea7703..155a8a3d69 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -8,52 +8,13 @@ * size is easily available by examining the pack entry header). It is * also rather expensive to find the sha1 for an object given its offset. * - * We build a hashtable of existing packs (pack_revindex), and keep reverse - * index here -- pack index file is sorted by object name mapping to offset; - * this pack_revindex[].revindex array is a list of offset/index_nr pairs + * The pack index file is sorted by object name mapping to offset; + * this revindex array is a list of offset/index_nr pairs * ordered by offset, so if you know the offset of an object, next offset * is where its packed representation ends and the index_nr can be used to * get the object sha1 from the main index. */ -static struct pack_revindex *pack_revindex; -static int pack_revindex_hashsz; - -static int pack_revindex_ix(struct packed_git *p) -{ - unsigned long ui = (unsigned long)(intptr_t)p; - int i; - - ui = ui ^ (ui >> 16); /* defeat structure alignment */ - i = (int)(ui % pack_revindex_hashsz); - while (pack_revindex[i].p) { - if (pack_revindex[i].p == p) - return i; - if (++i == pack_revindex_hashsz) - i = 0; - } - return -1 - i; -} - -static void init_pack_revindex(void) -{ - int num; - struct packed_git *p; - - for (num = 0, p = packed_git; p; p = p->next) - num++; - if (!num) - return; - pack_revindex_hashsz = num * 11; - pack_revindex = xcalloc(pack_revindex_hashsz, sizeof(*pack_revindex)); - for (p = packed_git; p; p = p->next) { - num = pack_revindex_ix(p); - num = - 1 - num; - pack_revindex[num].p = p; - } - /* revindex elements are lazily initialized */ -} - /* * This is a least-significant-digit radix sort. * @@ -154,14 +115,13 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max) /* * Ordered list of offsets of objects in the pack. */ -static void create_pack_revindex(struct pack_revindex *rix) +static void create_pack_revindex(struct packed_git *p) { - struct packed_git *p = rix->p; unsigned num_ent = p->num_objects; unsigned i; const char *index = p->index_data; - rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1)); + p->revindex = xmalloc(sizeof(*p->revindex) * (num_ent + 1)); index += 4 * 256; if (p->index_version > 1) { @@ -171,55 +131,42 @@ static void create_pack_revindex(struct pack_revindex *rix) for (i = 0; i < num_ent; i++) { uint32_t off = ntohl(*off_32++); if (!(off & 0x80000000)) { - rix->revindex[i].offset = off; + p->revindex[i].offset = off; } else { - rix->revindex[i].offset = + p->revindex[i].offset = ((uint64_t)ntohl(*off_64++)) << 32; - rix->revindex[i].offset |= + p->revindex[i].offset |= ntohl(*off_64++); } - rix->revindex[i].nr = i; + p->revindex[i].nr = i; } } else { for (i = 0; i < num_ent; i++) { uint32_t hl = *((uint32_t *)(index + 24 * i)); - rix->revindex[i].offset = ntohl(hl); - rix->revindex[i].nr = i; + p->revindex[i].offset = ntohl(hl); + p->revindex[i].nr = i; } } /* This knows the pack format -- the 20-byte trailer * follows immediately after the last object data. */ - rix->revindex[num_ent].offset = p->pack_size - 20; - rix->revindex[num_ent].nr = -1; - sort_revindex(rix->revindex, num_ent, p->pack_size); + p->revindex[num_ent].offset = p->pack_size - 20; + p->revindex[num_ent].nr = -1; + sort_revindex(p->revindex, num_ent, p->pack_size); } -struct pack_revindex *revindex_for_pack(struct packed_git *p) +void load_pack_revindex(struct packed_git *p) { - int num; - struct pack_revindex *rix; - - if (!pack_revindex_hashsz) - init_pack_revindex(); - - num = pack_revindex_ix(p); - if (num < 0) - die("internal error: pack revindex fubar"); - - rix = &pack_revindex[num]; - if (!rix->revindex) - create_pack_revindex(rix); - - return rix; + if (!p->revindex) + create_pack_revindex(p); } -int find_revindex_position(struct pack_revindex *pridx, off_t ofs) +int find_revindex_position(struct packed_git *p, off_t ofs) { int lo = 0; - int hi = pridx->p->num_objects + 1; - struct revindex_entry *revindex = pridx->revindex; + int hi = p->num_objects + 1; + struct revindex_entry *revindex = p->revindex; do { unsigned mi = lo + (hi - lo) / 2; @@ -237,11 +184,13 @@ int find_revindex_position(struct pack_revindex *pridx, off_t ofs) struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs) { - struct pack_revindex *pridx = revindex_for_pack(p); - int pos = find_revindex_position(pridx, ofs); + int pos; + + load_pack_revindex(p); + pos = find_revindex_position(p, ofs); if (pos < 0) return NULL; - return pridx->revindex + pos; + return p->revindex + pos; } diff --git a/pack-revindex.h b/pack-revindex.h index d737f98965..e262f3efe8 100644 --- a/pack-revindex.h +++ b/pack-revindex.h @@ -1,18 +1,15 @@ #ifndef PACK_REVINDEX_H #define PACK_REVINDEX_H +struct packed_git; + struct revindex_entry { off_t offset; unsigned int nr; }; -struct pack_revindex { - struct packed_git *p; - struct revindex_entry *revindex; -}; - -struct pack_revindex *revindex_for_pack(struct packed_git *p); -int find_revindex_position(struct pack_revindex *pridx, off_t ofs); +void load_pack_revindex(struct packed_git *p); +int find_revindex_position(struct packed_git *p, off_t ofs); struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs); diff --git a/path.c b/path.c index 3cd155e27d..8b7e168129 100644 --- 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)) { diff --git a/perl/Git.pm b/perl/Git.pm index 19ef081103..49eb88af8d 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -188,7 +188,8 @@ sub repository { }; if ($dir) { - $dir =~ m#^/# or $dir = $opts{Directory} . '/' . $dir; + _verify_require(); + File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir; $opts{Repository} = abs_path($dir); # If --git-dir went ok, this shouldn't die either. diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm index 4a499fcb38..e764696801 100644 --- a/perl/Git/SVN/Ra.pm +++ b/perl/Git/SVN/Ra.pm @@ -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, diff --git a/po/TEAMS b/po/TEAMS index 5e1f7e0b50..df12b5819c 100644 --- a/po/TEAMS +++ b/po/TEAMS @@ -32,6 +32,10 @@ Repository: https://github.com/quizzlo/git-po-it/ Leader: Marco Paolone Members: Stefano Lattarini +Language: ko (Korean) +Repository: https://github.com/changwoo/git-l10n-ko/ +Leader: Changwoo Ryu + Language: pt_PT (Portuguese - Portugal) Repository: https://github.com/marcomsousa/git-l10n-pt_PT/ Leader: Marco Sousa diff --git a/po/ko.po b/po/ko.po new file mode 100644 index 0000000000..8ec0eac134 --- /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 , 2015. +# Changwoo Ryu , 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 \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 \n" +"Language-Team: Git Korean translation \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 '\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 [] [...]" +msgstr "git archive [<옵션>] <트리-따위> [<경로>...]" + +#: archive.c:13 +msgid "git archive --list" +msgstr "git archive --list" + +#: archive.c:14 +msgid "" +"git archive --remote [--exec ] [] [...]" +msgstr "" +"git archive --remote <저장소> [--exec <명령>] [<옵션>] <트리-따위> [<경로" +">...]" + +#: archive.c:15 +msgid "git archive --remote [--exec ] --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 " +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 " 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:)" +msgstr "예상한 형식: %%(color:<색>)" + +#: ref-filter.c:835 +msgid "unable to parse format" +msgstr "형식을 파싱할 수 없습니다" + +#: ref-filter.c:870 +#, c-format +msgid "expected format: %%(align:,)" +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 ' or 'git rm '" +msgstr "" +"이 충돌을 해결한 뒤에, 바로잡은 경로를\n" +"'git add <경로>' 또는 'git rm <경로>'로 표시하십시오" + +#: sequencer.c:186 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add ' or 'git rm '\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 ...\" to unstage)" +msgstr " (스테이지 해제하려면 \"git reset %s <파일>...\"을 사용하십시오)" + +#: wt-status.c:178 wt-status.c:205 +msgid " (use \"git rm --cached ...\" to unstage)" +msgstr " (스테이지 해제하려면 \"git rm --cached <파일>...\"을 사용하십시오)" + +#: wt-status.c:182 +msgid " (use \"git add ...\" to mark resolution)" +msgstr " (해결했다고 표시하려면 \"git add <파일>...\"을 사용하십시오)" + +#: wt-status.c:184 wt-status.c:188 +msgid " (use \"git add/rm ...\" as appropriate to mark resolution)" +msgstr "" +" (해결했다고 표시하려면 알맞게 \"git add/rm <파일>...\"을 사용하십시오)" + +#: wt-status.c:186 +msgid " (use \"git rm ...\" 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 ...\" to update what will be committed)" +msgstr " (무엇을 커밋할지 바꾸려면 \"git add <파일>...\"을 사용하십시오)" + +#: wt-status.c:221 +msgid " (use \"git add/rm ...\" to update what will be committed)" +msgstr " (무엇을 커밋할지 바꾸려면 \"git add/rm <파일>...\"을 사용하십시오)" + +#: wt-status.c:222 +msgid "" +" (use \"git checkout -- ...\" 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 ...\" 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 [] [--] ..." +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 [] [(|)...]" +msgstr "git am [<옵션>] [(|)...]" + +#: builtin/am.c:2254 +msgid "git am [] (--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 [] [...]" +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 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 lines of context match" +msgstr "최소한 줄이 컨텍스트와 일치하는지 확인합니다" + +#: 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 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 [] [] [] [--] " +msgstr "git blame [<옵션>] [<리비전-옵션>] [<리비전>] [--] <파일>" + +#: builtin/blame.c:37 +msgid " 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 instead of calling git-rev-list" +msgstr "git-rev-list를 호출하는 대신 <파일>에서 리비전을 사용합니다" + +#: builtin/blame.c:2536 +msgid "Use '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 [] [-r | -a] [--merged | --no-merged]" +msgstr "git branch [<옵션>] [-r | -a] [--merged | --no-merged]" + +#: builtin/branch.c:26 +msgid "git branch [] [-l] [-f] []" +msgstr "git branch [<옵션>] [-l] [-f] <브랜치-이름> [<시작-지점>]" + +#: builtin/branch.c:27 +msgid "git branch [] [-r] (-d | -D) ..." +msgstr "git branch [<옵션>] [-r] (-d | -D) <브랜치-이름>..." + +#: builtin/branch.c:28 +msgid "git branch [] (-m | -M) [] " +msgstr "git branch [<옵션>] (-m | -M) [<과거-브랜치>] <새-브랜치>" + +#: builtin/branch.c:29 +msgid "git branch [] [-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|" +"|--textconv) " +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 " 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 | ...] [--] ..." +msgstr "git check-attr [-a | --all | <속성>...] [--] <경로이름>..." + +#: builtin/check-attr.c:12 +msgid "git check-attr --stdin [-z] [-a | --all | ...]" +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 [] ..." +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 [] [--] [...]" +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 " +msgstr "파일을 만들 때, 앞에 <문자열>을 붙입니다" + +#: builtin/checkout-index.c:208 +msgid "copy out the files from named stage" +msgstr "지정한 스테이지에서 파일을 복사해 옵니다" + +#: builtin/checkout.c:25 +msgid "git checkout [] " +msgstr "git checkout [<옵션>] <브랜치>" + +#: builtin/checkout.c:26 +msgid "git checkout [] [] -- ..." +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 %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 %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 '" +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 ] [-x | -X] [--] ..." +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 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 [] [--] []" +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 instead of 'origin' to track upstream" +msgstr "업스트림 추적에 'origin' 대신 <이름>을 사용합니다" + +#: builtin/clone.c:84 +msgid "checkout 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 []" +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 [] [--] ..." +msgstr "git commit [<옵션>] [--] <경로명세>..." + +#: builtin/commit.c:43 +msgid "git status [] [--] ..." +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 ' 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 []" +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 "에 특정되는 값을 가져옵니다: <섹션>[.<변수>] " + +#: 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 [] [...]" +msgstr "git describe [<옵션>] [<커밋-따위>...]" + +#: builtin/describe.c:18 +msgid "git describe [] --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 most recent tags (default: 10)" +msgstr "개의 가장 최근의 태그만 고려합니다 (기본값: 10)" + +#: builtin/describe.c:408 +msgid "only consider tags matching " +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 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 objects" +msgstr "오브젝트 개 뒤에 진행 상황을 표시합니다" + +#: 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 [] [ [...]]" +msgstr "git fetch [<옵션>] [<저장소> [<레퍼런스명세>...]]" + +#: builtin/fetch.c:21 +msgid "git fetch [] " +msgstr "git fetch [<옵션>] <그룹>" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [] [( | )...]" +msgstr "git fetch --multiple [<옵션>] [(<저장소> | <그룹>)...]" + +#: builtin/fetch.c:23 +msgid "git fetch --all []" +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 ] [--log[=] | --no-log] [--file ]" +msgstr "" +"git fmt-merge-msg [-m <메시지>] [--log[=] | --no-log] [--file <파일>]" + +#: builtin/fmt-merge-msg.c:667 +msgid "populate log with at most entries from shortlog" +msgstr "shortlog에서 최대 개 로그를 표시합니다" + +#: 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 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 [] []" +msgstr "git for-each-ref [<옵션>] [<패턴>]" + +#: builtin/for-each-ref.c:10 +msgid "git for-each-ref [--points-at ]" +msgstr "git for-each-ref [--points-at <오브젝트>]" + +#: builtin/for-each-ref.c:11 +msgid "git for-each-ref [(--merged | --no-merged) []]" +msgstr "git for-each-ref [(--merged | --no-merged) [<오브젝트>]]" + +#: builtin/for-each-ref.c:12 +msgid "git for-each-ref [--contains []]" +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 matched refs" +msgstr "개의 해당하는 레퍼런스만 표시합니다" + +#: 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 [] [...]" +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 []" +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 % (use --force if not)" +msgstr "가비지컬렉터가 이미 '%s' 컴퓨터에서 % 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 [] [-e] [...] [[--] ...]" +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 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 context lines before and after matches" +msgstr "일치하는 부분 앞뒤에 컨텍스트를 줄 표시합니다" + +#: builtin/grep.c:697 +msgid "show context lines before matches" +msgstr "일치하는 부분 앞에 컨텍스트를 줄 표시합니다" + +#: builtin/grep.c:699 +msgid "show context lines after matches" +msgstr "일치하는 부분 뒤에 컨텍스트를 줄 표시합니다" + +#: 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 " +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 ] [-w] [--path= | --no-filters] [--stdin] " +"[--] ..." +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] []" +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..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..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 % unsupported" +msgstr "묶음의 % 버전을 지원하지 않습니다" + +#: 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=%" +msgstr "잘못된 pack.indexversion=%" + +#: 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=] [--" +"shared[=]] []" +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=) not allowed without specifying %s (or --git-" +"dir=)" +msgstr "" +"%s (또는 --work-tree=<디렉터리>) 허용되지 않음. %s (또는 --git-" +"dir=) 지정이 없으면" + +#: 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 [(=|:)])...] " +"[...]" +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 [] [] [[--] ...]" +msgstr "git log [<옵션>] [<리비전-범위>] [[--] <경로>...]" + +#: builtin/log.c:44 +msgid "git show [] ..." +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 [] [ | ]" +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 instead of '.patch'" +msgstr "'.patch' 대신 <확장자>를 사용합니다" + +#: builtin/log.c:1226 +msgid "start numbering patches at instead of 1" +msgstr "패치 번호를 1 대신 에서 시작합니다" + +#: builtin/log.c:1228 +msgid "mark the series as Nth re-roll" +msgstr "시리즈를 N번째 re-roll로 표시합니다" + +#: builtin/log.c:1230 +msgid "Use [] instead of [PATCH]" +msgstr "[PATCH] 대신 [<접두어>]를 사용합니다" + +#: builtin/log.c:1233 +msgid "store resulting files in " +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 (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 " +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] [ [ []]]" +msgstr "git cherry [-v] [<업스트림> [<헤드> [<한계값>]]]" + +#: builtin/log.c:1665 +#, c-format +msgid "" +"Could not find a tracked remote branch, please specify 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 [] [...]" +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 " +msgstr "제외할 패턴을 <파일>에서 읽습니다" + +#: builtin/ls-files.c:450 +msgid "read additional per-directory exclude patterns in " +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 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 are still present" +msgstr "<트리-따위> 뒤로 제거한 경로가 있다고 가정합니다" + +#: builtin/ls-files.c:462 +msgid "show debugging data" +msgstr "디버깅 데이터를 표시합니다" + +#: builtin/ls-tree.c:28 +msgid "git ls-tree [] [...]" +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 [] [...]" +msgstr "git merge [<옵션>] [<커밋>...]" + +#: builtin/merge.c:46 +msgid "git merge [] HEAD " +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 ) entries from shortlog to merge commit message" +msgstr "병합 커밋의 메시지에 shortlog 항목을 (최대 개) 추가합니다" + +#: 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] ..." +msgstr "git merge-base [-a | --all] <커밋> <커밋>..." + +#: builtin/merge-base.c:30 +msgid "git merge-base [-a | --all] --octopus ..." +msgstr "git merge-base [-a | --all] --octopus <커밋>..." + +#: builtin/merge-base.c:31 +msgid "git merge-base --independent ..." +msgstr "git merge-base --independent <커밋>..." + +#: builtin/merge-base.c:32 +msgid "git merge-base --is-ancestor " +msgstr "git merge-base --is-ancestor <커밋> <커밋>" + +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point []" +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 forked from reflog of " +msgstr "<레퍼런스>의 reflog에서 <커밋>이 분리된 위치를 찾습니다" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [] [-L [-L [-L ]]] " +" " +msgstr "git merge-file [<옵션>] [-L <이름1> [-L [-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 [] ... " +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 [] ..." +msgstr "git name-rev [<옵션>] <커밋>..." + +#: builtin/name-rev.c:252 +msgid "git name-rev [] --all" +msgstr "git name-rev [<옵션>] --all" + +#: builtin/name-rev.c:253 +msgid "git name-rev [] --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 " +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 ] [list []]" +msgstr "git notes [--ref <노트-레퍼런스>] [list [<오브젝트>]]" + +#: builtin/notes.c:26 +msgid "" +"git notes [--ref ] add [-f] [--allow-empty] [-m | -F " +"| (-c | -C) ] []" +msgstr "" +"git notes [--ref ] add [-f] [--allow-empty] [-m <메시지> | -F <파" +"일> | (-c | -C) <오브젝트>] [<오브젝트>]" + +#: builtin/notes.c:27 +msgid "git notes [--ref ] copy [-f] " +msgstr "git notes [--ref <노트-레퍼런스>] copy [-f] <원본-오브젝트> <대상-오브젝트>" + +#: builtin/notes.c:28 +msgid "" +"git notes [--ref ] append [--allow-empty] [-m | -F | " +"(-c | -C) ] []" +msgstr "" +"git notes [--ref <쪽지-레퍼런스>] append [--allow-empty] [-m <메시지> | -F <" +"파일> | (-c | -C) <오브젝트>] [<오브젝트>]" + +#: builtin/notes.c:29 +msgid "git notes [--ref ] edit [--allow-empty] []" +msgstr "git notes [--ref <쪽지-레퍼런스>] edit [--allow-empty] [<오브젝트>]" + +#: builtin/notes.c:30 +msgid "git notes [--ref ] show []" +msgstr "git notes [--ref ] show [<오브젝트>]" + +#: builtin/notes.c:31 +msgid "" +"git notes [--ref ] merge [-v | -q] [-s ] " +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 ] remove [...]" +msgstr "git notes [--ref <노트-레퍼런스>] remove [<오브젝트>...]" + +#: builtin/notes.c:35 +msgid "git notes [--ref ] prune [-n | -v]" +msgstr "git notes [--ref <노트-레퍼런스>] prune [-n | -v]" + +#: builtin/notes.c:36 +msgid "git notes [--ref ] get-ref" +msgstr "git notes [--ref <노트-레퍼런스>] get-ref" + +#: builtin/notes.c:41 +msgid "git notes [list []]" +msgstr "git notes [list [<오브젝트>]]" + +#: builtin/notes.c:46 +msgid "git notes add [] []" +msgstr "git notes add [<옵션>] [<오브젝트>]" + +#: builtin/notes.c:51 +msgid "git notes copy [] " +msgstr "git notes copy [<옵션>] <원본-오브젝트> <대상-오브젝트>" + +#: builtin/notes.c:52 +msgid "git notes copy --stdin [ ]..." +msgstr "git notes copy --stdin [<원본-오브젝트> <대상-오브젝트>]..." + +#: builtin/notes.c:57 +msgid "git notes append [] []" +msgstr "git notes append [<옵션>] [<오브젝트>]" + +#: builtin/notes.c:62 +msgid "git notes edit []" +msgstr "git notes edit [<오브젝트>]" + +#: builtin/notes.c:67 +msgid "git notes show []" +msgstr "git notes show [<오브젝트>]" + +#: builtin/notes.c:72 +msgid "git notes merge [] " +msgstr "git notes merge [<옵션>] <쪽지-레퍼런스>" + +#: builtin/notes.c:73 +msgid "git notes merge --commit []" +msgstr "git notes merge --commit [<옵션>]" + +#: builtin/notes.c:74 +msgid "git notes merge --abort []" +msgstr "git notes merge --abort [<옵션>]" + +#: builtin/notes.c:79 +msgid "git notes remove []" +msgstr "git notes remove [<오브젝트>]" + +#: builtin/notes.c:84 +msgid "git notes prune []" +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 (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 " +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 [...] [< | < ]" +msgstr "" +"git pack-objects --stdout [<옵션>...] [< <레퍼런스목록> | < <오브젝트목록>]" + +#: builtin/pack-objects.c:29 +msgid "" +"git pack-objects [...] [< | < ]" +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