From: Junio C Hamano <gitster@pobox.com> Date: Wed, 3 Feb 2016 22:16:07 +0000 (-0800) Subject: Merge branch 'ls/travis-prove-order' X-Git-Tag: v2.8.0-rc0~70 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/48c39e98c6aff98b5dd165435373e517780302ad?hp=ce59dffb34190e780be2fa9f449f842cadee9753 Merge branch 'ls/travis-prove-order' 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. * ls/travis-prove-order: travis-ci: explicity use container-based infrastructure travis-ci: run previously failed tests first, then slowest to fastest --- diff --git a/Documentation/RelNotes/2.8.0.txt b/Documentation/RelNotes/2.8.0.txt new file mode 100644 index 0000000000..1a0fcb2027 --- /dev/null +++ b/Documentation/RelNotes/2.8.0.txt @@ -0,0 +1,177 @@ +Git 2.8 Release Notes +===================== + +Updates since v2.7 +------------------ + +UI, Workflows & Features + + * "branch --delete" has "branch -d" but "push --delete" does not. + (merge 38a2559 ps/push-delete-option later to maint). + + * "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=<note>", 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 <dir>" 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. + + +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). + + +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). + + * 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). 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|<num>|:: 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 f61788668e..877cbc875e 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -870,6 +870,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 +1245,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.<driver>.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 +1456,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 @@ -2149,6 +2163,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). 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=<depth>:: - Deepen or shorten the history of a 'shallow' repository created by - `git clone` with `--depth=<depth>` option (see linkgit:git-clone[1]) - to the specified number of commits from the tip of each remote - branch history. Tags for the deepened commits are not fetched. + Limit fetching to the specified number of commits from the tip of + each remote branch history. If fetching to a 'shallow' repository + created by `git clone` with `--depth=<depth>` option (see + linkgit:git-clone[1]), deepen or shorten the history to the specified + number of commits. Tags for the deepened commits are not fetched. --unshallow:: If the source repository is complete, convert a shallow @@ -100,6 +101,13 @@ ifndef::git-pull[] reference to a commit that isn't already in the local submodule clone. +-j:: +--jobs=<n>:: + 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 <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] - [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] [--] <file> + [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] + [--] <file> DESCRIPTION ----------- 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[<keyid>]:: --gpg-sign[=<keyid>]:: diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 6bf000dac3..789b668f77 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -190,15 +190,14 @@ objects from the source repository into a pack in the cloned repository. --depth <depth>:: Create a 'shallow' clone with a history truncated to the - specified number of revisions. + specified number of commits. Implies `--single-branch` unless + `--no-single-branch` is given to fetch the histories near the + tips of all branches. --[no-]single-branch:: Clone only the history leading to the tip of a single branch, either specified by the `--branch` option or the primary - branch remote's `HEAD` points at. When creating a shallow - clone with the `--depth` option, this is the default, unless - `--no-single-branch` is given to fetch the histories near the - tips of all branches. + branch remote's `HEAD` points at. Further fetches into the resulting repository will only update the remote-tracking branch for the branch this option was used for the initial cloning. If the HEAD at the remote did not point at any 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=<N>` is appended, strips `<N>` + slash-separated path components from the front of the refname + (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`. + `<N>` must be a positive integer. If a displayed ref has fewer + components than `<N>`, the command aborts with an error. objecttype:: The type of the object (`blob`, `tree`, `commit`, `tag`). @@ -142,6 +146,11 @@ In addition to the above, for commit and tag objects, the header field names (`tree`, `parent`, `object`, `type`, and `tag`) can be used to specify the value in the header field. +For commit and tag objects, the special `creatordate` and `creator` +fields will correspond to the appropriate date or name-email-date tuple +from the `committer` or `tagger` fields depending on the object type. +These are intended for working on a mix of annotated and lightweight tags. + Fields that have name-email-date tuple as its value (`author`, `committer`, and `tagger`) can be suffixed with `name`, `email`, and `date` to extract the named component. @@ -153,8 +162,8 @@ line is 'contents:body', where body is all of the lines after the first blank line. The optional GPG signature is `contents:signature`. The first `N` lines of the message is obtained using `contents:lines=N`. -For sorting purposes, fields with numeric values sort in numeric -order (`objectsize`, `authordate`, `committerdate`, `taggerdate`). +For sorting purposes, fields with numeric values sort in numeric order +(`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`). All other fields are used to sort in their byte-value order. There is also an option to sort by versions, this can be done by using 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 <dir>. 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 <post-context>] [-B <pre-context>] [-C <context>] [-W | --function-context] + [--threads <num>] [-f <file>] [-e] <pattern> [--and|--or|--not|(|)|-e <pattern>...] [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...] @@ -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 <num>:: + Number of grep worker threads to use. + See `grep.threads` in 'CONFIGURATION' for more information. + -f <file>:: Read patterns from <file>, 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 <token>[(=|:)<value>])...] [<file>...] +'git interpret-trailers' [--in-place] [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...] 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 <value> 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 <alice@example.com> Signed-off-by: Bob <bob@example.com> ------------ +* Use the '--in-place' option to edit a message file in place: ++ +------------ +$ cat msg.txt +subject + +message + +Signed-off-by: Bob <bob@example.com> +$ git interpret-trailers --trailer 'Acked-by: Alice <alice@example.com>' --in-place msg.txt +$ cat msg.txt +subject + +message + +Signed-off-by: Bob <bob@example.com> +Acked-by: Alice <alice@example.com> +------------ + * 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 <pattern>|--exclude=<pattern>] [-X <file>|--exclude-from=<file>] [--exclude-per-directory=<file>] @@ -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 <eolinfo> and <eolattr> of files. + <eolinfo> is the file content identification used by Git when + the "text" attribute is "auto" (or not set and core.autocrlf is not false). + <eolinfo> 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. ++ +<eolattr> 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 <eolinfo> in the index ("i/<eolinfo>") +and in the working tree ("w/<eolinfo>") are shown for regular files, +followed by the ("attr/<eolattr>"). + \--:: Do not interpret any more arguments as options. @@ -161,6 +180,9 @@ which case it outputs: [<tag> ]<mode> <object> <stage> <file> +'git ls-files --eol' will show + i/<eolinfo><SPACES>w/<eolinfo><SPACES>attr/<eolattr><SPACE*><TAB><file> + '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=<exec>] - [--exit-code] <repository> [<refs>...] +'git ls-remote' [--heads] [--tags] [--refs] [--upload-pack=<exec>] + [-q | --quiet] [--exit-code] [--get-url] + [--symref] [<repository> [<refs>...]] 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=<exec>:: 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.<base>.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. + <repository>:: 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.<name>.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=<git-receive-pack>] - [--repo=<repository>] [-f | --force] [--prune] [-v | --verbose] + [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream] [--[no-]signed|--sign=(true|false|if-asked)] [--force-with-lease[=<refname>[:<expect>]]] 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=<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 [<commit>]:: Only list tags whose tips are reachable, or not reachable 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/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_object_name,object name>>. +[[def_shallow_clone]]shallow clone:: + Mostly a synonym to <<def_shallow_repository,shallow repository>> + but the phrase makes it more explicit that it was created by + running `git clone --depth=...` command. + [[def_shallow_repository]]shallow repository:: A shallow <<def_repository,repository>> has an incomplete history some of whose <<def_commit,commits>> have <<def_parent,parents>> cauterized away (in other 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[=<ref>]:: +--notes[=<treeish>]:: 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 '<ref>' argument, show this notes ref instead of the -default notes ref(s). The ref specifies the full refname when it begins +With an optional '<treeish>' 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[=<ref>]:: +--show-notes[=<treeish>]:: --[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..fa4bdb208c 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'. -'<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}':: +'<refname>@{<date>}', 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/<ref>'). 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'. -'<refname>@\{<n>\}', e.g. 'master@\{1\}':: +'<refname>@{<n>}', 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/<refname>'). -'@\{<n>\}', e.g. '@\{1\}':: +'@{<n>}', 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\}'. -'@\{-<n>\}', e.g. '@\{-1\}':: - The construct '@\{-<n>\}' means the <n>th branch/commit checked out +'@{-<n>}', e.g. '@{-1}':: + The construct '@{-<n>}' means the <n>th branch/commit checked out before the current one. '<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}':: @@ -139,7 +139,7 @@ from one location and push to another. In a non-triangular workflow, '<rev>{caret}1{caret}1{caret}1'. See below for an illustration of the usage of this form. -'<rev>{caret}\{<type>\}', e.g. 'v0.99.8{caret}\{commit\}':: +'<rev>{caret}{<type>}', 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 '<rev>' recursively until an object of type '<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. -'<rev>{caret}\{\}', e.g. 'v0.99.8{caret}\{\}':: +'<rev>{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. -'<rev>{caret}\{/<text>\}', e.g. 'HEAD^{/fix nasty bug}':: +'<rev>{caret}{/<text>}', 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 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 <<def_shallow_clone,shallow clone>>, with its truncated +history, is useful when one is interested only in recent history +of a project and getting full history from the upstream is +expensive. + +A <<def_shallow_clone,shallow clone>> is created by specifying +the linkgit:git-clone[1] `--depth` switch. The depth can later be +changed with the linkgit:git-fetch[1] `--depth` switch, or full +history restored with `--unshallow`. + +Merging inside a <<def_shallow_clone,shallow clone>> will work as long +as a merge base is in the recent history. +Otherwise, it will be like merging unrelated histories and may +have to result in huge conflicts. This limitation may make such +a repository unsuitable to be used in merge based workflows. [[sharing-development-examples]] Examples @@ -4636,23 +4665,15 @@ Scan email archives for other stuff left out Scan man pages to see if any assume more background than this manual provides. -Simplify beginning by suggesting disconnected head instead of -temporary branch creation? - Add more good examples. Entire sections of just cookbook examples might be a good idea; maybe make an "advanced examples" section a standard end-of-chapter section? Include cross-references to the glossary, where appropriate. -Document shallow clones? See draft 1.5.0 release notes for some -documentation. - Add a section on working with other version control systems, including CVS, Subversion, and just imports of series of release tarballs. -More details on gitweb? - Write a chapter on using plumbing and writing scripts. Alternates, clone -reference, etc. 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..fc2f1ab2c3 100644 --- a/Makefile +++ b/Makefile @@ -2025,6 +2025,7 @@ $(VCSSVN_LIB): $(VCSSVN_OBJS) export DEFAULT_EDITOR DEFAULT_PAGER +.PHONY: doc man html info pdf doc: $(MAKE) -C Documentation all @@ -2068,6 +2069,7 @@ po/git.pot: $(GENERATED_H) FORCE $(LOCALIZED_PERL) mv $@+ $@ +.PHONY: pot pot: po/git.pot POFILES := $(wildcard po/*.po) @@ -2277,6 +2279,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 +2346,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 +2407,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 +2476,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 +2522,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/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 [<options>] [<rev-opts>] [<rev>] [--] <file>"); @@ -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..087325ef69 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -73,12 +73,13 @@ 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_getline_fn getline_fn; + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; strbuf_init(&buf, 0); strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { strbuf_reset(&nbuf); if (unquote_c_style(&nbuf, buf.buf, NULL)) die("line is badly quoted"); diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 43f361797a..4f0b09e2db 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -117,13 +117,14 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) { struct strbuf buf, nbuf; char *pathspec[2] = { NULL, NULL }; - int line_termination = nul_term_line ? 0 : '\n'; + strbuf_getline_fn getline_fn; int num_ignored = 0; + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; strbuf_init(&buf, 0); strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { strbuf_reset(&nbuf); if (unquote_c_style(&nbuf, buf.buf, NULL)) die("line is badly quoted"); 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..ed888a5b9e 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; @@ -144,10 +145,7 @@ static int option_parse_u(const struct option *opt, static int option_parse_z(const struct option *opt, const char *arg, int unset) { - if (unset) - line_termination = '\n'; - else - line_termination = 0; + nul_term_line = !unset; return 0; } @@ -254,13 +252,15 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) if (read_from_stdin) { struct strbuf buf = STRBUF_INIT, nbuf = 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] == '"') { + if (!nul_term_line && buf.buf[0] == '"') { strbuf_reset(&nbuf); if (unquote_c_style(&nbuf, buf.buf, NULL)) die("line is badly quoted"); 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..cc5f9723de 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -594,7 +594,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 +676,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 +774,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 <n> context lines before matches")), OPT_INTEGER('A', "after-context", &opt.post_context, N_("show <n> context lines after matches")), + OPT_INTEGER(0, "threads", &num_threads, + N_("use <n> 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..ff20395c69 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -60,7 +60,7 @@ static void hash_stdin_paths(const char *type, int no_filters, unsigned flags, { struct strbuf buf = STRBUF_INIT, nbuf = 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)) 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 <token>[(=|:)<value>])...] [<file>...]"), + N_("git interpret-trailers [--in-place] [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]"), 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..dedf02dc70 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; @@ -433,6 +453,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=<exec>]\n" -" [-q | --quiet] [--exit-code] [--get-url] [<repository> [<refs>...]]"; +static const char * const ls_remote_usage[] = { + N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" + " [-q | --quiet] [--exit-code] [--get-url]\n" + " [--symref] [<repository> [<refs>...]]"), + 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.<base>.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: (<short>|<short>,<long>|<long>)[*=?!]*<arghint>? SP+ <help> */ - 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 ? "<none>" : buffer); - strbuf_release(&ufbuf); - strbuf_release(&buf); + + insert_one_record(log, author.buf, oneline.len ? oneline.buf : "<none>"); + + 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..7c5c143de5 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -468,12 +468,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 +524,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 +846,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,7 +903,7 @@ 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 newfd, entries, has_errors = 0, nul_term_line = 0; int untracked_cache = -1; int read_from_stdin = 0; int prefix_length = prefix ? strlen(prefix) : 0; @@ -912,6 +914,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 +966,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}, @@ -1057,6 +1060,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) @@ -1073,9 +1078,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) struct strbuf buf = STRBUF_INIT, nbuf = 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] == '"') { + if (!nul_term_line && buf.buf[0] == '"') { strbuf_reset(&nbuf); if (unquote_c_style(&nbuf, buf.buf, NULL)) die("line is badly quoted"); 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..dfc459c063 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) @@ -1299,6 +1301,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; 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..77a51d3f72 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) @@ -691,13 +693,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]); @@ -1846,7 +1848,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 +1935,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) 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 <stdint.h> +#include <wchar.h> +typedef _sigset_t sigset_t; +#endif #include <winsock2.h> #include <ws2tcpip.h> +/* 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 <inttypes.h> +#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.mak.uname b/config.mak.uname index f34dcaad20..4b2e1b807f 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,34 @@ 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 = YesPlease + 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..15ebba51dc 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) @@ -2368,7 +2373,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 +2386,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 +2408,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..4bb4ec1d83 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; } @@ -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..29aec12487 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; } diff --git a/environment.c b/environment.c index 2da7fe2e06..1cc4aab4ea 100644 --- a/environment.c +++ b/environment.c @@ -235,8 +235,6 @@ void set_git_work_tree(const char *new_work_tree) } git_work_tree_initialized = 1; work_tree = xstrdup(real_path(new_work_tree)); - if (setenv(GIT_WORK_TREE_ENVIRONMENT, work_tree, 1)) - die("could not set GIT_WORK_TREE to '%s'", work_tree); } const char *get_git_work_tree(void) 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 <<! -Usage: `basename $0` git-gui-glossary.txt > git-gui-glossary.pot +Usage: $(basename $0) git-gui-glossary.txt > git-gui-glossary.pot ! exit 1; fi @@ -33,7 +33,7 @@ cat <<! msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: `date +'%Y-%m-%d %H:%M%z'`\n" +"POT-Creation-Date: $(date +'%Y-%m-%d %H:%M%z')\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" 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..da278c3d41 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 saved_env_before_alias; -static void save_env(void) +static void save_env_before_alias(void) { int i; - if (saved_environment) + if (saved_env_before_alias) return; - saved_environment = 1; + saved_env_before_alias = 1; orig_cwd = xgetcwd(); for (i = 0; i < ARRAY_SIZE(env_names); i++) { orig_env[i] = getenv(env_names[i]); @@ -41,13 +41,16 @@ 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)) + 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 (external_alias && + !strcmp(env_names[i], GIT_PREFIX_ENVIRONMENT)) + continue; if (orig_env[i]) setenv(env_names[i], orig_env[i], 1); else @@ -226,14 +229,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 +246,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 +295,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 +310,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 +391,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 +417,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 }, @@ -530,9 +532,13 @@ 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 + /* + * XXX: if we can figure out cases where it is _safe_ + * to do, we can avoid spawning a new process when + * saved_env_before_alias is true + * (i.e. setup_git_dir* has been run once) + */ + if (!saved_env_before_alias) exit(run_builtin(builtin, argc, argv)); } } @@ -590,7 +596,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/ident.c b/ident.c index daf7e1ea83..3da5556342 100644 --- a/ident.c +++ b/ident.c @@ -76,7 +76,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/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 <marcopaolone AT gmail.com> Members: Stefano Lattarini <stefano.lattarini AT gmail.com> +Language: ko (Korean) +Repository: https://github.com/changwoo/git-l10n-ko/ +Leader: Changwoo Ryu <cwryu@debian.org> + Language: pt_PT (Portuguese - Portugal) Repository: https://github.com/marcomsousa/git-l10n-pt_PT/ Leader: Marco Sousa <marcomsousa AT gmail.com> diff --git a/po/ko.po b/po/ko.po new file mode 100644 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 <yoloseem AT users.noreply.github.com>, 2015. +# Changwoo Ryu <cwryu@debian.org>, 2015-2016. +# +# - ìì ìë ì Contributors 목ë¡ì ì¶ê°í´ 주ì¸ì. +# - ë²ìíë©´ì 80컬ë¼ì ëì´ê°ì§ ìëë¡ í´ ì£¼ì¸ì. +# - ê°ë¥íí ìë¬¸ì´ 1ì¤ì´ë©´ 1ì¤ì ë¤ì´ê°ê² íê³ , ë¶ëì´íë©´ ê²½ì°ì ë°ë¼ +# ìë§ê² ì¤ë°ê¿í©ëë¤. (커맨ëë¼ì¸ì´ë©´ ì¤ë°ê¿íê³ ë¤ì ì¤ì í 2ê°) +# - ì©ì´ë ì¼ê´ì±ì ì§ì¼ 주ììì¤. +# - ì©ì´ê° ë°ëì´ì¼ íë¤ê³ ìê°íë©´ ê·¸ë ê² ë²ìí기 ì ì 충ë¶í ì견 êµíì +# íììì¤. +# - ì¼ë°ì ì¸ ë¬¸ì¥ìì ìì´ ë¨ì´ë¥¼ ê·¸ëë¡ ì°ì§ ììµëë¤. ìµìí ììí©ëë¤. +# - ìì¸ì ì¼ë¡ ëª ë ¹ì´ ë± ë¬¸ì ê·¸ëë¡ ê°ë¦¬í¤ë ê²½ì°ìë§ ì문 ê·¸ëë¡ ìëë¤. +# - ì: ì ì¤í¸ë¦¼ ì¶ì ì 'origin' ëì <ì´ë¦>ì ì¬ì©í©ëë¤ +# - ë²ìë ì©ì´ê° ê¹ ëª ë ¹ì´ì ì°ê´ëë ê²½ì°ìë ê´í¸ ìì ìëë¤. +# - ì: ëë리기(revert)ê° ì§í ì¤ì ëë¤ +# - ì©ì´: +# +--------------+----------------------------------------------+ +# | 3-way merge | 3-ë°©í¥ ë³í© | +# | author | ìì±ì | +# | bisect | ì´ë±ë¶ | +# | blob | ë¸ë¡ | +# | bundle | ë²ë¤ | +# | branch | ë¸ëì¹ | +# | cherry-pick | (커ë°) ë¹¼ì¤ê¸° | +# | commit | ì»¤ë° | +# | commit-ish | 커ë°-ë°ì | +# | committer | ì»¤ë¯¸í° | +# | conflict | 충ë | +# | fast-forward | ì ë°©í¥ ì§í | +# | head | í¤ë | +# | hook | í | +# | history | (커ë°) ë´ì | +# | Git | ê¹ | +# | log | ê¸°ë¡ | +# | merge | ë³í© | +# | note | ë ¸í¸ | +# | pack | 묶ì | +# | pathspec | ê²½ë¡ëª ì¸ | +# | rebase | ë¦¬ë² ì´ì¤ | +# | ref | ë í¼ë°ì¤ | +# | repo | ì ì¥ì | +# | remote | ë¦¬ëª¨í¸ (ì ì¥ì) | +# | reset | ì¬ì§ì | +# | revert | ëë리기 | +# | subcommand | íì ëª ë ¹ | +# | submodule | íì 모ë | +# | tree-ish | í¸ë¦¬-ë°ì | +# | working tree | ìì í´ë | +# +--------------+----------------------------------------------+ +# +msgid "" +msgstr "" +"Project-Id-Version: git\n" +"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" +"POT-Creation-Date: 2015-12-22 22:50+0800\n" +"PO-Revision-Date: 2016-01-03 18:50+0900\n" +"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n" +"Language-Team: Git Korean translation <http://github.com/changwoo/git-l10n-" +"ko>\n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: advice.c:55 +#, c-format +msgid "hint: %.*s\n" +msgstr "íí¸: %.*s\n" + +#: advice.c:88 +msgid "" +"Fix them up in the work tree, and then use 'git add/rm <file>'\n" +"as appropriate to mark resolution and make a commit." +msgstr "" +"ìì í´ëìì 문ì 를 ë°ë¡ì¡ì ë¤ì, 'git add/rm <íì¼>'ì ì ì í\n" +"ì¬ì©í´ í´ê²° íìíê³ ì»¤ë°íììì¤." + +#: advice.c:101 builtin/merge.c:1225 +msgid "You have not concluded your merge (MERGE_HEAD exists)." +msgstr "ë³í© ìì ì ë¤ ë§ì¹ì§ ìììµëë¤ (MERGE_HEAD íì¼ì´ ììµëë¤)." + +#: advice.c:103 +msgid "Please, commit your changes before merging." +msgstr "ë³í©í기 ì ì ë³ê²½ ì¬íì 커ë°íììì¤." + +#: advice.c:104 +msgid "Exiting because of unfinished merge." +msgstr "ë³í©ì ë§ì¹ì§ 못í기 ë문ì ëë©ëë¤." + +#: archive.c:12 +msgid "git archive [<options>] <tree-ish> [<path>...]" +msgstr "git archive [<ìµì >] <í¸ë¦¬-ë°ì> [<ê²½ë¡>...]" + +#: archive.c:13 +msgid "git archive --list" +msgstr "git archive --list" + +#: archive.c:14 +msgid "" +"git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]" +msgstr "" +"git archive --remote <ì ì¥ì> [--exec <ëª ë ¹>] [<ìµì >] <í¸ë¦¬-ë°ì> [<ê²½ë¡" +">...]" + +#: archive.c:15 +msgid "git archive --remote <repo> [--exec <cmd>] --list" +msgstr "git archive --remote <ì ì¥ì> [--exec <ëª ë ¹>] --list" + +#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "'%s' ê²½ë¡ëª ì¸ê° ì´ë¤ íì¼ê³¼ë ì¼ì¹íì§ ììµëë¤" + +#: archive.c:429 +msgid "fmt" +msgstr "íì" + +#: archive.c:429 +msgid "archive format" +msgstr "ìì¶ íì" + +#: archive.c:430 builtin/log.c:1229 +msgid "prefix" +msgstr "ì ëì´" + +#: archive.c:431 +msgid "prepend prefix to each pathname in the archive" +msgstr "ìì¹´ì´ë¸ì ê° ê²½ë¡ ì´ë¦ì ìì ì§ì í ê²½ë¡ë¥¼ ë¶ì ëë¤" + +#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536 +#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989 +#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446 +#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558 +#: builtin/read-tree.c:109 parse-options.h:153 +msgid "file" +msgstr "íì¼" + +#: archive.c:433 builtin/archive.c:89 +msgid "write the archive to this file" +msgstr "ìì¹´ì´ë¸ë¥¼ ì´ íì¼ì ìëë¤" + +#: archive.c:435 +msgid "read .gitattributes in working directory" +msgstr "ìì í´ëì .gitattributes를 ì½ìµëë¤" + +#: archive.c:436 +msgid "report archived files on stderr" +msgstr "ìì¹´ì´ë¸ì í¬í¨ë íì¼ì íì¤ì¤ë¥ë¡ íìí©ëë¤" + +#: archive.c:437 +msgid "store only" +msgstr "ì ì¥ë§ í기" + +#: archive.c:438 +msgid "compress faster" +msgstr "ë ë¹ ë¥´ê² ìì¶" + +#: archive.c:446 +msgid "compress better" +msgstr "ë ìê² ìì¶" + +#: archive.c:449 +msgid "list supported archive formats" +msgstr "ì§ìíë ìì¶ íìì 목ë¡ì íìí©ëë¤" + +#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77 +msgid "repo" +msgstr "ì ì¥ì" + +#: archive.c:452 builtin/archive.c:91 +msgid "retrieve the archive from remote repository <repo>" +msgstr "ì격 ì ì¥ì <ì ì¥ì>ìì ìì¹´ì´ë¸ë¥¼ ê°ì ¸ìµëë¤" + +#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479 +msgid "command" +msgstr "ëª ë ¹" + +#: archive.c:454 builtin/archive.c:93 +msgid "path to the remote git-upload-archive command" +msgstr "ì격 git-upload-archive ëª ë ¹ì ê²½ë¡" + +#: attr.c:265 +msgid "" +"Negative patterns are ignored in git attributes\n" +"Use '\\!' for literal leading exclamation." +msgstr "" +"git attributesìì ë°ë í¨í´ì 무ìë©ëë¤.\n" +"ìì ëëí를 ì°ë ¤ë©´ '\\!'를 ì¬ì©íììì¤." + +#: branch.c:61 +#, c-format +msgid "Not setting branch %s as its own upstream." +msgstr "%s ë¸ëì¹ë¥¼ ìì ì ì ì¤í¸ë¦¼ì¼ë¡ ì§ì íì§ ìì." + +#: branch.c:84 +#, c-format +msgid "Branch %s set up to track remote branch %s from %s by rebasing." +msgstr "" +"%s ë¸ëì¹ê° ë¦¬ë² ì´ì¤ë¥¼ íµí´ 리모í¸ì %s ë¸ëì¹ë¥¼ (%sìì) ë°ë¼ê°ëë¡ ì¤ì ëì" +"ìµëë¤." + +#: branch.c:85 +#, c-format +msgid "Branch %s set up to track remote branch %s from %s." +msgstr "%s ë¸ëì¹ê° 리모í¸ì %s ë¸ëì¹ë¥¼ (%sìì) ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:89 +#, c-format +msgid "Branch %s set up to track local branch %s by rebasing." +msgstr "" +"%s ë¸ëì¹ê° ë¦¬ë² ì´ì¤ë¥¼ íµí´ 리모í¸ì %s ë¸ëì¹ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:90 +#, c-format +msgid "Branch %s set up to track local branch %s." +msgstr "%s ë¸ëì¹ê° %s ë¸ëì¹ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:95 +#, c-format +msgid "Branch %s set up to track remote ref %s by rebasing." +msgstr "" +"%s ë¸ëì¹ê° ë¦¬ë² ì´ì¤ë¥¼ íµí´ 리모í¸ì %s ë í¼ë°ì¤ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:96 +#, c-format +msgid "Branch %s set up to track remote ref %s." +msgstr "%s ë¸ëì¹ê° 리모í¸ì %s ë í¼ë°ì¤ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:100 +#, c-format +msgid "Branch %s set up to track local ref %s by rebasing." +msgstr "" +"%s ë¸ëì¹ê° ë¦¬ë² ì´ì¤ë¥¼ íµí´ ë¡ì»¬ì %s ë í¼ë°ì¤ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:101 +#, c-format +msgid "Branch %s set up to track local ref %s." +msgstr "%s ë¸ëì¹ê° ë¡ì»¬ì %s ë í¼ë°ì¤ë¥¼ ë°ë¼ê°ëë¡ ì¤ì ëììµëë¤." + +#: branch.c:134 +#, c-format +msgid "Not tracking: ambiguous information for ref %s" +msgstr "ë°ë¼ê°ì§ ìì: %s ë í¼ë°ì¤ì ëí´ ì 매í ì ë³´" + +#: branch.c:163 +#, c-format +msgid "'%s' is not a valid branch name." +msgstr "'%s'ì(ë) ì¬ë°ë¥¸ ë¸ëì¹ ì´ë¦ì´ ìëëë¤." + +#: branch.c:168 +#, c-format +msgid "A branch named '%s' already exists." +msgstr "ì´ë¦ì´ '%s'ì¸ ë¸ëì¹ê° ì´ë¯¸ ììµëë¤." + +#: branch.c:176 +msgid "Cannot force update the current branch." +msgstr "íì¬ ë¸ëì¹ë¥¼ ê°ì ë¡ ì ë°ì´í¸í ì ììµëë¤." + +#: branch.c:196 +#, c-format +msgid "Cannot setup tracking information; starting point '%s' is not a branch." +msgstr "" +"ë°ë¼ê°ê¸° ì 보를 ì¤ì í ì ììµëë¤. ìì ìì¹ '%s'ì´(ê°) ë¸ëì¹ê° ìëëë¤." + +#: branch.c:198 +#, c-format +msgid "the requested upstream branch '%s' does not exist" +msgstr "ìì²í ì ì¤í¸ë¦¼ '%s' ë¸ëì¹ê° ììµëë¤" + +#: branch.c:200 +msgid "" +"\n" +"If you are planning on basing your work on an upstream\n" +"branch that already exists at the remote, you may need to\n" +"run \"git fetch\" to retrieve it.\n" +"\n" +"If you are planning to push out a new local branch that\n" +"will track its remote counterpart, you may want to use\n" +"\"git push -u\" to set the upstream config as you push." +msgstr "" +"\n" +"리모í¸ì ì´ë¯¸ ìë ì ì¤í¸ë¦¼ ë¸ëì¹ë¥¼ 기ë°ì¼ë¡ ìì íë ¤ë©´,\n" +"먼ì \"git fetch\"ë¡ ê°ì ¸ ë¦¬ëª¨í¸ ë¸ëì¹ë¥¼ ê°ì ¸ìµëë¤.\n" +"\n" +"ì ë¡ì»¬ ë¸ëì¹ë¥¼ 거기ì í´ë¹íë ë¦¬ëª¨í¸ ë¸ëì¹ë¡ pushíë ¤ë©´,\n" +"\"git push -u\"ë¡ pushíë ì ì¤í¸ë¦¼ì ì¤ì í ì ììµëë¤." + +#: branch.c:244 +#, c-format +msgid "Not a valid object name: '%s'." +msgstr "ì¬ë°ë¥¸ ì¤ë¸ì í¸ ì´ë¦ì´ ìëëë¤: '%s'." + +#: branch.c:264 +#, c-format +msgid "Ambiguous object name: '%s'." +msgstr "ì 매í ì¤ë¸ì í¸ ì´ë¦: '%s'." + +#: branch.c:269 +#, c-format +msgid "Not a valid branch point: '%s'." +msgstr "ì¬ë°ë¥¸ ë¸ëì¹ ìì¹ê° ìëëë¤: '%s'." + +#: branch.c:322 +#, c-format +msgid "'%s' is already checked out at '%s'" +msgstr "'%s'ì(ë) ì´ë¯¸ '%s' ìì¹ì ë°ìì ¸ ììµëë¤" + +#: bundle.c:34 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "'%s' íì¼ì´ ë²ì 2 ë²ë¤ íì¼ë¡ ë³´ì´ì§ ììµëë¤" + +#: bundle.c:61 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "ì¸ìí ì ìë í¤ë: %s%s (%d)" + +#: bundle.c:87 builtin/commit.c:766 +#, c-format +msgid "could not open '%s'" +msgstr "'%s'ì(를) ì´ ì ììµëë¤" + +#: bundle.c:139 +msgid "Repository lacks these prerequisite commits:" +msgstr "ì ì¥ìì íìì ì¸ ë¤ì 커ë°ì´ ììµëë¤:" + +#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083 +#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334 +#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358 +#: builtin/shortlog.c:158 +msgid "revision walk setup failed" +msgstr "리ë¹ì walk ì¤ë¹ê° ì¤í¨íìµëë¤" + +#: bundle.c:185 +#, c-format +msgid "The bundle contains this ref:" +msgid_plural "The bundle contains these %d refs:" +msgstr[0] "ë²ë¤ì ë¤ì ë í¼ë°ì¤ %dê°ê° ììµëë¤:" + +#: bundle.c:192 +msgid "The bundle records a complete history." +msgstr "ë²ë¤ì ì ì²´ ì»¤ë° ë´ìì 기ë¡í©ëë¤." + +#: bundle.c:194 +#, c-format +msgid "The bundle requires this ref:" +msgid_plural "The bundle requires these %d refs:" +msgstr[0] "ë²ë¤ì ë¤ì ë í¼ë°ì¤ %dê°ê° íìí©ëë¤:" + +#: bundle.c:253 +msgid "Could not spawn pack-objects" +msgstr "pack-objects ëª ë ¹ì ì¤íí ì ììµëë¤" + +#: bundle.c:264 +msgid "pack-objects died" +msgstr "pack-objects ëª ë ¹ì´ ì£½ììµëë¤" + +#: bundle.c:304 +msgid "rev-list died" +msgstr "rev-list ëª ë ¹ì´ ì£½ììµëë¤" + +#: bundle.c:353 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "rev-list ìµì ìì '%s' ë í¼ë°ì¤ê° ì ì¸ëììµëë¤" + +#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261 +#, c-format +msgid "unrecognized argument: %s" +msgstr "ì ì ìë ì¸ì: %s" + +#: bundle.c:449 +msgid "Refusing to create empty bundle." +msgstr "ë¹ ë²ë¤ì ë§ë¤ì§ ììµëë¤." + +#: bundle.c:459 +#, c-format +msgid "cannot create '%s'" +msgstr "'%s'ì(를) ë§ë¤ ì ììµëë¤" + +#: bundle.c:480 +msgid "index-pack died" +msgstr "index-pack ëª ë ¹ì´ ì£½ììµëë¤" + +#: color.c:275 +#, c-format +msgid "invalid color value: %.*s" +msgstr "ì못ë ì ê°: %.*s" + +#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520 +#: builtin/am.c:2149 +#, c-format +msgid "could not parse %s" +msgstr "parse %sì(를) íì±í ì ììµëë¤" + +#: commit.c:42 +#, c-format +msgid "%s %s is not a commit!" +msgstr "%s %s, 커ë°ì´ ìëëë¤" + +#: compat/obstack.c:406 compat/obstack.c:408 +msgid "memory exhausted" +msgstr "ë©ëª¨ë¦¬ ë°ë¥ë¨" + +#: config.c:474 config.c:476 +#, c-format +msgid "bad config file line %d in %s" +msgstr "%2$s íì¼ %1$dë² ì¤ì ì못ë ì¤ì " + +#: config.c:592 +#, c-format +msgid "bad numeric config value '%s' for '%s' in %s: %s" +msgstr "ì못ë ìì¹ ì¤ì ê° '%s' (í¤ '%s', %s íì¼): %s" + +#: config.c:594 +#, c-format +msgid "bad numeric config value '%s' for '%s': %s" +msgstr "ì못ë ìì¹ ì¤ì ê° '%s' (í¤ '%s'): %s" + +#: config.c:679 +#, c-format +msgid "failed to expand user dir in: '%s'" +msgstr "ë¤ìì ì¬ì©ì ëë í°ë¦¬ íì¥ì ì¤í¨: '%s'" + +#: config.c:757 config.c:768 +#, c-format +msgid "bad zlib compression level %d" +msgstr "%dë²ì ì¬ë°ë¥¸ zlib ìì¶ ë¨ê³ê° ìëëë¤" + +#: config.c:890 +#, c-format +msgid "invalid mode for object creation: %s" +msgstr "ì¤ë¸ì í¸ ìì± ëª¨ëê° ì¬ë°ë¥´ì§ ììµëë¤: %s" + +#: config.c:1216 +msgid "unable to parse command-line config" +msgstr "ëª ë ¹í ì¤ì ì íì±í ì ììµëë¤" + +#: config.c:1277 +msgid "unknown error occured while reading the configuration files" +msgstr "ì¤ì íì¼ì ì½ë ì¤ ì ì ìë ì¤ë¥ê° ìê²¼ìµëë¤" + +#: config.c:1601 +#, c-format +msgid "unable to parse '%s' from command-line config" +msgstr "ëª ë ¹í ì¤ì ìì '%s'ì(를) ì¤ì í ì ììµëë¤" + +#: config.c:1603 +#, c-format +msgid "bad config variable '%s' in file '%s' at line %d" +msgstr "'%2$s' íì¼ì %3$dë² ì¤ '%1$s' ì¤ì ë³ìê° ì못ëììµëë¤" + +#: config.c:1662 +#, c-format +msgid "%s has multiple values" +msgstr "%sì(ë) ì¬ë¬ ê° ê°ì´ ììµëë¤" + +#: connected.c:69 +msgid "Could not run 'git rev-list'" +msgstr "'git rev-list'를 ì¤íí ì ììµëë¤" + +#: connected.c:89 +#, c-format +msgid "failed write to rev-list: %s" +msgstr "rev-list ì°ê¸°ì ì¤í¨íìµëë¤: %s" + +#: connected.c:97 +#, c-format +msgid "failed to close rev-list's stdin: %s" +msgstr "rev-listì íì¤ì ë ¥ì ë«ëë° ì¤í¨íìµëë¤: %s" + +#: date.c:95 +msgid "in the future" +msgstr "미ëì" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "%luì´ ì " + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "%luë¶ ì " + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "%luìê° ì " + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "%luì¼ ì " + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "%lu주 ì " + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "%luë¬ ì " + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "%luë " + +#. TRANSLATORS: "%s" is "<n> years" +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "%s %luë¬ ì " + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "%luë ì " + +#: diffcore-order.c:24 +#, c-format +msgid "failed to read orderfile '%s'" +msgstr "'%s' ìì íì¼ì ì½ëë° ì¤í¨íìµëë¤" + +#: diffcore-rename.c:536 +msgid "Performing inexact rename detection" +msgstr "ë¶ì íí ì´ë¦ ë°ê¾¸ê¸° íìì ìííë ì¤" + +#: diff.c:115 +#, c-format +msgid " Failed to parse dirstat cut-off percentage '%s'\n" +msgstr " dirstat ìë¦ í¼ì¼í¸ ê° '%s' íì±ì ì¤í¨íìµëë¤\n" + +#: diff.c:120 +#, c-format +msgid " Unknown dirstat parameter '%s'\n" +msgstr " ì ì ìë dirstat íë¼ë¯¸í° '%s'\n" + +#: diff.c:215 +#, c-format +msgid "Unknown value for 'diff.submodule' config variable: '%s'" +msgstr "'diff.submodule' ì¤ì ë³ìì ì ì ìë ê°: '%s'" + +#: diff.c:267 +#, c-format +msgid "" +"Found errors in 'diff.dirstat' config variable:\n" +"%s" +msgstr "" +"'diff.submodule' ì¤ì ë³ìì ì¤ë¥:\n" +"%s'" + +#: diff.c:3000 +#, c-format +msgid "external diff died, stopping at %s" +msgstr "ì¸ë¶ diff íë¡ê·¸ë¨ì´ 죽ì, %s ìì¹ìì ë©ì¶¤" + +#: diff.c:3396 +msgid "--follow requires exactly one pathspec" +msgstr "--follow ìµì ìë ì íí íëì ê²½ë¡ëª ì¸ê° íìí©ëë¤" + +#: diff.c:3559 +#, c-format +msgid "" +"Failed to parse --dirstat/-X option parameter:\n" +"%s" +msgstr "" +"--dirstat/-X ìµì íë¼ë¯¸í°ë¥¼ íì±íëë° ì¤í¨íìµëë¤:\n" +"%s" + +#: diff.c:3573 +#, c-format +msgid "Failed to parse --submodule option parameter: '%s'" +msgstr "--submodule ìµì íë¼ë¯¸í° íì±ì ì¤í¨íìµëë¤: '%s'" + +#: dir.c:1915 +msgid "failed to get kernel name and information" +msgstr "커ë ì´ë¦ê³¼ ì 보를 ê°ì ¸ì¤ëë° ì¤í¨íìµëë¤" + +#: dir.c:1998 +msgid "Untracked cache is disabled on this system." +msgstr "ì´ ìì¤í ììë ì¶ì ëì§ ìë ìºì를 ì¬ì©íì§ ììµëë¤." + +#: gpg-interface.c:166 gpg-interface.c:237 +msgid "could not run gpg." +msgstr "gpg를 ì¤íí ì ììµëë¤." + +#: gpg-interface.c:178 +msgid "gpg did not accept the data" +msgstr "gpgìì ë°ì´í°ë¥¼ ë°ìë¤ì´ì§ ììµëë¤" + +#: gpg-interface.c:189 +msgid "gpg failed to sign the data" +msgstr "gpgìì ë°ì´í°ë¥¼ ìëª íëë° ì¤í¨íìµëë¤." + +#: gpg-interface.c:222 +#, c-format +msgid "could not create temporary file '%s': %s" +msgstr "ìì íì¼ '%s'ì(를) ë§ë¤ ì ììµëë¤: %s" + +#: gpg-interface.c:225 +#, c-format +msgid "failed writing detached signature to '%s': %s" +msgstr "ë¶ë¦¬ë ìëª ì '%s'ì ì°ëë° ì¤í¨íìµëë¤: %s" + +#: grep.c:1718 +#, c-format +msgid "'%s': unable to read %s" +msgstr "'%s': %sì(를) ì½ì ì ììµëë¤" + +#: grep.c:1735 +#, c-format +msgid "'%s': %s" +msgstr "'%s': %s" + +#: grep.c:1746 +#, c-format +msgid "'%s': short read %s" +msgstr "'%s': %sìì ì½ë¤ê° ì림" + +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "'%s'ì ìë ê¹ ëª ë ¹" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "ë¤ë¥¸ $PATHì ìë ê¹ ëª ë ¹" + +#: help.c:246 +msgid "These are common Git commands used in various situations:" +msgstr "ë¤ìì ì¬ë¬ê°ì§ ìí©ìì ì주 ì¬ì©íë ê¹ ëª ë ¹ì ëë¤:" + +#: help.c:311 +#, c-format +msgid "" +"'%s' appears to be a git command, but we were not\n" +"able to execute it. Maybe git-%s is broken?" +msgstr "" +"'%s'ì(ë) ê¹ ëª ë ¹ì¼ë¡ ë³´ì´ì§ë§, ì¤íí ì\n" +"ììµëë¤. ìë§ë git-%s ë§ê°ì§ ê² ê°ìµëë¤." + +#: help.c:368 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "ì´ë¼ë¼. ìì¤í ì ê¹ ëª ë ¹ì´ íëë ìë¤ê³ ëìµëë¤." + +#: help.c:390 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" +"ê²½ê³ : ì´ë¦ì´ '%s'ì¸ ê¹ ëª ë ¹ì ì¤ííì§ë§, ê·¸ ëª ë ¹ì´ ììµëë¤.\n" +"ìëì¼ë¡ '%s' ëª ë ¹ì´ë¼ê³ ê°ì íê³ ê³ìí©ëë¤" + +#: help.c:395 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "(%0.1fì´ ë¤ì)..." + +#: help.c:402 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git: '%s'ì(ë) ê¹ ëª ë ¹ì´ ìëëë¤. 'git --help'를 ì°¸ê³ íììì¤." + +#: help.c:406 help.c:466 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +"\n" +"ë¤ìì ìëíì ê² ìëìëì?" + +#: help.c:462 +#, c-format +msgid "%s: %s - %s" +msgstr "%s: %s - %s" + +#: merge.c:41 +msgid "failed to read the cache" +msgstr "ìºì를 ì½ëë° ì¤í¨íìµëë¤" + +#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376 +#: builtin/checkout.c:587 builtin/clone.c:722 +msgid "unable to write new index file" +msgstr "ì ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤" + +#: merge-recursive.c:189 +#, c-format +msgid "(bad commit)\n" +msgstr "(ì못ë 커ë°)\n" + +#: merge-recursive.c:209 +#, c-format +msgid "addinfo_cache failed for path '%s'" +msgstr "'%s' ê²½ë¡ì ëí´ addinfo_cacheê° ì¤í¨íìµëë¤" + +#: merge-recursive.c:270 +msgid "error building trees" +msgstr "í¸ë¦¬ ë¹ëì ì¤ë¥" + +#: merge-recursive.c:686 +#, c-format +msgid "failed to create path '%s'%s" +msgstr "'%s' ê²½ë¡ ë§ë¤ê¸°ì ì¤í¨íìµëë¤%s" + +#: merge-recursive.c:697 +#, c-format +msgid "Removing %s to make room for subdirectory\n" +msgstr "íì ëë í°ë¦¬ì ê³µê°ì ë§ëë ¤ê³ %sì(를) ì ê±°í©ëë¤\n" + +#: merge-recursive.c:711 merge-recursive.c:732 +msgid ": perhaps a D/F conflict?" +msgstr ": ìë§ë D/F 충ë?" + +#: merge-recursive.c:722 +#, c-format +msgid "refusing to lose untracked file at '%s'" +msgstr "'%s' ìì¹ì ì¶ì ëì§ ìë íì¼ì ì기를 ê±°ë¶í©ëë¤" + +#: merge-recursive.c:762 +#, c-format +msgid "cannot read object %s '%s'" +msgstr "%s '%s' ì¤ë¸ì í¸ë¥¼ ì½ì ì ìì" + +#: merge-recursive.c:764 +#, c-format +msgid "blob expected for %s '%s'" +msgstr "%s '%s'ì ëí´ ë¸ë¡ì ìì" + +#: merge-recursive.c:787 builtin/clone.c:369 +#, c-format +msgid "failed to open '%s'" +msgstr "'%s'ì(를) ì¬ëë° ì¤í¨" + +#: merge-recursive.c:795 +#, c-format +msgid "failed to symlink '%s'" +msgstr "'%s' ì¬ë³¼ë¦ ë§í¬ì ì¤í¨" + +#: merge-recursive.c:798 +#, c-format +msgid "do not know what to do with %06o %s '%s'" +msgstr "ë¤ìì ì´ë»ê² í ì§ ì ì ììµëë¤: %06o %s '%s'" + +#: merge-recursive.c:936 +msgid "Failed to execute internal merge" +msgstr "ë´ë¶ ë³í© ì¤íì ì¤í¨" + +#: merge-recursive.c:940 +#, c-format +msgid "Unable to add %s to database" +msgstr "%sì(를) ë°ì´í°ë² ì´ì¤ì ì¶ê°í ì ììµëë¤" + +#: merge-recursive.c:956 +msgid "unsupported object type in the tree" +msgstr "í¸ë¦¬ìì ì§ìíì§ ìë ì¤ë¸ì í¸ ì¢ ë¥" + +#: merge-recursive.c:1031 merge-recursive.c:1045 +#, c-format +msgid "" +"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " +"in tree." +msgstr "" +"충ë! (%s/ìì ): %s (ìì¹ %s) ë° %s (%sìì) ìì . %s ë²ì ì %s í¸ë¦¬ì ë¨ì." + +#: merge-recursive.c:1037 merge-recursive.c:1050 +#, c-format +msgid "" +"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " +"in tree at %s." +msgstr "" +"충ë! (%s/ìì ): %s (ìì¹ %s) ë° %s (ìì¹ %s) ìì . %s ë²ì ì %s í¸ë¦¬ì " +"%s(ì¼)ë¡ ë¨ì." + +#: merge-recursive.c:1091 +msgid "rename" +msgstr "ì´ë¦ë°ê¾¸ê¸°" + +#: merge-recursive.c:1091 +msgid "renamed" +msgstr "ì´ë¦ë°ê¿" + +#: merge-recursive.c:1147 +#, c-format +msgid "%s is a directory in %s adding as %s instead" +msgstr "%sì(ë) %sì ìë ëë í°ë¦¬ë¡ %s(ì¼)ë¡ ì´ë¦ì ë°ê¿ëë¤" + +#: merge-recursive.c:1169 +#, c-format +msgid "" +"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" +"\"->\"%s\" in \"%s\"%s" +msgstr "" +"충ë! (ì´ë¦ë°ê¾¸ê¸°/ì´ë¦ë°ê¾¸ê¸°): \"%3$s\" ë¸ëì¹ìì ì´ë¦ë°ê¾¸ê¸° \"%1$s\"->" +"\"%2$s\" \"%6$s\" ë¸ëì¹ìì ì´ë¦ ë°ê¾¸ê¸° \"%4$s\"->\"%5$s\"%7$s" + +#: merge-recursive.c:1174 +msgid " (left unresolved)" +msgstr " (í´ê²°ëì§ ìì)" + +#: merge-recursive.c:1228 +#, c-format +msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" +msgstr "" +"충ë! (rename/rename): ì´ë¦ ë°ê¾¸ê¸° %s->%s (ìì¹ %s). ì´ë¦ ë°ê¾¸ê¸° %s->%s (ì" +"ì¹ %s)" + +#: merge-recursive.c:1258 +#, c-format +msgid "Renaming %s to %s and %s to %s instead" +msgstr "ëì ì´ë¦ì %sìì %s(ì¼)ë¡ ë°ê¾¸ê³ %sìì %s(ì¼)ë¡ ë°ê¿ëë¤" + +#: merge-recursive.c:1457 +#, c-format +msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" +msgstr "충ë! (rename/add): ì´ë¦ ë°ê¾¸ê¸° %s->%s (ìì¹ %s). %s ì¶ê° (ìì¹ %s)" + +#: merge-recursive.c:1467 +#, c-format +msgid "Adding merged %s" +msgstr "ë³í©ë %sì(를) ì¶ê°í©ëë¤" + +#: merge-recursive.c:1472 merge-recursive.c:1674 +#, c-format +msgid "Adding as %s instead" +msgstr "ëì %s(ì¼)ë¡ ì¶ê°í©ëë¤" + +#: merge-recursive.c:1523 +#, c-format +msgid "cannot read object %s" +msgstr "%s ì¤ë¸ì í¸ë¥¼ ì½ì ì ììµëë¤" + +#: merge-recursive.c:1526 +#, c-format +msgid "object %s is not a blob" +msgstr "%s ì¤ë¸ì í¸ë ë¸ë¡ì´ ìëëë¤" + +#: merge-recursive.c:1578 +msgid "modify" +msgstr "ìì " + +#: merge-recursive.c:1578 +msgid "modified" +msgstr "ìì ë¨" + +#: merge-recursive.c:1588 +msgid "content" +msgstr "ë´ì©" + +#: merge-recursive.c:1595 +msgid "add/add" +msgstr "ì¶ê°/ì¶ê°" + +#: merge-recursive.c:1629 +#, c-format +msgid "Skipped %s (merged same as existing)" +msgstr "ê±´ëë°ê¸°: %s (기존과 ê°ê² ë³í©)" + +#: merge-recursive.c:1643 +#, c-format +msgid "Auto-merging %s" +msgstr "ìë ë³í©: %s" + +#: merge-recursive.c:1647 git-submodule.sh:1025 +msgid "submodule" +msgstr "íì 모ë" + +#: merge-recursive.c:1648 +#, c-format +msgid "CONFLICT (%s): Merge conflict in %s" +msgstr "충ë! (%s): %sì ë³í© 충ë" + +#: merge-recursive.c:1734 +#, c-format +msgid "Removing %s" +msgstr "ì ê±°: %s" + +#: merge-recursive.c:1759 +msgid "file/directory" +msgstr "íì¼/ëë í°ë¦¬" + +#: merge-recursive.c:1765 +msgid "directory/file" +msgstr "ëë í°ë¦¬/íì¼" + +#: merge-recursive.c:1770 +#, c-format +msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" +msgstr "" +"충ë! (%s): ì´ë¦ì´ %sì¸ ëë í°ë¦¬ê° %sì ììµëë¤. %sì(를) %s(ì¼)ë¡ ì¶ê°í©ë" +"ë¤" + +#: merge-recursive.c:1780 +#, c-format +msgid "Adding %s" +msgstr "ì¶ê°: %s" + +#: merge-recursive.c:1797 +msgid "Fatal merge failure, shouldn't happen." +msgstr "ì¹ëª ì ì¸ ë³í© ì¤í¨, ì¼ì´ë ì ìë ìí©." + +#: merge-recursive.c:1816 +msgid "Already up-to-date!" +msgstr "ì´ë¯¸ ì ë°ì´í¸ ìíì ëë¤!" + +#: merge-recursive.c:1825 +#, c-format +msgid "merging of trees %s and %s failed" +msgstr "%s ë° %s í¸ë¦¬ì ë³í©ì´ ì¤í¨íìµëë¤" + +#: merge-recursive.c:1855 +#, c-format +msgid "Unprocessed path??? %s" +msgstr "ì²ë¦¬ëì§ ìì ê²½ë¡??? %s" + +#: merge-recursive.c:1903 +msgid "Merging:" +msgstr "ë³í©:" + +#: merge-recursive.c:1916 +#, c-format +msgid "found %u common ancestor:" +msgid_plural "found %u common ancestors:" +msgstr[0] "과거ì ê³µíµ ì»¤ë° %uê° ë°ê²¬:" + +#: merge-recursive.c:1953 +msgid "merge returned no commit" +msgstr "ë³í© ê²°ê³¼ì 커ë°ì´ ììµëë¤" + +#: merge-recursive.c:2010 +#, c-format +msgid "Could not parse object '%s'" +msgstr "'%s' ì¤ë¸ì í¸ë¥¼ íì±í ì ììµëë¤" + +#: merge-recursive.c:2021 builtin/merge.c:645 +msgid "Unable to write index." +msgstr "ì¸ë±ì¤ë¥¼ ì¸ ì ììµëë¤." + +#: notes-utils.c:41 +msgid "Cannot commit uninitialized/unreferenced notes tree" +msgstr "ì´ê¸°ííì§ ììê±°ë ë í¼ë°ì¤íì§ ìì notes í¸ë¦¬ë¥¼ 커ë°í ì ììµëë¤" + +#: notes-utils.c:100 +#, c-format +msgid "Bad notes.rewriteMode value: '%s'" +msgstr "ì못ë notes.rewriteMode ê°: '%s'" + +#: notes-utils.c:110 +#, c-format +msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" +msgstr "%sìì ë ¸í¸ë¥¼ ë¤ì ì°ê¸°ë¥¼ ê±°ë¶í©ëë¤ (refs/notes/ ë°ì)" + +#. TRANSLATORS: The first %s is the name of the +#. environment variable, the second %s is its value +#: notes-utils.c:137 +#, c-format +msgid "Bad %s value: '%s'" +msgstr "ì못ë %s ê°: '%s'" + +#: object.c:242 +#, c-format +msgid "unable to parse object: %s" +msgstr "ì¤ë¸ì í¸ë¥¼ íì±í ì ììµëë¤: %s" + +#: parse-options.c:570 +msgid "..." +msgstr "..." + +#: parse-options.c:588 +#, c-format +msgid "usage: %s" +msgstr "ì¬ì©ë²: %s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:592 +#, c-format +msgid " or: %s" +msgstr " ëë: %s" + +#: parse-options.c:595 +#, c-format +msgid " %s" +msgstr " %s" + +#: parse-options.c:629 +msgid "-NUM" +msgstr "-NUM" + +#: parse-options-cb.c:108 +#, c-format +msgid "malformed object name '%s'" +msgstr "ì못ë íìì ì¤ë¸ì í¸ ì´ë¦ '%s'" + +#: path.c:752 +#, c-format +msgid "Could not make %s writable by group" +msgstr "%sì(를) 그룹ìì ì°ê¸° ê°ë¥íëë¡ ë§ë¤ ì ììµëë¤" + +#: pathspec.c:133 +msgid "global 'glob' and 'noglob' pathspec settings are incompatible" +msgstr "'glob' ë° 'noglob' ê²½ë¡ëª ì¸ ì ì²´ ì¤ì ì í¸íëì§ ììµëë¤" + +#: pathspec.c:143 +msgid "" +"global 'literal' pathspec setting is incompatible with all other global " +"pathspec settings" +msgstr "" +"'literal' ê²½ë¡ëª ì¸ ì ì²´ ì¤ì ì ë¤ë¥¸ ê²½ë¡ëª ì¸ ì ì²´ ì¤ì ê³¼ í¸íëì§ ììµëë¤" + +#: pathspec.c:177 +msgid "invalid parameter for pathspec magic 'prefix'" +msgstr "ê²½ë¡ëª ì¸ ì§ìì´ 'prefix'ì ì못ë íë¼ë¯¸í°" + +#: pathspec.c:183 +#, c-format +msgid "Invalid pathspec magic '%.*s' in '%s'" +msgstr "ì못ë ê²½ë¡ëª ì¸ ì§ìì´ '%.*s' (ìì¹ '%s')" + +#: pathspec.c:187 +#, c-format +msgid "Missing ')' at the end of pathspec magic in '%s'" +msgstr "ê²½ë¡ ëª ì¸ ì§ìì´ ëì ')' ë¹ ì§ (ìì¹ '%s')" + +#: pathspec.c:205 +#, c-format +msgid "Unimplemented pathspec magic '%c' in '%s'" +msgstr "구íëì§ ìì ê²½ë¡ëª ì¸ ì§ìì´ '%c' (ìì¹ '%s')" + +#: pathspec.c:230 +#, c-format +msgid "%s: 'literal' and 'glob' are incompatible" +msgstr "%s: 'literal'ê³¼ 'glob'ì í¸íëì§ ììµëë¤" + +#: pathspec.c:241 +#, c-format +msgid "%s: '%s' is outside repository" +msgstr "%s: '%s'ì(ë) ì ì¥ì ë°ì ëë¤" + +#: pathspec.c:291 +#, c-format +msgid "Pathspec '%s' is in submodule '%.*s'" +msgstr "ê²½ë¡ëª ì¸ '%s'ì(ë) ''%.*s' íì 모ë ìì ììµëë¤" + +#: pathspec.c:353 +#, c-format +msgid "%s: pathspec magic not supported by this command: %s" +msgstr "%s: ê²½ë¡ëª ì¸ ì§ìì´ê° ì´ ëª ë ¹ì´ìì ì§ìíì§ ììµëë¤: %s" + +#: pathspec.c:432 +#, c-format +msgid "pathspec '%s' is beyond a symbolic link" +msgstr "'%s' ê²½ë¡ëª ì¸ë ì¬ë³¼ë¦ ë§í¬ ìëì ììµëë¤" + +#: pathspec.c:441 +msgid "" +"There is nothing to exclude from by :(exclude) patterns.\n" +"Perhaps you forgot to add either ':/' or '.' ?" +msgstr "" +":(exclude) í¨í´ì¼ë¡ ì ì¸í ì¬íì´ ììµëë¤.\n" +"':/' ëë '.' ì¶ê°ë¥¼ ìì¼ì ê² ìëëê¹?" + +#: pretty.c:969 +msgid "unable to parse --pretty format" +msgstr "--pretty íìì íì±í ì ììµëë¤" + +#: progress.c:235 +msgid "done" +msgstr "ìë£" + +#: read-cache.c:1281 +#, c-format +msgid "" +"index.version set, but the value is invalid.\n" +"Using version %i" +msgstr "" +"index.versionì´ ì¤ì ëìì§ë§, ì´ ê°ì´ ì못ëììµëë¤.\n" +"%i ë²ì ì ì¬ì©í©ëë¤" + +#: read-cache.c:1291 +#, c-format +msgid "" +"GIT_INDEX_VERSION set, but the value is invalid.\n" +"Using version %i" +msgstr "" +"GIT_INDEX_VERSIONì´ ì¤ì ëìì§ë§, ì´ ê°ì´ ì못ëììµëë¤.\n" +"%i ë²ì ì ì¬ì©í©ëë¤" + +#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973 +#: builtin/merge.c:983 +#, c-format +msgid "Could not open '%s' for writing" +msgstr "'%s'ì(를) ì°ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤" + +#: refs/files-backend.c:2359 +#, c-format +msgid "could not delete reference %s: %s" +msgstr "%s ë í¼ë°ì¤ë¥¼ ìì í ì ììµëë¤: %s" + +#: refs/files-backend.c:2362 +#, c-format +msgid "could not delete references: %s" +msgstr "ë í¼ë°ì¤ë¥¼ ìì í ì ììµëë¤: %s" + +#: refs/files-backend.c:2371 +#, c-format +msgid "could not remove reference %s" +msgstr "%s ë í¼ë°ì¤ë¥¼ ì ê±°í ì ììµëë¤" + +#: ref-filter.c:245 +#, c-format +msgid "format: %%(end) atom used without corresponding atom" +msgstr "íì: %%(end) ìí°ì´ ëìëë ìí° ìì´ ì¬ì©ëììµëë¤" + +#: ref-filter.c:704 +#, c-format +msgid "positive value expected contents:lines=%s" +msgstr "'contents:lines=%s'ìì 0ë³´ë¤ í° ê°ì´ ìì¼ í©ëë¤" + +#: ref-filter.c:833 +#, c-format +msgid "expected format: %%(color:<color>)" +msgstr "ììí íì: %%(color:<ì>)" + +#: ref-filter.c:835 +msgid "unable to parse format" +msgstr "íìì íì±í ì ììµëë¤" + +#: ref-filter.c:870 +#, c-format +msgid "expected format: %%(align:<width>,<position>)" +msgstr "ììí íì: %%(align:<ëë¹>,<ìì¹>)" + +#: ref-filter.c:893 +#, c-format +msgid "improper format entered align:%s" +msgstr "align:%s ì못ë íìì´ ì ë ¥ëììµëë¤" + +#: ref-filter.c:898 +#, c-format +msgid "positive width expected with the %%(align) atom" +msgstr "%%(align) ìí°ì ëë¹ê° 0ë³´ë¤ ì»¤ì¼ í©ëë¤" + +#: ref-filter.c:1219 +#, c-format +msgid "malformed object at '%s'" +msgstr "'%s'ì ì못ë íìì ì¤ë¸ì í¸" + +#: ref-filter.c:1561 +#, c-format +msgid "format: %%(end) atom missing" +msgstr "íì: %%(end) ìí°ì´ ììµëë¤" + +#: ref-filter.c:1615 +#, c-format +msgid "malformed object name %s" +msgstr "ì못ë íìì ì¤ë¸ì í¸ ì´ë¦ %s" + +#: remote.c:756 +#, c-format +msgid "Cannot fetch both %s and %s to %s" +msgstr "%s ë° %sì(를) 모ë %sì ê°ì ¸ì¬ ì ììµëë¤" + +#: remote.c:760 +#, c-format +msgid "%s usually tracks %s, not %s" +msgstr "%sì(ë) ë³´íµ %sì(를) ì¶ì íê³ , %sì(를) ì¶ì íì§ ììµëë¤" + +#: remote.c:764 +#, c-format +msgid "%s tracks both %s and %s" +msgstr "%sì(ë) %s ë° %s 모ë ì¶ì í©ëë¤" + +#: remote.c:772 +msgid "Internal error" +msgstr "ë´ë¶ ì¤ë¥" + +#: remote.c:1687 remote.c:1730 +msgid "HEAD does not point to a branch" +msgstr "HEADê° ë¸ëì¹ë¥¼ ê°ë¦¬í¤ì§ ììµëë¤" + +#: remote.c:1696 +#, c-format +msgid "no such branch: '%s'" +msgstr "ê·¸ë° ë¸ëì¹ê° ììµëë¤: '%s'" + +#: remote.c:1699 +#, c-format +msgid "no upstream configured for branch '%s'" +msgstr "'%s' ë¸ëì¹ì ëí´ ì ì¤í¸ë¦¼ì ì¤ì íì§ ìììµëë¤" + +#: remote.c:1705 +#, c-format +msgid "upstream branch '%s' not stored as a remote-tracking branch" +msgstr "ì ì¤í¸ë¦¼ '%s' ë¸ëì¹ê° ë¦¬ëª¨í¸ ì¶ì ë¸ëì¹ë¡ ì ì¥ëì§ ìììµëë¤" + +#: remote.c:1720 +#, c-format +msgid "push destination '%s' on remote '%s' has no local tracking branch" +msgstr "ë¦¬ëª¨í¸ '%2$s'ì í¸ì ëì '%1$s'ì ë¡ì»¬ ì¶ì ë¸ëì¹ê° ììµëë¤" + +#: remote.c:1735 +#, c-format +msgid "branch '%s' has no remote for pushing" +msgstr "'%s' ë¸ëì¹ì í¸ì 리모í¸ê° ììµëë¤" + +#: remote.c:1746 +#, c-format +msgid "push refspecs for '%s' do not include '%s'" +msgstr "'%s'ì ëí í¸ì ë í¼ë°ì¤ëª ì¸ì '%s'ì´(ê°) ë¤ì´ ìì§ ììµëë¤" + +#: remote.c:1759 +msgid "push has no destination (push.default is 'nothing')" +msgstr "í¸ìì ëìì´ ììµëë¤ (push.defaultê° 'nothing'ì ëë¤)" + +#: remote.c:1781 +msgid "cannot resolve 'simple' push to a single destination" +msgstr "íëì ëìì ëí´ 'simple' í¸ì를 ì²ë¦¬í ì ììµëë¤" + +#: remote.c:2083 +#, c-format +msgid "Your branch is based on '%s', but the upstream is gone.\n" +msgstr "íì¬ ë¸ëì¹ê° '%s' 기ë°ì´ì§ë§, ì ì¤í¸ë¦¼ì´ ìì´ì¡ìµëë¤.\n" + +#: remote.c:2087 +msgid " (use \"git branch --unset-upstream\" to fixup)\n" +msgstr " (ë°ë¡ì¡ì¼ë ¤ë©´ \"git branch --unset-upstream\"ì ì¬ì©íììì¤)\n" + +#: remote.c:2090 +#, c-format +msgid "Your branch is up-to-date with '%s'.\n" +msgstr "ë¸ëì¹ê° '%s'ì ë§ê² ì ë°ì´í¸ë ìíì ëë¤.\n" + +#: remote.c:2094 +#, c-format +msgid "Your branch is ahead of '%s' by %d commit.\n" +msgid_plural "Your branch is ahead of '%s' by %d commits.\n" +msgstr[0] "ë¸ëì¹ê° '%s'ë³´ë¤ %dê° ì»¤ë°ë§í¼ ìì ììµëë¤.\n" + +#: remote.c:2100 +msgid " (use \"git push\" to publish your local commits)\n" +msgstr " (ë¡ì»¬ì ìë 커ë°ì ì ì¶íë ¤ë©´ \"git push\"를 ì¬ì©íììì¤)\n" + +#: remote.c:2103 +#, c-format +msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" +msgid_plural "" +"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" +msgstr[0] "ë¸ëì¹ê° '%s'ë³´ë¤ %dê° ì»¤ë° ë¤ì ìê³ , ìì¼ë¡ ë릴 ì ììµëë¤.\n" + +#: remote.c:2111 +msgid " (use \"git pull\" to update your local branch)\n" +msgstr " (ë¡ì»¬ ë¸ëì¹ë¥¼ ì ë°ì´í¸íë ¤ë©´ \"git pull\"ì ì¬ì©íììì¤)\n" + +#: remote.c:2114 +#, c-format +msgid "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commit each, respectively.\n" +msgid_plural "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commits each, respectively.\n" +msgstr[0] "" +"íì¬ ë¸ëì¹ì '%s'ì´(ê°) ê°ë¼ì¡ìµëë¤,\n" +"ë¤ë¥¸ 커ë°ì´ ê°ê° %dê°ì %dê° ììµëë¤.\n" + +#: remote.c:2124 +msgid " (use \"git pull\" to merge the remote branch into yours)\n" +msgstr "" +" (리모í¸ì ë¸ëì¹ë¥¼ íì¬ ë¸ëì¹ë¡ ë³í©íë ¤ë©´ \"git pull\"ì ì¬ì©íììì¤)\n" + +#: revision.c:2193 +msgid "your current branch appears to be broken" +msgstr "íì¬ ë¸ëì¹ê° ë§ê°ì§ ê²ì²ë¼ ë³´ì ëë¤" + +#: revision.c:2196 +#, c-format +msgid "your current branch '%s' does not have any commits yet" +msgstr "íì¬ '%s' ë¸ëì¹ì ìì§ ì무 커ë°ë ììµëë¤" + +#: revision.c:2390 +msgid "--first-parent is incompatible with --bisect" +msgstr "--first-parent ìµì ì --bisect ìµì ê³¼ í¸íëì§ ììµëë¤" + +#: run-command.c:90 +msgid "open /dev/null failed" +msgstr "/dev/null ì´ê¸° ì¤í¨" + +#: run-command.c:92 +#, c-format +msgid "dup2(%d,%d) failed" +msgstr "dup2(%d,%d) ì¤í¨" + +#: send-pack.c:295 +msgid "failed to sign the push certificate" +msgstr "í¸ì ì¸ì¦ì ìëª ì ì¤í¨íìµëë¤" + +#: send-pack.c:404 +msgid "the receiving end does not support --signed push" +msgstr "ë°ë 쪽ìì --signed í¸ì를 ì§ìíì§ ììµëë¤" + +#: send-pack.c:406 +msgid "" +"not sending a push certificate since the receiving end does not support --" +"signed push" +msgstr "" +"ë°ë 쪽ìì --signed í¸ì를 ì§ìíì§ ìì¼ë¯ë¡ í¸ì ì¸ì¦ì를 ë³´ë´ì§ ììµëë¤" + +#: send-pack.c:418 +msgid "the receiving end does not support --atomic push" +msgstr "ë°ë 쪽ìì --atomic í¸ì를 ì§ìíì§ ììµëë¤" + +#: sequencer.c:183 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'" +msgstr "" +"ì´ ì¶©ëì í´ê²°í ë¤ì, ë°ë¡ì¡ì ê²½ë¡ë¥¼\n" +"'git add <ê²½ë¡>' ëë 'git rm <ê²½ë¡>'ë¡ íìíììì¤" + +#: sequencer.c:186 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'\n" +"and commit the result with 'git commit'" +msgstr "" +"ì´ ì¶©ëì í´ê²°í ë¤ì, ë°ë¡ì¡ì ê²½ë¡ë¥¼\n" +"'git add <ê²½ë¡>' ëë 'git rm <ê²½ë¡>'ë¡ íìíììì¤.\n" +"ê·¸ë¦¬ê³ ê²°ê³¼ë¬¼ì 'git commit'ì¼ë¡ 커ë°íììì¤" + +#: sequencer.c:199 sequencer.c:842 sequencer.c:922 +#, c-format +msgid "Could not write to %s" +msgstr "%sì ì¸ ì ììµëë¤" + +#: sequencer.c:202 +#, c-format +msgid "Error wrapping up %s" +msgstr "%s ì ê·¸ëë° ì¤ë¥" + +#: sequencer.c:217 +msgid "Your local changes would be overwritten by cherry-pick." +msgstr "ë¡ì»¬ ë³ê²½ ì¬íì cherry-pick ë문ì ë®ì´ ì°ê² ë©ëë¤." + +#: sequencer.c:219 +msgid "Your local changes would be overwritten by revert." +msgstr "ë¡ì»¬ ë³ê²½ ì¬íì revert ë문ì ë®ì´ ì°ê² ë©ëë¤." + +#: sequencer.c:222 +msgid "Commit your changes or stash them to proceed." +msgstr "ë³ê²½ ì¬íì ì¤í ì´ì§íê±°ë ì¤íìí ë¤ì ê³ìíììì¤." + +#. TRANSLATORS: %s will be "revert" or "cherry-pick" +#: sequencer.c:309 +#, c-format +msgid "%s: Unable to write new index file" +msgstr "%s: ì ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤" + +#: sequencer.c:327 +msgid "Could not resolve HEAD commit\n" +msgstr "HEAD 커ë°ì ì²ë¦¬í ì ììµëë¤\n" + +#: sequencer.c:347 +msgid "Unable to update cache tree\n" +msgstr "ìºì í¸ë¦¬ë¥¼ ì ë°ì´í¸í ì ììµëë¤\n" + +#: sequencer.c:399 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "%s 커ë°ì íì±í ì ììµëë¤\n" + +#: sequencer.c:404 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "%s ì´ì 커ë°ì íì±í ì ììµëë¤\n" + +#: sequencer.c:469 +msgid "Your index file is unmerged." +msgstr "ì¸ë±ì¤ íì¼ì´ ë³í©ëì§ ìììµëë¤." + +#: sequencer.c:488 +#, c-format +msgid "Commit %s is a merge but no -m option was given." +msgstr "%s 커ë°ì ë³í©ì´ì§ë§ -m ìµì ì´ ì£¼ì´ì§ì§ ìììµëë¤." + +# FIXME: "parent %d" ë²í¸ê° ë¬´ì¨ ì미? +#: sequencer.c:496 +#, c-format +msgid "Commit %s does not have parent %d" +msgstr "Commit %s 커ë°ì ì´ì ì»¤ë° %dì´(ê°) ììµëë¤" + +#: sequencer.c:500 +#, c-format +msgid "Mainline was specified but commit %s is not a merge." +msgstr "ë©ì¸ë¼ì¸ì ì§ì íì§ë§ %s 커ë°ì´ ë³í© 커ë°ì´ ìëëë¤." + +#. TRANSLATORS: The first %s will be "revert" or +#. "cherry-pick", the second %s a SHA1 +#: sequencer.c:513 +#, c-format +msgid "%s: cannot parse parent commit %s" +msgstr "%s: %s ì´ì 커ë°ì íì±í ì ììµëë¤" + +#: sequencer.c:517 +#, c-format +msgid "Cannot get commit message for %s" +msgstr "%sì ëí ì»¤ë° ë©ìì§ë¥¼ ê°ì ¸ì¬ ì ììµëë¤" + +#: sequencer.c:603 +#, c-format +msgid "could not revert %s... %s" +msgstr "ë¤ìì ëë릴(revert) ì ììµëë¤: %s... %s" + +#: sequencer.c:604 +#, c-format +msgid "could not apply %s... %s" +msgstr "ë¤ìì ì ì©í (apply) ì ììµëë¤: %s... %s" + +#: sequencer.c:639 +msgid "empty commit set passed" +msgstr "ë¹ ì»¤ë° ëª¨ìì ê±´ë ëëë¤" + +#: sequencer.c:647 +#, c-format +msgid "git %s: failed to read the index" +msgstr "git %s: ì¸ë±ì¤ ì½ê¸°ì ì¤í¨íìµëë¤" + +#: sequencer.c:651 +#, c-format +msgid "git %s: failed to refresh the index" +msgstr "git %s: ì¸ë±ì¤ ìë¡ ê³ ì¹¨ì ì¤í¨íìµëë¤" + +#: sequencer.c:711 +#, c-format +msgid "Cannot %s during a %s" +msgstr "%2$s ëì %1$s í ì ììµëë¤" + +#: sequencer.c:733 +#, c-format +msgid "Could not parse line %d." +msgstr "%dë² ì¤ì íì±í ì ììµëë¤." + +#: sequencer.c:738 +msgid "No commits parsed." +msgstr "íì±í 커ë°ì´ ììµëë¤." + +#: sequencer.c:750 +#, c-format +msgid "Could not open %s" +msgstr "%sì(를) ì´ ì ììµëë¤" + +#: sequencer.c:754 +#, c-format +msgid "Could not read %s." +msgstr "%sì(를) ì½ì ì ììµëë¤." + +#: sequencer.c:761 +#, c-format +msgid "Unusable instruction sheet: %s" +msgstr "ì¬ì© ë¶ê°ë¥ ì¸ì¤í¸ëì íì¼: %s" + +#: sequencer.c:791 +#, c-format +msgid "Invalid key: %s" +msgstr "ì못ë í¤: %s" + +#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49 +#, c-format +msgid "Invalid value for %s: %s" +msgstr "%sì ê°ì´ ì¬ë°ë¥´ì§ ììµëë¤: %s" + +#: sequencer.c:804 +#, c-format +msgid "Malformed options sheet: %s" +msgstr "íìì´ ì못ë ìµì íì¼: %s" + +#: sequencer.c:823 +msgid "a cherry-pick or revert is already in progress" +msgstr "ì´ë¯¸ ì»¤ë° ë¹¼ì¤ê¸°(cherry-pick) ëë ëë리기(revert)ê° ì§í ì¤ì ëë¤" + +#: sequencer.c:824 +msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" +msgstr "\"git cherry-pick (--continue | --quit | --abort)\" ëª ë ¹ì í´ ë³´ììì¤" + +#: sequencer.c:828 +#, c-format +msgid "Could not create sequencer directory %s" +msgstr "%s ìíì ëë í°ë¦¬ë¥¼ ë§ë¤ ì ììµëë¤" + +#: sequencer.c:844 sequencer.c:926 +#, c-format +msgid "Error wrapping up %s." +msgstr "%s ì ê·¸ëë° ì¤ë¥." + +#: sequencer.c:863 sequencer.c:996 +msgid "no cherry-pick or revert in progress" +msgstr "ë¹¼ì¤ê¸°(cherry-pick) ëë ëë리기(revert)ê° ì§í ì¤ì´ì§ ììµëë¤" + +#: sequencer.c:865 +msgid "cannot resolve HEAD" +msgstr "HEAD를 êµ¬í´ ì¬ ì ììµëë¤" + +#: sequencer.c:867 +msgid "cannot abort from a branch yet to be born" +msgstr "ìë¡ ë§ë¤ê³ ìë ë¸ëì¹ìì ì¤ì§í ì ììµëë¤" + +#: sequencer.c:887 builtin/apply.c:4287 +#, c-format +msgid "cannot open %s: %s" +msgstr "%sì(를) ì´ ì ììµëë¤: %s" + +#: sequencer.c:890 +#, c-format +msgid "cannot read %s: %s" +msgstr "%sì(를) ì½ì ì ììµëë¤: %s" + +#: sequencer.c:891 +msgid "unexpected end of file" +msgstr "ììì¹ ëª»íê² íì¼ì´ ëë¬ìµëë¤" + +#: sequencer.c:897 +#, c-format +msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" +msgstr "ë¹¼ì¤ê¸° ì ì ì ì¥í HEAD íì¼ì´('%s') ììëììµëë¤" + +#: sequencer.c:919 +#, c-format +msgid "Could not format %s." +msgstr "%sì í¬ë§¤í í ì ììµëë¤." + +#: sequencer.c:1064 +#, c-format +msgid "%s: can't cherry-pick a %s" +msgstr "%s: %s 커ë°ì ë¹¼ì¬ ì ììµëë¤" + +#: sequencer.c:1067 +#, c-format +msgid "%s: bad revision" +msgstr "%s: ì못ë 리ë¹ì " + +#: sequencer.c:1101 +msgid "Can't revert as initial commit" +msgstr "ìµì´ì 커ë°ì ëë릴 ì ììµëë¤" + +#: sequencer.c:1102 +msgid "Can't cherry-pick into empty head" +msgstr "ë¹ í¤ëë¡ ì»¤ë°ì ë¹¼ì¬ ì ììµëë¤." + +#: setup.c:248 +#, c-format +msgid "failed to read %s" +msgstr "%sì(를) ì½ëë° ì¤í¨íìµëë¤" + +#: sha1_name.c:463 +msgid "" +"Git normally never creates a ref that ends with 40 hex characters\n" +"because it will be ignored when you just specify 40-hex. These refs\n" +"may be created by mistake. For example,\n" +"\n" +" git checkout -b $br $(git rev-parse ...)\n" +"\n" +"where \"$br\" is somehow empty and a 40-hex ref is created. Please\n" +"examine these refs and maybe delete them. Turn this message off by\n" +"running \"git config advice.objectNameWarning false\"" +msgstr "" +"ê¹ììë ë³´íµ 40ê°ì 16ì§ì 문ìë¡ ëëë ë í¼ë°ì¤ë¥¼ ë§ë¤ì§ ììµëë¤.\n" +"16ì§ì 문ì 40ì를 ì§ì íì ë ì´ ë í¼ë°ì¤ê° 무ìë기 ë문ì ëë¤. ì´\n" +"ë í¼ë°ì¤ë ì¤ìë¡ ë§ë¤ì´ì¡ì ìë ììµëë¤. ì를 ë¤ì´,\n" +"\n" +" git checkout -b $br $(git rev-parse ...)\n" +"\n" +"ì¬ê¸°ì \"$br\"ì ë¹ì´ ìì¼ë¯ë¡ 40ì ë í¼ë°ì¤ê° ë§ë¤ì´ì§ëë¤. ì´ ë í¼ë°ì¤ë¥¼\n" +"íì¸í´ ë³´ìê³ ì못 ë§ë¤ì´ì§ ê²ì´ë©´ ì§ì°ììì¤. ì´ ë©ìì§ë¥¼ ë³´ê³ ì¶ì§\n" +"ìì¼ë©´ \"git config advice.objectNameWarning false\" ëª ë ¹ì ì¬ì©íììì¤." + +#: submodule.c:61 submodule.c:95 +msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" +msgstr "" +"ë³í©íì§ ìì .gitmodules를 ë°ê¿ ì ììµëë¤. ë³í© 충ëì 먼ì í´ê²°íììì¤" + +#: submodule.c:65 submodule.c:99 +#, c-format +msgid "Could not find section in .gitmodules where path=%s" +msgstr "ê²½ë¡ê° %sì¼ ë .gitmodulesì ì¹ì ì ì°¾ì ì ììµëë¤" + +#: submodule.c:73 +#, c-format +msgid "Could not update .gitmodules entry %s" +msgstr ".gitmodules í목 %sì(를) ì ë°ì´í¸í ì ììµëë¤" + +#: submodule.c:106 +#, c-format +msgid "Could not remove .gitmodules entry for %s" +msgstr "%sì ëí .gitmodules í목ì ì ê±°í ì ììµëë¤" + +#: submodule.c:117 +msgid "staging updated .gitmodules failed" +msgstr "ì ë°ì´í¸í .gitmodules를 커ë°í ì¬íì¼ë¡ íìíëë° ì¤í¨" + +#: submodule.c:1040 +#, c-format +msgid "Could not set core.worktree in %s" +msgstr "%sìì core.worktree를 ì¤ì í ì ììµëë¤" + +#: trailer.c:491 trailer.c:495 trailer.c:499 trailer.c:553 trailer.c:557 +#: trailer.c:561 +#, c-format +msgid "unknown value '%s' for key '%s'" +msgstr "ì ì ìë ê° '%s', í¤ '%s'" + +#: trailer.c:543 trailer.c:548 builtin/remote.c:296 +#, c-format +msgid "more than one %s" +msgstr "%sì´(ê°) ì¬ë¬ê°ì ëë¤" + +#: trailer.c:581 +#, c-format +msgid "empty trailer token in trailer '%.*s'" +msgstr "í¸ë ì¼ë¬ '%.*s'ìì ë¹ í¸ë ì¼ë¬ í í°" + +#: trailer.c:701 +#, c-format +msgid "could not read input file '%s'" +msgstr "'%s' ì ë ¥ íì¼ì ì½ì ì ììµëë¤" + +#: trailer.c:704 +msgid "could not read from stdin" +msgstr "íì¤ ì ë ¥ìì ì½ì ì ììµëë¤" + +#: transport-helper.c:1025 +#, c-format +msgid "Could not read ref %s" +msgstr "%s ë í¼ë°ì¤ë¥¼ ì½ì ì ììµëë¤" + +#: unpack-trees.c:203 +msgid "Checking out files" +msgstr "íì¼ì ê°ì ¸ìµëë¤" + +#: urlmatch.c:120 +msgid "invalid URL scheme name or missing '://' suffix" +msgstr "URL ì¤í´ ì´ë¦ì´ ì못ëìê±°ë '://'ê° ë¤ì ë¶ì§ ìììµëë¤" + +#: urlmatch.c:144 urlmatch.c:297 urlmatch.c:356 +#, c-format +msgid "invalid %XX escape sequence" +msgstr "ì못ë %XX ì´ì¤ì¼ì´í ìíì¤" + +#: urlmatch.c:172 +msgid "missing host and scheme is not 'file:'" +msgstr "í¸ì¤í¸ê° ìê³ ì¤í´ì´ 'file:'ì´ ìëëë¤" + +#: urlmatch.c:189 +msgid "a 'file:' URL may not have a port number" +msgstr "'file:' URLìë í¬í¸ ë²í¸ë¥¼ ì¸ ì ììµëë¤" + +#: urlmatch.c:199 +msgid "invalid characters in host name" +msgstr "í¸ì¤í¸ ì´ë¦ì ì못ë 문ì" + +#: urlmatch.c:244 urlmatch.c:255 +msgid "invalid port number" +msgstr "ì못ë í¬í¸ ë²í¸" + +#: urlmatch.c:322 +msgid "invalid '..' path segment" +msgstr "ê²½ë¡ìì ì못ë '..' ë¶ë¶" + +#: wrapper.c:219 wrapper.c:362 +#, c-format +msgid "could not open '%s' for reading and writing" +msgstr "ì½ê¸°ì ì°ê¸°ì©ì¼ë¡ '%s'ì(를) ì´ ì ììµëë¤" + +#: wrapper.c:221 wrapper.c:364 +#, c-format +msgid "could not open '%s' for writing" +msgstr "'%s'ì(를) ì°ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤" + +#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691 +#: builtin/merge.c:1074 builtin/pull.c:380 +#, c-format +msgid "could not open '%s' for reading" +msgstr "'%s'ì(를) ì½ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤" + +#: wrapper.c:579 +#, c-format +msgid "unable to access '%s': %s" +msgstr "'%s'ì ì ê·¼í ì ììµëë¤: %s" + +#: wrapper.c:600 +#, c-format +msgid "unable to access '%s'" +msgstr "'%s'ì ì ê·¼í ì ììµëë¤" + +#: wrapper.c:608 +msgid "unable to get current working directory" +msgstr "íì¬ ìì ëë í°ë¦¬ë¥¼ ê°ì ¸ì¬ ì ììµëë¤" + +#: wrapper.c:635 +#, c-format +msgid "could not open %s for writing" +msgstr "%sì(를) ì°ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤" + +#: wrapper.c:646 builtin/am.c:425 +#, c-format +msgid "could not write to %s" +msgstr "%sì ì¸ ì ììµëë¤" + +#: wrapper.c:652 +#, c-format +msgid "could not close %s" +msgstr "%sì(를) ë«ì ì ììµëë¤" + +#: wt-status.c:149 +msgid "Unmerged paths:" +msgstr "ë³í©íì§ ìì ê²½ë¡:" + +#: wt-status.c:176 wt-status.c:203 +#, c-format +msgid " (use \"git reset %s <file>...\" to unstage)" +msgstr " (ì¤í ì´ì§ í´ì íë ¤ë©´ \"git reset %s <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:178 wt-status.c:205 +msgid " (use \"git rm --cached <file>...\" to unstage)" +msgstr " (ì¤í ì´ì§ í´ì íë ¤ë©´ \"git rm --cached <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:182 +msgid " (use \"git add <file>...\" to mark resolution)" +msgstr " (í´ê²°íë¤ê³ íìíë ¤ë©´ \"git add <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:184 wt-status.c:188 +msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" +msgstr "" +" (í´ê²°íë¤ê³ íìíë ¤ë©´ ìë§ê² \"git add/rm <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:186 +msgid " (use \"git rm <file>...\" to mark resolution)" +msgstr " (í´ê²°íë¤ê³ íìíë ¤ë©´ \"git rm <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:197 wt-status.c:880 +msgid "Changes to be committed:" +msgstr "커ë°í ë³ê²½ ì¬í:" + +#: wt-status.c:215 wt-status.c:889 +msgid "Changes not staged for commit:" +msgstr "커ë°íëë¡ ì íì§ ìì ë³ê²½ ì¬í:" + +#: wt-status.c:219 +msgid " (use \"git add <file>...\" to update what will be committed)" +msgstr " (무ìì 커ë°í ì§ ë°ê¾¸ë ¤ë©´ \"git add <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:221 +msgid " (use \"git add/rm <file>...\" to update what will be committed)" +msgstr " (무ìì 커ë°í ì§ ë°ê¾¸ë ¤ë©´ \"git add/rm <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:222 +msgid "" +" (use \"git checkout -- <file>...\" to discard changes in working directory)" +msgstr "" +" (ìì í´ëì ë³ê²½ ì¬íì ë²ë¦¬ë ¤ë©´ \"git checkout -- <íì¼>...\"ì ì¬ì©íì" +"ìì¤)" + +#: wt-status.c:224 +msgid " (commit or discard the untracked or modified content in submodules)" +msgstr "" +" (íì 모ëì ì¶ì ëì§ ìë íì¼ì´ë ìì ë ë´ì©ì 커ë°íê±°ë ë²ë¦¬ììì¤)" + +#: wt-status.c:236 +#, c-format +msgid " (use \"git %s <file>...\" to include in what will be committed)" +msgstr " (커ë°í ì¬íì í¬í¨íë ¤ë©´ \"git %s <íì¼>...\"ì ì¬ì©íììì¤)" + +#: wt-status.c:251 +msgid "both deleted:" +msgstr "ì쪽ìì ìì :" + +#: wt-status.c:253 +msgid "added by us:" +msgstr "ì´ ìª½ìì ì¶ê°:" + +#: wt-status.c:255 +msgid "deleted by them:" +msgstr "ì 쪽ìì ìì :" + +#: wt-status.c:257 +msgid "added by them:" +msgstr "ì 쪽ìì ì¶ê°:" + +#: wt-status.c:259 +msgid "deleted by us:" +msgstr "ì´ ìª½ìì ìì :" + +#: wt-status.c:261 +msgid "both added:" +msgstr "ì쪽ìì ì¶ê°:" + +#: wt-status.c:263 +msgid "both modified:" +msgstr "ì쪽ìì ìì :" + +#: wt-status.c:265 +#, c-format +msgid "bug: unhandled unmerged status %x" +msgstr "bug: ë³í©íì§ ìì ìí %x ì²ë¦¬ëì§ ìì" + +#: wt-status.c:273 +msgid "new file:" +msgstr "ì íì¼:" + +#: wt-status.c:275 +msgid "copied:" +msgstr "ë³µì¬í¨:" + +#: wt-status.c:277 +msgid "deleted:" +msgstr "ìì í¨:" + +#: wt-status.c:279 +msgid "modified:" +msgstr "ìì í¨:" + +#: wt-status.c:281 +msgid "renamed:" +msgstr "ì´ë¦ ë°ê¿:" + +#: wt-status.c:283 +msgid "typechange:" +msgstr "ì¢ ë¥ ë°ë:" + +#: wt-status.c:285 +msgid "unknown:" +msgstr "ì ì ìì:" + +#: wt-status.c:287 +msgid "unmerged:" +msgstr "ë³í©íì§ ìì:" + +#: wt-status.c:369 +msgid "new commits, " +msgstr "ì 커ë°, " + +#: wt-status.c:371 +msgid "modified content, " +msgstr "ìì í ë´ì©, " + +#: wt-status.c:373 +msgid "untracked content, " +msgstr "ì¶ì íì§ ìì ë´ì©, " + +#: wt-status.c:390 +#, c-format +msgid "bug: unhandled diff status %c" +msgstr "ë²ê·¸: ì²ë¦¬ëì§ ìì diff ìí %c" + +#: wt-status.c:754 +msgid "Submodules changed but not updated:" +msgstr "ë³ê²½ëìì§ë§ ì ë°ì´í¸íì§ ìì íì 모ë:" + +#: wt-status.c:756 +msgid "Submodule changes to be committed:" +msgstr "커ë°í íì 모ëì ë³ê²½ ì¬í:" + +#: wt-status.c:837 +msgid "" +"Do not touch the line above.\n" +"Everything below will be removed." +msgstr "" +"ìì ì¤ì ë°ê¾¸ì§ ë§ììì¤.\n" +"ìë ìë ë´ì©ì 모ë ì ê±°ë©ëë¤." + +#: wt-status.c:948 +msgid "You have unmerged paths." +msgstr "ë³í©íì§ ìì ê²½ë¡ê° ììµëë¤." + +#: wt-status.c:951 +msgid " (fix conflicts and run \"git commit\")" +msgstr " (충ëì ë°ë¡ì¡ê³ \"git commit\"ì ì¤ííììì¤)" + +#: wt-status.c:954 +msgid "All conflicts fixed but you are still merging." +msgstr "모ë 충ëì ë°ë¡ì¡ìì§ë§ ìì§ ë³í©íë ì¤ì ëë¤." + +#: wt-status.c:957 +msgid " (use \"git commit\" to conclude merge)" +msgstr " (ë³í©ì ë§ë¬´ë¦¬íë ¤ë©´ \"git commit\"ì ì¬ì©íììì¤)" + +#: wt-status.c:967 +msgid "You are in the middle of an am session." +msgstr "am ì¸ì ì¤ê°ì ììµëë¤." + +#: wt-status.c:970 +msgid "The current patch is empty." +msgstr "íì¬ í¨ì¹ê° ë¹ì´ ììµëë¤." + +#: wt-status.c:974 +msgid " (fix conflicts and then run \"git am --continue\")" +msgstr " (충ëì ë°ë¡ì¡ì ë¤ì \"git am --continue\"를 ì¬ì©íììì¤)" + +#: wt-status.c:976 +msgid " (use \"git am --skip\" to skip this patch)" +msgstr " (ì´ í¨ì¹ë¥¼ ê±´ë ë°ë ¤ë©´ \"git am --skip\"ì ì¬ì©íììì¤)" + +#: wt-status.c:978 +msgid " (use \"git am --abort\" to restore the original branch)" +msgstr " (ì본 ë¸ëì¹ë¥¼ 복구íë ¤ë©´ \"git am --abort\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1105 +msgid "No commands done." +msgstr "ìë£í ëª ë ¹ ìì." + +#: wt-status.c:1108 +#, c-format +msgid "Last command done (%d command done):" +msgid_plural "Last commands done (%d commands done):" +msgstr[0] "ìµê·¼ ìë£í ëª ë ¹ (%dê° ëª ë ¹ ìë£):" + +#: wt-status.c:1119 +#, c-format +msgid " (see more in file %s)" +msgstr " (ìì¸í ì ë³´ë %s íì¼ ì°¸ê³ )" + +#: wt-status.c:1124 +msgid "No commands remaining." +msgstr "ëª ë ¹ì´ ë¨ììì§ ìì." + +#: wt-status.c:1127 +#, c-format +msgid "Next command to do (%d remaining command):" +msgid_plural "Next commands to do (%d remaining commands):" +msgstr[0] "ë¤ìì í ëª ë ¹ (%dê° ëª ë ¹ ë¨ì):" + +#: wt-status.c:1135 +msgid " (use \"git rebase --edit-todo\" to view and edit)" +msgstr " (ë³´ê³ í¸ì§íë ¤ë©´ \"git rebase --edit-todo\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1148 +#, c-format +msgid "You are currently rebasing branch '%s' on '%s'." +msgstr "íì¬ '%s' ë¸ëì¹ë¥¼ '%s' ìë¡ ë¦¬ë² ì´ì¤íë ì¤ì ëë¤." + +#: wt-status.c:1153 +msgid "You are currently rebasing." +msgstr "íì¬ ë¦¬ë² ì´ì¤íë ì¤ì ëë¤." + +#: wt-status.c:1167 +msgid " (fix conflicts and then run \"git rebase --continue\")" +msgstr " (충ëì ë°ë¡ì¡ê³ \"git rebase --continue\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1169 +msgid " (use \"git rebase --skip\" to skip this patch)" +msgstr " (ì´ í¨ì¹ë¥¼ ê±´ëë°ë ¤ë©´ \"git rebase --skip\"ì ì¬ì©íììì¤)" + +#: wt-status.c:1171 +msgid " (use \"git rebase --abort\" to check out the original branch)" +msgstr " (ì본 ë¸ëì¹ë¥¼ ê°ì ¸ì¤ë ¤ë©´ \"git rebase --abort\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1177 +msgid " (all conflicts fixed: run \"git rebase --continue\")" +msgstr "" +" (모ë 충ëì ë°ë¡ì¡ììµëë¤: \"git rebase --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1181 +#, c-format +msgid "" +"You are currently splitting a commit while rebasing branch '%s' on '%s'." +msgstr "íì¬ '%s' ë¸ëì¹ë¥¼ '%s' ìë¡ ë¦¬ë² ì´ì¤íë ì¤ ì»¤ë°ì ë¶ë¦¬íë ì¤ì ëë¤." + +#: wt-status.c:1186 +msgid "You are currently splitting a commit during a rebase." +msgstr "íì¬ ë¦¬ë² ì´ì¤íë ì¤ ì»¤ë°ì ë¶ë¦¬íë ì¤ì ëë¤." + +#: wt-status.c:1189 +msgid " (Once your working directory is clean, run \"git rebase --continue\")" +msgstr " (ìì í´ëê° ê¹¨ëí´ì§ë©´, \"git rebase --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1193 +#, c-format +msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." +msgstr "'%s' ë¸ëì¹ë¥¼ '%s' ìë¡ ë¦¬ë² ì´ì¤íë ì¤ ì»¤ë°ì í¸ì§íë ì¤ì ëë¤." + +#: wt-status.c:1198 +msgid "You are currently editing a commit during a rebase." +msgstr "ë¦¬ë² ì´ì¤ ì¤ì 커ë°ì í¸ì§íë ì¤ì ëë¤." + +#: wt-status.c:1201 +msgid " (use \"git commit --amend\" to amend the current commit)" +msgstr " (íì¬ ì»¤ë°ì ìì íë ¤ë©´ \"git commit --amend\"ì ì¬ì©íììì¤)" + +#: wt-status.c:1203 +msgid "" +" (use \"git rebase --continue\" once you are satisfied with your changes)" +msgstr " (ë³ê²½ ì¬íì ë§ì¡±í ë \"git rebase --continue\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1213 +#, c-format +msgid "You are currently cherry-picking commit %s." +msgstr "íì¬ %s 커ë°ì ë½ì ë´ê³ ììµëë¤." + +#: wt-status.c:1218 +msgid " (fix conflicts and run \"git cherry-pick --continue\")" +msgstr " (충ëì ë°ë¡ì¡ê³ \"git cherry-pick --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1221 +msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" +msgstr "" +" (모ë 충ëì ë°ë¡ì¡ììµëë¤: \"git cherry-pick --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1223 +msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" +msgstr " (ë½ê¸° ìì ì ì·¨ìíë ¤ë©´ \"git cherry-pick --abort\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1232 +#, c-format +msgid "You are currently reverting commit %s." +msgstr "íì¬ %s 커ë°ì ëë리ë ì¤ì ëë¤." + +#: wt-status.c:1237 +msgid " (fix conflicts and run \"git revert --continue\")" +msgstr " (충ëì ë°ë¡ì¡ê³ \"git revert --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1240 +msgid " (all conflicts fixed: run \"git revert --continue\")" +msgstr "" +" (모ë 충ëì ë°ë¡ì¡ììµëë¤: \"git revert --continue\"를 ì¤ííììì¤)" + +#: wt-status.c:1242 +msgid " (use \"git revert --abort\" to cancel the revert operation)" +msgstr " (ëë리기 ìì ì ì·¨ìíë ¤ë©´ \"git revert --abort\"를 ì¬ì©íììì¤)" + +#: wt-status.c:1253 +#, c-format +msgid "You are currently bisecting, started from branch '%s'." +msgstr "'ì´ë±ë¶íë ì¤ì ëë¤. '%s' ë¸ëì¹ë¶í° ìì." + +#: wt-status.c:1257 +msgid "You are currently bisecting." +msgstr "'ì´ë±ë¶íë ì¤ì ëë¤." + +#: wt-status.c:1260 +msgid " (use \"git bisect reset\" to get back to the original branch)" +msgstr " (ìë ë¸ëì¹ë¡ ëìê°ë ¤ë©´ \"git bisect reset\"ì ì¬ì©íììì¤)" + +#: wt-status.c:1438 +msgid "On branch " +msgstr "íì¬ ë¸ëì¹ " + +#: wt-status.c:1444 +msgid "interactive rebase in progress; onto " +msgstr "ëíí ë¦¬ë² ì´ì¤ ì§í ì¤. ê° ìì¹ë " + +#: wt-status.c:1446 +msgid "rebase in progress; onto " +msgstr "ë¦¬ë² ì´ì¤ ì§í ì¤. ê° ìì¹ë " + +#: wt-status.c:1451 +msgid "HEAD detached at " +msgstr "HEADê° ë¤ì ìì¹ìì ë¶ë¦¬: " + +#: wt-status.c:1453 +msgid "HEAD detached from " +msgstr "HEADê° ë¤ìì¼ë¡ë¶í° ë¶ë¦¬: " + +#: wt-status.c:1456 +msgid "Not currently on any branch." +msgstr "íì¬ ì´ë¤ ë¸ëì¹ë ì¬ì©íì§ ìì." + +#: wt-status.c:1474 +msgid "Initial commit" +msgstr "ìµì´ 커ë°" + +#: wt-status.c:1488 +msgid "Untracked files" +msgstr "ì¶ì íì§ ìë íì¼" + +#: wt-status.c:1490 +msgid "Ignored files" +msgstr "무ìí íì¼" + +#: wt-status.c:1494 +#, c-format +msgid "" +"It took %.2f seconds to enumerate untracked files. 'status -uno'\n" +"may speed it up, but you have to be careful not to forget to add\n" +"new files yourself (see 'git help status')." +msgstr "" +"ì¶ì íì§ ìë íì¼ì 모ë íì¸íëë° %.2fì´ê° ê±¸ë ¸ìµëë¤.\n" +"'status -uno' ìµì ì ì°ë©´ 빨ë¼ì§ ìë ìì§ë§, ì íì¼ì\n" +"ì§ì ì°¾ìì ì¶ê°í´ì¼ í©ëë¤. ('git help status' ì°¸ê³ )" + +#: wt-status.c:1500 +#, c-format +msgid "Untracked files not listed%s" +msgstr "ì¶ì íì§ ìë íì¼ì ë³´ì§ ììµëë¤%s" + +#: wt-status.c:1502 +msgid " (use -u option to show untracked files)" +msgstr " (ì¶ì íì§ ìë íì¼ì ë³´ë ¤ë©´ -u ìµì ì ì¬ì©íììì¤)" + +#: wt-status.c:1508 +msgid "No changes" +msgstr "ë³ê²½ ì¬í ìì" + +#: wt-status.c:1513 +#, c-format +msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" +msgstr "" +"커ë°í ë³ê²½ ì¬íì ì¶ê°íì§ ìììµëë¤ (\"git add\" ë°/ëë \"git commit -a" +"\"를\n" +"ì¬ì©íììì¤)\n" + +#: wt-status.c:1516 +#, c-format +msgid "no changes added to commit\n" +msgstr "커ë°í ë³ê²½ ì¬íì ì¶ê°íì§ ìììµëë¤\n" + +#: wt-status.c:1519 +#, c-format +msgid "" +"nothing added to commit but untracked files present (use \"git add\" to " +"track)\n" +msgstr "" +"커ë°í ì¬íì ì¶ê°íì§ ììì§ë§ ì¶ì íì§ ìë íì¼ì´ ììµëë¤ (ì¶ì íë ¤ë©´ " +"\"git\n" +"add\"를 ì¬ì©íììì¤)\n" + +#: wt-status.c:1522 +#, c-format +msgid "nothing added to commit but untracked files present\n" +msgstr "커ë°í ì¬íì ì¶ê°íì§ ììì§ë§ ì¶ì íì§ ìë íì¼ì´ ììµëë¤\n" + +#: wt-status.c:1525 +#, c-format +msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" +msgstr "" +"커ë°í ì¬í ìì (íì¼ì ë§ë¤ê±°ë ë³µì¬íê³ \"git add\"를 ì¬ì©íë©´ ì¶ì í©ë" +"ë¤)\n" + +#: wt-status.c:1528 wt-status.c:1533 +#, c-format +msgid "nothing to commit\n" +msgstr "커ë°í ì¬í ìì\n" + +#: wt-status.c:1531 +#, c-format +msgid "nothing to commit (use -u to show untracked files)\n" +msgstr "" +"커ë°í ì¬í ìì (ì¶ì íì§ ìë íì¼ì ë³´ë ¤ë©´ -u ìµì ì ì¬ì©íììì¤)\n" + +#: wt-status.c:1535 +#, c-format +msgid "nothing to commit, working directory clean\n" +msgstr "커ë°í ì¬í ìì, ìì í´ë 깨ëí¨\n" + +#: wt-status.c:1642 +msgid "Initial commit on " +msgstr "ìµì´ 커ë°, ë¸ëì¹: " + +#: wt-status.c:1646 +msgid "HEAD (no branch)" +msgstr "HEAD (ë¸ëì¹ ìì)" + +#: wt-status.c:1675 +msgid "gone" +msgstr "ìì" + +#: wt-status.c:1677 wt-status.c:1685 +msgid "behind " +msgstr "ë¤ì: " + +#: compat/precompose_utf8.c:56 builtin/clone.c:408 +#, c-format +msgid "failed to unlink '%s'" +msgstr "'%s' íì¼ ìì ì ì¤í¨íìµëë¤" + +#: builtin/add.c:22 +msgid "git add [<options>] [--] <pathspec>..." +msgstr "git add [<ìµì >] [--] <ê²½ë¡ëª ì¸>..." + +#: builtin/add.c:65 +#, c-format +msgid "unexpected diff status %c" +msgstr "ììì¹ ëª»í diff ìí %c" + +#: builtin/add.c:70 builtin/commit.c:278 +msgid "updating files failed" +msgstr "íì¼ ì ë°ì´í¸ê° ì¤í¨íìµëë¤" + +#: builtin/add.c:80 +#, c-format +msgid "remove '%s'\n" +msgstr "'%s' ì ê±°\n" + +#: builtin/add.c:134 +msgid "Unstaged changes after refreshing the index:" +msgstr "ì¸ë±ì¤ë¥¼ ìë¡ ê³ ì¹ ë¤ì ì»¤ë° íìíì§ ìì ë³ê²½ ì¬í:" + +#: builtin/add.c:194 builtin/rev-parse.c:796 +msgid "Could not read the index" +msgstr "ì¸ë±ì¤ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/add.c:205 +#, c-format +msgid "Could not open '%s' for writing." +msgstr "'%s' íì¼ì ì°ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤." + +#: builtin/add.c:209 +msgid "Could not write patch" +msgstr "í¨ì¹ë¥¼ ì¸ ì ììµëë¤" + +#: builtin/add.c:212 +msgid "editing patch failed" +msgstr "í¨ì¹ í¸ì§ì ì¤í¨íìµëë¤" + +#: builtin/add.c:215 +#, c-format +msgid "Could not stat '%s'" +msgstr "'%s'ì(를) stat()í ì ììµëë¤" + +#: builtin/add.c:217 +msgid "Empty patch. Aborted." +msgstr "ë¹ í¨ì¹. ì¤ì§." + +#: builtin/add.c:222 +#, c-format +msgid "Could not apply '%s'" +msgstr "'%s'ì(를) ì ì©í ì ììµëë¤" + +#: builtin/add.c:232 +msgid "The following paths are ignored by one of your .gitignore files:\n" +msgstr "ë¤ì ê²½ë¡ë .gitignore íì¼ ì¤ íë ë문ì 무ìí©ëë¤:\n" + +#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110 +#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543 +#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162 +msgid "dry run" +msgstr "ê°ì§ë¡ ì¤í" + +#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19 +#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558 +#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114 +msgid "be verbose" +msgstr "ìì¸í íì" + +#: builtin/add.c:252 +msgid "interactive picking" +msgstr "ëíìì¼ë¡ ê³ ë¦ ëë¤" + +#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286 +msgid "select hunks interactively" +msgstr "ëíìì¼ë¡ ë³ê²½ë ë¶ë¶ì ì íí©ëë¤" + +#: builtin/add.c:254 +msgid "edit current diff and apply" +msgstr "íì¬ diff를 í¸ì§íê³ ì ì©í©ëë¤" + +#: builtin/add.c:255 +msgid "allow adding otherwise ignored files" +msgstr "무ìíë íì¼ì ì¶ê°ë¥¼ íì©í©ëë¤" + +#: builtin/add.c:256 +msgid "update tracked files" +msgstr "ì¶ì ëë íì¼ì ì ë°ì´í¸í©ëë¤" + +#: builtin/add.c:257 +msgid "record only the fact that the path will be added later" +msgstr "ëì¤ì ì¶ê°í ê²ì´ë¼ë ì¬ì¤ë§ 기ë¡í©ëë¤" + +#: builtin/add.c:258 +msgid "add changes from all tracked and untracked files" +msgstr "ì¶ì ëê³ ì¶ì ëì§ ìë 모ë íì¼ì ë³ê²½ ì¬íì ì¶ê°í©ëë¤" + +#: builtin/add.c:261 +msgid "ignore paths removed in the working tree (same as --no-all)" +msgstr "ìì í´ëìì ì ê±°í ê²½ë¡ë¥¼ 무ìí©ëë¤ (--no-allê³¼ ëì¼)" + +#: builtin/add.c:263 +msgid "don't add, only refresh the index" +msgstr "ì¶ê°íì§ ìê³ ì¸ë±ì¤ë§ ìë¡ ê³ ì¹©ëë¤" + +#: builtin/add.c:264 +msgid "just skip files which cannot be added because of errors" +msgstr "ì¤ë¥ ë문ì ì¶ê°í ì ìë íì¼ì ê±´ëëëë¤" + +#: builtin/add.c:265 +msgid "check if - even missing - files are ignored in dry run" +msgstr "ê°ì§ë¡ ì¤ííì ë íì¼ì 무ìíëì§ íì¸í©ëë¤" + +#: builtin/add.c:287 +#, c-format +msgid "Use -f if you really want to add them.\n" +msgstr "ì ë§ë¡ ì¶ê°íë ¤ë©´ -f ìµì ì ì¬ì©íììì¤.\n" + +#: builtin/add.c:294 +msgid "adding files failed" +msgstr "íì¼ ì¶ê°ê° ì¤í¨íìµëë¤" + +#: builtin/add.c:330 +msgid "-A and -u are mutually incompatible" +msgstr "-A ë° -u ìµì ì ìë¡ í¸íëì§ ììµëë¤" + +#: builtin/add.c:337 +msgid "Option --ignore-missing can only be used together with --dry-run" +msgstr "" +"--ignore-missing ìµì ì --dry-run ìµì ê³¼ ê°ì´ ì¬ì©í ê²½ì°ìë§ ì¸ ì ììµëë¤." + +#: builtin/add.c:352 +#, c-format +msgid "Nothing specified, nothing added.\n" +msgstr "ì무 ê²ë ì§ì íì§ ììì¼ë¯ë¡ ì무 ê²ë ì¶ê°íì§ ììµëë¤.\n" + +#: builtin/add.c:353 +#, c-format +msgid "Maybe you wanted to say 'git add .'?\n" +msgstr "'git add .' ëª ë ¹ì ì¤ííë ¤ê³ í ê² ìëììµëê¹?\n" + +#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938 +#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298 +#: builtin/submodule--helper.c:40 +msgid "index file corrupt" +msgstr "ì¸ë±ì¤ íì¼ì´ ììëììµëë¤" + +#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430 +msgid "Unable to write new index file" +msgstr "ì ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤" + +#: builtin/am.c:42 +#, c-format +msgid "could not stat %s" +msgstr "%sì ëí´ stat()í ì ììµëë¤" + +#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077 +#, c-format +msgid "could not read '%s'" +msgstr "'%s'ìì ì½ì ì ììµëë¤" + +#: builtin/am.c:445 +msgid "could not parse author script" +msgstr "ìì±ì ì¤í¬ë¦½í¸ë¥¼ íì±í ì ììµëë¤" + +#: builtin/am.c:522 +#, c-format +msgid "'%s' was deleted by the applypatch-msg hook" +msgstr "applypatch-msg í ë문ì '%s'ì´(ê°) ìì ëììµëë¤." + +#: builtin/am.c:563 builtin/notes.c:300 +#, c-format +msgid "Malformed input line: '%s'." +msgstr "ì못ë íìì ì ë ¥ ì¤: '%s'." + +#: builtin/am.c:600 builtin/notes.c:315 +#, c-format +msgid "Failed to copy notes from '%s' to '%s'" +msgstr "'%s'ìì '%s'(ì¼)ë¡ ë ¸í¸ë¥¼ ë³µì¬íëë° ì¤í¨íìµëë¤" + +#: builtin/am.c:626 +msgid "fseek failed" +msgstr "fseek ì¤í¨" + +#: builtin/am.c:787 builtin/am.c:875 +#, c-format +msgid "could not open '%s' for reading: %s" +msgstr "'%s'ì(를) ì½ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤: %s" + +#: builtin/am.c:794 +#, c-format +msgid "could not open '%s' for writing: %s" +msgstr "'%s'ì(를) ì°ê¸°ì©ì¼ë¡ ì´ ì ììµëë¤: %s" + +#: builtin/am.c:803 +#, c-format +msgid "could not parse patch '%s'" +msgstr "'%s' í¨ì¹ë¥¼ íì±í ì ììµëë¤" + +#: builtin/am.c:868 +msgid "Only one StGIT patch series can be applied at once" +msgstr "íë²ì íëì StGIT í¨ì¹ ì리ì¦ë§ ì ì©í ì ììµëë¤" + +#: builtin/am.c:916 +msgid "invalid timestamp" +msgstr "ìê°ì´ ì못ëììµëë¤" + +#: builtin/am.c:919 builtin/am.c:927 +msgid "invalid Date line" +msgstr "Date ì¤ì´ ì못ëììµëë¤" + +#: builtin/am.c:924 +msgid "invalid timezone offset" +msgstr "ìê°ë ì¤íì ì´ ì못ëììµëë¤" + +#: builtin/am.c:1011 +msgid "Patch format detection failed." +msgstr "í¨ì¹ íì ê²ìì´ ì¤í¨íìµëë¤." + +#: builtin/am.c:1016 builtin/clone.c:373 +#, c-format +msgid "failed to create directory '%s'" +msgstr "'%s' ëë í°ë¦¬ ë§ë¤ê¸°ê° ì¤í¨íìµëë¤" + +#: builtin/am.c:1020 +msgid "Failed to split patches." +msgstr "í¨ì¹ë¥¼ 쪼ê°ëë° ì¤í¨íìµëë¤." + +#: builtin/am.c:1152 builtin/commit.c:363 +msgid "unable to write index file" +msgstr "ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤" + +#: builtin/am.c:1203 +#, c-format +msgid "When you have resolved this problem, run \"%s --continue\"." +msgstr "ì´ ë¬¸ì 를 í´ê²°íì ë \"%s --continue\"를 ì¤ííììì¤." + +#: builtin/am.c:1204 +#, c-format +msgid "If you prefer to skip this patch, run \"%s --skip\" instead." +msgstr "ì´ í¨ì¹ë¥¼ ê±´ëë°ë ¤ë©´, ê·¸ ëì \"%s --skip\"ì ì¤ííììì¤." + +#: builtin/am.c:1205 +#, c-format +msgid "To restore the original branch and stop patching, run \"%s --abort\"." +msgstr "" +"ìë ë¸ëì¹ë¥¼ 복구íê³ í¨ì¹ ì ì©ì ì¤ì§íë ¤ë©´ \"%s --abort\"를 ì¤ííììì¤." + +#: builtin/am.c:1343 +msgid "Patch is empty. Was it split wrong?" +msgstr "í¨ì¹ê° ë¹ì´ ììµëë¤. ì못 쪼ê°ì§ì§ ììëì?" + +#: builtin/am.c:1417 builtin/log.c:1347 +#, c-format +msgid "invalid ident line: %s" +msgstr "ì못ë ì ì ì¤: %s" + +#: builtin/am.c:1444 +#, c-format +msgid "unable to parse commit %s" +msgstr "%s 커ë°ì íì±í ì ììµëë¤" + +#: builtin/am.c:1646 +msgid "Repository lacks necessary blobs to fall back on 3-way merge." +msgstr "ì ì¥ìì 3-ë°©í¥ ë³í©ì¼ë¡ ëì í ë íìí ë¸ë¡ì´ ììµëë¤." + +#: builtin/am.c:1648 +msgid "Using index info to reconstruct a base tree..." +msgstr "ì¸ë±ì¤ ì 보를 ì¬ì©í´ 기본 í¸ë¦¬ë¥¼ ë¤ì ë§ëëë¤..." + +#: builtin/am.c:1667 +msgid "" +"Did you hand edit your patch?\n" +"It does not apply to blobs recorded in its index." +msgstr "" +"í¨ì¹ë¥¼ ì§ì í¸ì§íì ¨ìµëê¹?\n" +"ì´ í¨ì¹ë ì¸ë±ì¤ì 기ë¡ë ë¸ë¡ìë ì ì©ëì§ ììµëë¤." + +#: builtin/am.c:1673 +msgid "Falling back to patching base and 3-way merge..." +msgstr "ë² ì´ì¤ í¨ì¹ ì ì© ë° 3-ë°©í¥ ë³í©ì¼ë¡ ëì í©ëë¤..." + +#: builtin/am.c:1688 +msgid "Failed to merge in the changes." +msgstr "ë³ê²½ ì¬íìì ë³í©íëë° ì¤í¨íìµëë¤." + +#: builtin/am.c:1712 builtin/merge.c:632 +msgid "git write-tree failed to write a tree" +msgstr "git write-treeê° í¸ë¦¬ë¥¼ ì°ëë° ì¤í¨íìµëë¤" + +#: builtin/am.c:1719 +msgid "applying to an empty history" +msgstr "ë¹ ì»¤ë° ë´ìì ëí´ ì ì©í©ëë¤" + +#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829 +#: builtin/merge.c:854 +msgid "failed to write commit object" +msgstr "ì»¤ë° ì¤ë¸ì í¸ë¥¼ ì°ëë° ì¤í¨íìµëë¤" + +#: builtin/am.c:1764 builtin/am.c:1768 +#, c-format +msgid "cannot resume: %s does not exist." +msgstr "ë¤ì ììí ì ììµëë¤: %sì´(ê°) ììµëë¤." + +#: builtin/am.c:1784 +msgid "cannot be interactive without stdin connected to a terminal." +msgstr "" +"í°ë¯¸ëì íì¤ ì ë ¥ì´ ì°ê²°ëì§ ìì ìíìì ëííì¼ë¡ ì¤íí ì ììµëë¤." + +#: builtin/am.c:1789 +msgid "Commit Body is:" +msgstr "ì»¤ë° ë³¸ë¬¸ì:" + +#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] +#. in your translation. The program will only accept English +#. input at this point. +#. +#: builtin/am.c:1799 +msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: " +msgstr "ì ì©? ì[y]/ìëì¤[n]/í¸ì§[e]/í¨ì¹ 보기[v]/모ë ì ì©[a]: " + +#: builtin/am.c:1849 +#, c-format +msgid "Dirty index: cannot apply patches (dirty: %s)" +msgstr "ë³ê²½ë ì¸ë±ì¤: í¨ì¹ë¥¼ ì ì©í ì ììµëë¤ (dirty: %s)" + +#: builtin/am.c:1884 builtin/am.c:1955 +#, c-format +msgid "Applying: %.*s" +msgstr "ì ì©íë ì¤: %.*s" + +#: builtin/am.c:1900 +msgid "No changes -- Patch already applied." +msgstr "ë³ê²½ ì¬í ìì -- í¨ì¹ê° ì´ë¯¸ ì ì©ëììµëë¤." + +#: builtin/am.c:1908 +#, c-format +msgid "Patch failed at %s %.*s" +msgstr "í¨ì¹ê° %s %.*s ìì¹ìì ì¤í¨íìµëë¤" + +#: builtin/am.c:1914 +#, c-format +msgid "The copy of the patch that failed is found in: %s" +msgstr "ì¤í¨í í¨ì¹ì ë³µì¬ë³¸ì´ ë¤ì ìì¹ì ììµëë¤: %s" + +#: builtin/am.c:1958 +msgid "" +"No changes - did you forget to use 'git add'?\n" +"If there is nothing left to stage, chances are that something else\n" +"already introduced the same changes; you might want to skip this patch." +msgstr "" +"ë³ê²½ ì¬íì´ ììµëë¤ - 'git add' ì¬ì©ì ìì¼ì ¨ìµëê¹?\n" +"커ë°ì¼ë¡ íìí ì¬íì´ ë¨ì ìì§ ìì¼ë©´, ì´ë¯¸ ê°ì í¨ì¹ìì ì ì©ë\n" +"ê²½ì°ì¼ ìë ììµëë¤. ê·¸ë° ê²½ì°ìë ì´ í¨ì¹ë¥¼ ê±´ëë°ë©´ ë©ëë¤." + +#: builtin/am.c:1965 +msgid "" +"You still have unmerged paths in your index.\n" +"Did you forget to use 'git add'?" +msgstr "" +"ì¸ë±ì¤ì ë³í©íì§ ìì ê²½ë¡ê° ë¨ì ììµëë¤.\n" +"'git add' ì¬ì©ì ìì§ ìì¼ì ¨ìµëê¹?" + +#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308 +#: builtin/reset.c:316 +#, c-format +msgid "Could not parse object '%s'." +msgstr "'%s' ì¤ë¸ì í¸ë¥¼ íì±í ì ììµëë¤." + +#: builtin/am.c:2125 +msgid "failed to clean index" +msgstr "ì¸ë±ì¤ ì§ì°ê¸°ì ì¤í¨íìµëë¤" + +#: builtin/am.c:2159 +msgid "" +"You seem to have moved HEAD since the last 'am' failure.\n" +"Not rewinding to ORIG_HEAD" +msgstr "" +"ë§ì§ë§ 'am' ì¤í¨ ì´í HEAD를 ì®ê¸´ ê² ê°ìµëë¤.\n" +"ORIG_HEADë¡ ëëë¦¬ì§ ììµëë¤." + +#: builtin/am.c:2220 +#, c-format +msgid "Invalid value for --patch-format: %s" +msgstr "--patch-format ìµì ì ëí´ ì못ë ê°: %s" + +#: builtin/am.c:2253 +msgid "git am [<options>] [(<mbox>|<Maildir>)...]" +msgstr "git am [<ìµì >] [(<mbox>|<Maildir>)...]" + +#: builtin/am.c:2254 +msgid "git am [<options>] (--continue | --skip | --abort)" +msgstr "git am [<ìµì >] (--continue | --skip | --abort)" + +#: builtin/am.c:2260 +msgid "run interactively" +msgstr "ëííì¼ë¡ ì¤íí©ëë¤" + +#: builtin/am.c:2262 +msgid "historical option -- no-op" +msgstr "ì무 ëìë íì§ ììµëë¤ (과거ë¶í° ììë ìµì )" + +#: builtin/am.c:2264 +msgid "allow fall back on 3way merging if needed" +msgstr "íìíë©´ 3-ë°©í¥ ë³í©ì¼ë¡ ëì íëë¡ íì©í©ëë¤" + +#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57 +#: builtin/repack.c:171 +msgid "be quiet" +msgstr "ê°ëµí íìí©ëë¤" + +#: builtin/am.c:2267 +msgid "add a Signed-off-by line to the commit message" +msgstr "ì»¤ë° ë©ìì§ì Signed-off-by ì¤ì ë¨ê¹ëë¤" + +#: builtin/am.c:2270 +msgid "recode into utf8 (default)" +msgstr "UTF-8 ì¸ì½ë©ì¼ë¡ ë³íí©ëë¤ (기본ê°)" + +#: builtin/am.c:2272 +msgid "pass -k flag to git-mailinfo" +msgstr "git-mailinfoì -k ìµì ì ìëë¤" + +#: builtin/am.c:2274 +msgid "pass -b flag to git-mailinfo" +msgstr "git-mailinfoì -b ìµì ì ìëë¤" + +#: builtin/am.c:2276 +msgid "pass -m flag to git-mailinfo" +msgstr "git-mailinfoì -m ìµì ì ìëë¤" + +#: builtin/am.c:2278 +msgid "pass --keep-cr flag to git-mailsplit for mbox format" +msgstr "mbox íìì ëí´ git-mailsplitì --keep-cr ìµì ì ì¬ì©í©ëë¤" + +#: builtin/am.c:2281 +msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr" +msgstr "" +"am.keepcrì 무ê´íê² git-mailsplitì --keep-cr ìµì ì ì¬ì©íì§ ììµëë¤." + +#: builtin/am.c:2284 +msgid "strip everything before a scissors line" +msgstr "ì ì·¨ì ìì 모ë ì¬íì 무ìí©ëë¤" + +#: builtin/am.c:2285 builtin/apply.c:4554 +msgid "action" +msgstr "ëì" + +#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295 +#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307 +#: builtin/am.c:2313 +msgid "pass it through git-apply" +msgstr "git-applyì ëê¹ëë¤" + +#: builtin/am.c:2294 builtin/apply.c:4578 +msgid "root" +msgstr "ìµìì" + +#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516 +#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93 +#: builtin/pull.c:167 builtin/submodule--helper.c:78 +#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169 +msgid "path" +msgstr "ê²½ë¡" + +#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669 +#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127 +#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645 +#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132 +#: parse-options.h:134 parse-options.h:244 +msgid "n" +msgstr "n" + +#: builtin/am.c:2306 builtin/apply.c:4522 +msgid "num" +msgstr "ê°ì" + +#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438 +#: builtin/tag.c:372 +msgid "format" +msgstr "íì" + +#: builtin/am.c:2310 +msgid "format the patch(es) are in" +msgstr "í¨ì¹ì íì" + +#: builtin/am.c:2316 +msgid "override error message when patch failure occurs" +msgstr "í¨ì¹ ì¤í¨ê° ë°ìíì ë ì¤ë¥ ë©ìì§ ëì ì¬ì©í©ëë¤" + +#: builtin/am.c:2318 +msgid "continue applying patches after resolving a conflict" +msgstr "충ëì í´ê²°í ë¤ì í¨ì¹ ì ì©ì ê³ìí©ëë¤" + +#: builtin/am.c:2321 +msgid "synonyms for --continue" +msgstr "--continue ìµì ê³¼ ëì¼" + +#: builtin/am.c:2324 +msgid "skip the current patch" +msgstr "íì¬ í¨ì¹ ê±´ëë°ê¸°" + +#: builtin/am.c:2327 +msgid "restore the original branch and abort the patching operation." +msgstr "ìë ë¸ëì¹ë¥¼ 복구íê³ í¨ì¹ ì ì© ìì ì ì¤ì§í©ëë¤." + +# NOTE: ìµì ì ì미ë ì´ê² ë§ë¤. ì문ììë ì¬ì©ìê° +# --committer-date-is-author-dateë¼ë ìµì ì ë³´ê³ ì미를 ì ì ìë¤ê³ ê°ì íê³ ìë¤. +#: builtin/am.c:2331 +msgid "lie about committer date" +msgstr "ì»¤ë¯¸í° ìê°ì ìì±ì ìê°ì¼ë¡ ë£ìµëë¤" + +#: builtin/am.c:2333 +msgid "use current timestamp for author date" +msgstr "íì¬ ìê°ì ìì±ì ìê°ì¼ë¡ ì¬ì©í©ëë¤" + +#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225 +#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355 +msgid "key-id" +msgstr "í¤-ID" + +#: builtin/am.c:2336 +msgid "GPG-sign commits" +msgstr "GPG ìëª ì»¤ë°" + +#: builtin/am.c:2339 +msgid "(internal use for git-rebase)" +msgstr "(git-rebase를 ìí ë´ë¶ ì©ë)" + +#: builtin/am.c:2354 +msgid "" +"The -b/--binary option has been a no-op for long time, and\n" +"it will be removed. Please do not use it anymore." +msgstr "" +"-b/--binary ìµì ì ì¤ë ìê° ëì ì무 ëìë íì§ ììì¼ë¯ë¡, ì´\n" +"ìµì ì ì ê±°ë ìì ì ëë¤. ì´ì ì¬ì©íì§ ë§ììì¤." + +#: builtin/am.c:2361 +msgid "failed to read the index" +msgstr "ì¸ë±ì¤ ì½ê¸°ì ì¤í¨íìµëë¤" + +#: builtin/am.c:2376 +#, c-format +msgid "previous rebase directory %s still exists but mbox given." +msgstr "ì´ì ë¦¬ë² ì´ì¤ ëë í°ë¦¬ %sì´(ê°) ìì§ ìê³ mbox를 ì§ì íìµëë¤." + +#: builtin/am.c:2400 +#, c-format +msgid "" +"Stray %s directory found.\n" +"Use \"git am --abort\" to remove it." +msgstr "" +"ë²ì´ë %s ëë í°ë¦¬ê° ë°ê²¬ëììµëë¤.\n" +"ì ê±°íë ¤ë©´ \"git am --abort\"를 ì¬ì©íììì¤." + +#: builtin/am.c:2406 +msgid "Resolve operation not in progress, we are not resuming." +msgstr "í´ì ìì ì´ ì§í ì¤ì ëë¤. ë¤ì ììíì§ ììµëë¤." + +#: builtin/apply.c:59 +msgid "git apply [<options>] [<patch>...]" +msgstr "git apply [<ìµì >] [<í¨ì¹>...]" + +#: builtin/apply.c:111 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "ì ì ìë 공백 ìµì '%s'" + +#: builtin/apply.c:126 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "ì ì ìë 공백 무ì ìµì '%s'" + +#: builtin/apply.c:818 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "íìì¤í¬í ì ê·ìì ì¤ë¹í ì ììµëë¤ (%s)" + +#: builtin/apply.c:827 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "regexec()ìì ë¤ì ì ë ¥ì ëí´ %dë²ì 리í´íìµëë¤: %s" + +#: builtin/apply.c:908 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "í¨ì¹ì %dë² ì¤ì íì¼ ì´ë¦ì ì°¾ì ì ììµëë¤" + +#: builtin/apply.c:940 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "git apply: ì못ë git-diff - %2$dë² ì¤ìì /dev/nullì 기ëíì§ë§, '%1$s'ì´(ê°) ììµëë¤" + +#: builtin/apply.c:944 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "git apply: ì못ë git-diff - %dë² ì¤ì ì íì¼ ì´ë¦ì´ ì¬ë°ë¥´ì§ ììµëë¤" + +#: builtin/apply.c:945 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "git apply: ì못ë git-diff - %dë² ì¤ì ìì íì¼ ì´ë¦ì´ ì¬ë°ë¥´ì§ ììµëë¤" + +#: builtin/apply.c:952 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "git apply: ì못ë git-diff - %dë² ì¤ìì /dev/nullì 기ëíìµëë¤" + +#: builtin/apply.c:1415 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "recount: ììì¹ ëª»í ì¤: %.*s" + +#: builtin/apply.c:1472 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "%dë² ì¤ì í¤ë ìë í¨ì¹ ë¶ë¶: %.*s" + +#: builtin/apply.c:1489 +#, c-format +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "" +"ê²½ë¡ ì´ë¦ ë¶ë¶ìì %dê°ë¥¼ ì ê±°ë¼ ë git diff í¤ëì íì¼ ì´ë¦ ì ë³´ê° ììµë" +"ë¤. (%dë² ì¤)" + +#: builtin/apply.c:1655 +msgid "new file depends on old contents" +msgstr "ì íì¼ì´ ìì ë´ì©ì ìì¡´í©ëë¤" + +#: builtin/apply.c:1657 +msgid "deleted file still has contents" +msgstr "ìì í íì¼ì ìì§ ë´ì©ì´ ë¤ì´ ììµëë¤" + +#: builtin/apply.c:1683 +#, c-format +msgid "corrupt patch at line %d" +msgstr "í¨ì¹ê° %dë² ì¤ìì ë§ê°ì¡ìµëë¤" + +#: builtin/apply.c:1719 +#, c-format +msgid "new file %s depends on old contents" +msgstr "ì íì¼ %sì´(ê°) ìì ë´ì©ì ìì¡´í©ëë¤" + +#: builtin/apply.c:1721 +#, c-format +msgid "deleted file %s still has contents" +msgstr "ìì í íì¼ %sì´(ê°) ìì§ ë´ì©ì´ ë¤ì´ ììµëë¤" + +#: builtin/apply.c:1724 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "** ê²½ê³ : %s íì¼ì ë´ì©ì´ ë¹ì´ ìì§ë§ ìì ëì§ ìììµëë¤" + +#: builtin/apply.c:1870 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "%dë² ì¤ì ë°ì´ë리 í¨ì¹ê° ììëììµëë¤: %.*s" + +#: builtin/apply.c:1899 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "%dë² ì¤ì ë°ì´ë리 í¨ì¹ê° ì´í´í ì ììµëë¤" + +#: builtin/apply.c:2050 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "%dë² ì¤ì ì°ë 기 ë°ì´í°ë§ ìë í¨ì¹" + +#: builtin/apply.c:2140 +#, c-format +msgid "unable to read symlink %s" +msgstr "%s ì¬ë³¼ë¦ ë§í¬ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/apply.c:2144 +#, c-format +msgid "unable to open or read %s" +msgstr "%sì(를) ì´ê±°ë ì½ì ì ììµëë¤" + +#: builtin/apply.c:2777 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "ì¤ ììì´ ì못ë¨: '%c'" + +#: builtin/apply.c:2896 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "í¨ì¹ %dë² ë¶ë¶ %dë² ì¤ìì ì±ê³µ (ì¤íì %dì¤)" + +#: builtin/apply.c:2908 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "컨í ì¤í¸ê° (%ld/%ld)ë¡ ì¤ì´ëëë¤. (%dë² ì¤ìì ì ì©)" + +#: builtin/apply.c:2914 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" +"ë¤ìì ê²ìíë ì¤:\n" +"%.*s" + +#: builtin/apply.c:2934 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "'%s'ì ëí ë°ì´ë리 í¨ì¹ ë°ì´í°ê° ììµëë¤" + +#: builtin/apply.c:3035 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "ë°ì´ë리 í¨ì¹ë¥¼ '%s'ì ì ì©í ì ììµëë¤" + +#: builtin/apply.c:3041 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "" +"'%s'ì ëí ë°ì´ë리 í¨ì¹ê° ì¬ë°ë¥´ì§ ìì 결과를 ë§ëëë¤. (기ëí ê° %s, ì¤" +"ì %s)" + +#: builtin/apply.c:3062 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "í¨ì¹ ì¤í¨: %s:%ld" + +#: builtin/apply.c:3186 +#, c-format +msgid "cannot checkout %s" +msgstr "%sì(를) ê°ì ¸ì¬ ì ììµëë¤" + +#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287 +#, c-format +msgid "read of %s failed" +msgstr "%s ì½ê¸°ê° ì¤í¨íìµëë¤" + +#: builtin/apply.c:3239 +#, c-format +msgid "reading from '%s' beyond a symbolic link" +msgstr "ì¬ë³¼ë¦ ë§í¬ ë¤ì ìë '%s' ì½ê¸°" + +#: builtin/apply.c:3267 builtin/apply.c:3489 +#, c-format +msgid "path %s has been renamed/deleted" +msgstr "%s ê²½ë¡ê° ì´ë¦ì´ ë°ëìê±°ë ìì ëììµëë¤" + +#: builtin/apply.c:3348 builtin/apply.c:3503 +#, c-format +msgid "%s: does not exist in index" +msgstr "%s: ì¸ë±ì¤ì ììµëë¤" + +#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: builtin/apply.c:3357 builtin/apply.c:3511 +#, c-format +msgid "%s: does not match index" +msgstr "%s: ì¸ë±ì¤ì ë§ì§ ììµëë¤" + +#: builtin/apply.c:3459 +msgid "removal patch leaves file contents" +msgstr "ì ê±°íë í¨ì¹ ë¤ìì íì¼ ë´ì©ì´ ë¨ììµëë¤" + +#: builtin/apply.c:3528 +#, c-format +msgid "%s: wrong type" +msgstr "%s: ì못ë ì¢ ë¥" + +#: builtin/apply.c:3530 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "%sì ì¢ ë¥ê° %oì´ì§ë§ %oì´(ê°) ëì´ì¼ í©ëë¤" + +#: builtin/apply.c:3689 builtin/apply.c:3691 +#, c-format +msgid "invalid path '%s'" +msgstr "ì못ë ê²½ë¡ '%s'" + +#: builtin/apply.c:3746 +#, c-format +msgid "%s: already exists in index" +msgstr "%s: ì´ë¯¸ ì¸ë±ì¤ì ììµëë¤" + +#: builtin/apply.c:3749 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s: ì´ë¯¸ ìì ëë í°ë¦¬ì ììµëë¤" + +#: builtin/apply.c:3769 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "%2$sì ì 모ë(%1$o)ê° ìì 모ë(%3$o)ì ë¤ë¦ ëë¤" + +#: builtin/apply.c:3774 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "%2$sì ì 모ë(%1$o)ê° %4$sì ìì 모ë(%3$o)ì ë¤ë¦ ëë¤" + +#: builtin/apply.c:3794 +#, c-format +msgid "affected file '%s' is beyond a symbolic link" +msgstr "ìí¥ ë°ë '%s' íì¼ì´ ì¬ë³¼ë¦ ë§í¬ ë¤ì ììµëë¤" + +#: builtin/apply.c:3798 +#, c-format +msgid "%s: patch does not apply" +msgstr "%s: í¨ì¹ë¥¼ ì ì©íì§ ììµëë¤" + +#: builtin/apply.c:3812 +#, c-format +msgid "Checking patch %s..." +msgstr "%s í¨ì¹ë¥¼ íì¸íë ì¤ì ëë¤..." + +#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "ê²½ë¡ '%s'ì ëí´ make_cache_entry ì¤í¨" + +#: builtin/apply.c:4048 +#, c-format +msgid "unable to remove %s from index" +msgstr "ì¸ë±ì¤ìì %sì(를) ì ê±°í ì ììµëë¤" + +#: builtin/apply.c:4077 +#, c-format +msgid "corrupt patch for submodule %s" +msgstr "íì 모ë %sì ëí´ ììë í¨ì¹" + +#: builtin/apply.c:4081 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "ìë¡ ë§ë íì¼ '%s'ì ëí´ stat()í ì ììµëë¤" + +#: builtin/apply.c:4086 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "ìë¡ ë§ë íì¼ '%s'ì ëí´ ìë¹ ì ì¥ì를 ë§ë¤ ì ììµëë¤" + +#: builtin/apply.c:4089 builtin/apply.c:4197 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "%sì ëí´ ìºì í목ì ì¶ê°í ì ììµëë¤" + +#: builtin/apply.c:4122 +#, c-format +msgid "closing file '%s'" +msgstr "'%s' íì¼ì ë«ë ì¤ì ëë¤" + +#: builtin/apply.c:4171 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "'%s' íì¼ì ì¸ ì ììµëë¤ ('%o' 모ë)" + +#: builtin/apply.c:4258 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "%s í¨ì¹ ê¹ëíê² ì ì©." + +#: builtin/apply.c:4266 +msgid "internal error" +msgstr "ë´ë¶ ì¤ë¥" + +#: builtin/apply.c:4269 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "%%s í¨ì¹ë¥¼ (%dê° ê±°ë¶) ì ì©..." + +#: builtin/apply.c:4279 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "truncating .rej íì¼ ì´ë¦ì '%.*s.rej'(ì¼)ë¡ ìë¦" + +#: builtin/apply.c:4300 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "í¨ì¹ ë¶ì #%d ê¹ëíê² ì ì©." + +#: builtin/apply.c:4303 +#, c-format +msgid "Rejected hunk #%d." +msgstr "í¨ì¹ ë¶ì #%d ê±°ë¶ë¨." + +#: builtin/apply.c:4393 +msgid "unrecognized input" +msgstr "ì¸ìí ì ìë ì ë ¥" + +#: builtin/apply.c:4404 +msgid "unable to read index file" +msgstr "ì¸ë±ì¤ íì¼ì ì½ì ì ììµëë¤" + +#: builtin/apply.c:4517 +msgid "don't apply changes matching the given path" +msgstr "주ì´ì§ ê²½ë¡ì í´ë¹íë ë³ê²½ ì¬íì ì ì©íì§ ììµëë¤" + +#: builtin/apply.c:4520 +msgid "apply changes matching the given path" +msgstr "주ì´ì§ ê²½ë¡ì í´ë¹íë ë³ê²½ ì¬íì ì ì©í©ëë¤" + +#: builtin/apply.c:4523 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "ì íµì ì¸ diff ê²½ë¡ ìì <ê°ì>ê°ì ì ì¬ëì(/)를 ì ê±°í©ëë¤" + +#: builtin/apply.c:4526 +msgid "ignore additions made by the patch" +msgstr "í¨ì¹ìì ì¶ê°íë íì¼ì 무ìí©ëë¤" + +#: builtin/apply.c:4528 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "í¨ì¹ë¥¼ ì ì©íë ëì , ì ë ¥ì ëí diffstatì ì¶ë ¥í©ëë¤" + +#: builtin/apply.c:4532 +msgid "show number of added and deleted lines in decimal notation" +msgstr "ìì§ìë¡ ì¶ê° ë° ìì í ì¤ ì를 íìí©ëë¤" + +#: builtin/apply.c:4534 +msgid "instead of applying the patch, output a summary for the input" +msgstr "í¨ì¹ë¥¼ ì ì©íë ëì , ì ë ¥ì ëí ìì½ì ì¶ë ¥í©ëë¤" + +#: builtin/apply.c:4536 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "í¨ì¹ë¥¼ ì ì©íë ëì , í¨ì¹ë¥¼ ì ì© ê°ë¥íì§ íì¸í©ëë¤" + +#: builtin/apply.c:4538 +msgid "make sure the patch is applicable to the current index" +msgstr "íì¬ ì¸ë±ì¤ìì í¨ì¹ê° ì ì© ê°ë¥íì§ íì¸í©ëë¤" + +#: builtin/apply.c:4540 +msgid "apply a patch without touching the working tree" +msgstr "ìì í´ë를 ë°ê¾¸ì§ ìê³ í¨ì¹ë¥¼ ì ì©í©ëë¤" + +#: builtin/apply.c:4542 +msgid "accept a patch that touches outside the working area" +msgstr "ìì ìì ë°ì íì¼ì ë°ê¾¸ë í¨ì¹ë¥¼ íì©í©ëë¤" + +#: builtin/apply.c:4544 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "ê·¸ë¦¬ê³ í¨ì¹ë ì ì©í©ëë¤ (--stat/--summary/--check ìµì ê³¼ ê°ì´ ì¬ì©)" + +#: builtin/apply.c:4546 +msgid "attempt three-way merge if a patch does not apply" +msgstr "í¨ì¹ë¥¼ ì ì©íì§ ìì¼ë©´ 3-ë°©í¥ ë³í©ì ìëí©ëë¤" + +#: builtin/apply.c:4548 +msgid "build a temporary index based on embedded index information" +msgstr "ë´ì¥ ì¸ë±ì¤ ì 보를 ì¬ì©í´ ìì ì¸ë±ì¤ë¥¼ ë§ëëë¤" + +#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412 +msgid "paths are separated with NUL character" +msgstr "ê²½ë¡ë¥¼ NUL 문ìë¡ êµ¬ë¶í©ëë¤" + +#: builtin/apply.c:4553 +msgid "ensure at least <n> lines of context match" +msgstr "ìµìí <n>ì¤ì´ 컨í ì¤í¸ì ì¼ì¹íëì§ íì¸í©ëë¤" + +#: builtin/apply.c:4555 +msgid "detect new or modified lines that have whitespace errors" +msgstr "공백 ì¤ë¥ê° ìë ì¶ê°ëê±°ë ìì ë ì¤ì ì°¾ìµëë¤" + +#: builtin/apply.c:4558 builtin/apply.c:4561 +msgid "ignore changes in whitespace when finding context" +msgstr "컨í ì¤í¸ë¥¼ ì°¾ì ë 공백 ë³ê²½ ì¬íì 무ìí©ëë¤" + +#: builtin/apply.c:4564 +msgid "apply the patch in reverse" +msgstr "í¨ì¹ë¥¼ ë°ë ììë¡ ì ì©í©ëë¤" + +#: builtin/apply.c:4566 +msgid "don't expect at least one line of context" +msgstr "ìµìíì 컨í ì¤í¸ í ì¤ë ìì´ ì ì©í©ëë¤" + +#: builtin/apply.c:4568 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "ê±°ë¶ë í¨ì¹ ë¶ë¶ì ëìëë *.rej íì¼ì ë¨ê²¨ë¡ëë¤" + +#: builtin/apply.c:4570 +msgid "allow overlapping hunks" +msgstr "í¨ì¹ ë¶ë¶ì´ ê²¹ì³ë íì©í©ëë¤" + +#: builtin/apply.c:4573 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "íì¼ ëì ì¤ë°ê¿ì´ ë¹ ì¡ìì ì못 ê²ìí ê²½ì°ì 무ìí©ëë¤" + +#: builtin/apply.c:4576 +msgid "do not trust the line counts in the hunk headers" +msgstr "í¨ì¹ ë¶ë¶ì í¤ëì ì¤ ì를 ì ì©íì§ ììµëë¤" + +#: builtin/apply.c:4579 +msgid "prepend <root> to all filenames" +msgstr "모ë íì¼ ì´ë¦ì <ìµìì>를 ìì ë¶ì ëë¤" + +#: builtin/apply.c:4601 +msgid "--3way outside a repository" +msgstr "ì ì¥ì ë°ìì --3way ìµì ì¬ì©" + +#: builtin/apply.c:4609 +msgid "--index outside a repository" +msgstr "ì ì¥ì ë°ìì --index ìµì ì¬ì©" + +#: builtin/apply.c:4612 +msgid "--cached outside a repository" +msgstr "ì ì¥ì ë°ìì --cached ìµì ì¬ì©" + +#: builtin/apply.c:4631 +#, c-format +msgid "can't open patch '%s'" +msgstr "'%s' í¨ì¹ë¥¼ ì´ ì ììµëë¤" + +#: builtin/apply.c:4645 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "공백 ì¤ë¥ %dê°ë¥¼ ëì´ê°ëë¤" + +#: builtin/apply.c:4651 builtin/apply.c:4661 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "%dì¤ìì 공백 ì¤ë¥ë¥¼ ì¶ê°í©ëë¤." + +#: builtin/archive.c:17 +#, c-format +msgid "could not create archive file '%s'" +msgstr "'%s' ìì¹´ì´ë¸ íì¼ì ë§ë¤ ì ììµëë¤" + +#: builtin/archive.c:20 +msgid "could not redirect output" +msgstr "ì¶ë ¥ ë°©í¥ì ë릴 ì ììµëë¤" + +#: builtin/archive.c:37 +msgid "git archive: Remote with no URL" +msgstr "git archive: URL ìë 리모í¸" + +#: builtin/archive.c:58 +msgid "git archive: expected ACK/NAK, got EOF" +msgstr "git archive: ACK/NAKê° ìì¼ íì§ë§, EOF를 ë°ììµëë¤" + +#: builtin/archive.c:61 +#, c-format +msgid "git archive: NACK %s" +msgstr "git archive: NACK %s" + +#: builtin/archive.c:63 +#, c-format +msgid "remote error: %s" +msgstr "ë¦¬ëª¨í¸ ì¤ë¥: %s" + +#: builtin/archive.c:64 +msgid "git archive: protocol error" +msgstr "git archive: íë¡í ì½ ì¤ë¥" + +#: builtin/archive.c:68 +msgid "git archive: expected a flush" +msgstr "git archive: íì¼ ëì ììí¨" + +#: builtin/bisect--helper.c:7 +msgid "git bisect--helper --next-all [--no-checkout]" +msgstr "git bisect--helper --next-all [--no-checkout]" + +#: builtin/bisect--helper.c:17 +msgid "perform 'git bisect next'" +msgstr "'git bisect next'를 ìíí©ëë¤" + +#: builtin/bisect--helper.c:19 +msgid "update BISECT_HEAD instead of checking out the current commit" +msgstr "íì¬ ì»¤ë°ì ê°ì ¸ì¤ë ëì BISECT_HEAD를 ì ë°ì´í¸í©ëë¤" + +#: builtin/blame.c:32 +msgid "git blame [<options>] [<rev-opts>] [<rev>] [--] <file>" +msgstr "git blame [<ìµì >] [<리ë¹ì -ìµì >] [<리ë¹ì >] [--] <íì¼>" + +#: builtin/blame.c:37 +msgid "<rev-opts> are documented in git-rev-list(1)" +msgstr "<리ë¹ì -ìµì >ì git-rev-list(1)ì ì¤ëª ëì´ ììµëë¤" + +#: builtin/blame.c:2519 +msgid "Show blame entries as we find them, incrementally" +msgstr "blame í목ì ì°¾ìë§ì ì ì§ì ì¼ë¡ íìí©ëë¤" + +#: builtin/blame.c:2520 +msgid "Show blank SHA-1 for boundary commits (Default: off)" +msgstr "ê°ì¥ì리 커ë°ì ëí´ ë¹ SHA-1ì íìí©ëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2521 +msgid "Do not treat root commits as boundaries (Default: off)" +msgstr "ìµìì 커ë°ì ê°ì¥ì리 커ë°ì¼ë¡ ì·¨ê¸íì§ ììµëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2522 +msgid "Show work cost statistics" +msgstr "ìì ë¹ì© íµê³ë¥¼ íìí©ëë¤" + +#: builtin/blame.c:2523 +msgid "Show output score for blame entries" +msgstr "blame í목ì ëí´ ì¶ë ¥ ì ì를 íìí©ëë¤" + +#: builtin/blame.c:2524 +msgid "Show original filename (Default: auto)" +msgstr "ìë íì¼ ì´ë¦ íì (기본ê°: ìë)" + +#: builtin/blame.c:2525 +msgid "Show original linenumber (Default: off)" +msgstr "ìë ì¤ ë²í¸ íì (기본ê°: íì§ ìì)" + +#: builtin/blame.c:2526 +msgid "Show in a format designed for machine consumption" +msgstr "ì»´í¨í° ì²ë¦¬ì©ì¼ë¡ ì¤ê³ë íìì¼ë¡ íìí©ëë¤" + +#: builtin/blame.c:2527 +msgid "Show porcelain format with per-line commit information" +msgstr "ì¤ë§ë¤ ì»¤ë° ì ë³´ê° íìëë ì¬ì©ìì© íìì¼ë¡ íìí©ëë¤" + +#: builtin/blame.c:2528 +msgid "Use the same output mode as git-annotate (Default: off)" +msgstr "git-annotateì ëì¼í íìì ì¬ì©í©ëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2529 +msgid "Show raw timestamp (Default: off)" +msgstr "ë´ë¶ íìì¼ë¡ ìê°ì íìí©ëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2530 +msgid "Show long commit SHA1 (Default: off)" +msgstr "ê¸¸ê² ì»¤ë° SHA1ì íìí©ëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2531 +msgid "Suppress author name and timestamp (Default: off)" +msgstr "ìì±ì ì´ë¦ê³¼ ìê°ì íìíì§ ììµëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2532 +msgid "Show author email instead of name (Default: off)" +msgstr "ìì±ì ì´ë¦ ëì ì ì ìë©ì¼ì íìí©ëë¤ (기본ê°: 꺼ì§)" + +#: builtin/blame.c:2533 +msgid "Ignore whitespace differences" +msgstr "공백 문ì ì°¨ì´ì ì 무ìí©ëë¤" + +#: builtin/blame.c:2534 +msgid "Spend extra cycles to find better match" +msgstr "ë ì¼ì¹íë í목ì ì°¾ëë° ë ìê°ì ì모í©ëë¤" + +#: builtin/blame.c:2535 +msgid "Use revisions from <file> instead of calling git-rev-list" +msgstr "git-rev-list를 í¸ì¶íë ëì <íì¼>ìì 리ë¹ì ì ì¬ì©í©ëë¤" + +#: builtin/blame.c:2536 +msgid "Use <file>'s contents as the final image" +msgstr "<íì¼>ì ë´ì©ì ìµì¢ ì´ë¯¸ì§ë¡ ì¬ì©í©ëë¤" + +#: builtin/blame.c:2537 builtin/blame.c:2538 +msgid "score" +msgstr "ì ì" + +#: builtin/blame.c:2537 +msgid "Find line copies within and across files" +msgstr "íì¼ ë´ë¶ì íì¼ ì¬ì´ì ë³µì¬ë ì¤ì ì°¾ìµëë¤" + +#: builtin/blame.c:2538 +msgid "Find line movements within and across files" +msgstr "íì¼ ë´ë¶ì íì¼ ì¬ì´ì ì®ê²¨ì§ ì¤ì ì°¾ìµëë¤" + +#: builtin/blame.c:2539 +msgid "n,m" +msgstr "n,m" + +#: builtin/blame.c:2539 +msgid "Process only line range n,m, counting from 1" +msgstr "n,mì¤ (1ë² ì¤ë¶í° ìì) ì¬ì´ì ë²ìë§ ì²ë¦¬" + +#. TRANSLATORS: This string is used to tell us the maximum +#. display width for a relative timestamp in "git blame" +#. output. For C locale, "4 years, 11 months ago", which +#. takes 22 places, is the longest among various forms of +#. relative timestamps, but your language may need more or +#. fewer display columns. +#: builtin/blame.c:2620 +msgid "4 years, 11 months ago" +msgstr "4ë 11ë¬ ì " + +#: builtin/branch.c:25 +msgid "git branch [<options>] [-r | -a] [--merged | --no-merged]" +msgstr "git branch [<ìµì >] [-r | -a] [--merged | --no-merged]" + +#: builtin/branch.c:26 +msgid "git branch [<options>] [-l] [-f] <branch-name> [<start-point>]" +msgstr "git branch [<ìµì >] [-l] [-f] <ë¸ëì¹-ì´ë¦> [<ìì-ì§ì >]" + +#: builtin/branch.c:27 +msgid "git branch [<options>] [-r] (-d | -D) <branch-name>..." +msgstr "git branch [<ìµì >] [-r] (-d | -D) <ë¸ëì¹-ì´ë¦>..." + +#: builtin/branch.c:28 +msgid "git branch [<options>] (-m | -M) [<old-branch>] <new-branch>" +msgstr "git branch [<ìµì >] (-m | -M) [<과거-ë¸ëì¹>] <ì-ë¸ëì¹>" + +#: builtin/branch.c:29 +msgid "git branch [<options>] [-r | -a] [--points-at]" +msgstr "git branch [<ìµì >] [-r | -a] [--points-at]" + +#: builtin/branch.c:142 +#, c-format +msgid "" +"deleting branch '%s' that has been merged to\n" +" '%s', but not yet merged to HEAD." +msgstr "" +"'%s' ë¸ëì¹ë¥¼ ìì í©ëë¤. ì´ ë¸ëì¹ë '%s'ì\n" +" ë³í©ëìì§ë§, HEADìë ë³í©ëì§ ìììµëë¤." + +#: builtin/branch.c:146 +#, c-format +msgid "" +"not deleting branch '%s' that is not yet merged to\n" +" '%s', even though it is merged to HEAD." +msgstr "" +"'%s' ë¸ëì¹ë¥¼ ìì íì§ ììµëë¤. ì´ ë¸ëì¹ë '%s'ì\n" +" ë³í©ëì§ ììì§ë§, HEADìë ë³í©ëììµëë¤." + +#: builtin/branch.c:160 +#, c-format +msgid "Couldn't look up commit object for '%s'" +msgstr "'%s'ì ëí ì»¤ë° ì¤ë¸ì í¸ë¥¼ ì°¾ìë³¼ ì ììµëë¤" + +#: builtin/branch.c:164 +#, c-format +msgid "" +"The branch '%s' is not fully merged.\n" +"If you are sure you want to delete it, run 'git branch -D %s'." +msgstr "" +"'%s' ë¸ëì¹ê° ìì í ë³í©ëì§ ìììµëë¤.\n" +"ì ë§ë¡ ìì íë ¤ë©´ 'git branch -D %s' ëª ë ¹ì ì¤ííììì¤." + +#: builtin/branch.c:177 +msgid "Update of config-file failed" +msgstr "config-file ì ë°ì´í¸ê° ì¤í¨íìµëë¤" + +#: builtin/branch.c:205 +msgid "cannot use -a with -d" +msgstr "-a ìµì ì -d ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/branch.c:211 +msgid "Couldn't look up commit object for HEAD" +msgstr "HEADì ëí ì»¤ë° ì¤ë¸ì í¸ë¥¼ ì°¾ìë³¼ ì ììµëë¤" + +#: builtin/branch.c:219 +#, c-format +msgid "Cannot delete the branch '%s' which you are currently on." +msgstr "'%s' ë¸ëì¹ë íì¬ ìì¹í ë¸ëì¹ì´ê¸° ë문ì ìì í ì ììµëë¤." + +#: builtin/branch.c:235 +#, c-format +msgid "remote-tracking branch '%s' not found." +msgstr "ë¦¬ëª¨í¸ ì¶ì '%s' ë¸ëì¹ê° ììµëë¤." + +#: builtin/branch.c:236 +#, c-format +msgid "branch '%s' not found." +msgstr "'%s' ë¸ëì¹ê° ììµëë¤." + +#: builtin/branch.c:251 +#, c-format +msgid "Error deleting remote-tracking branch '%s'" +msgstr "ë¦¬ëª¨í¸ ì¶ì '%s' ë¸ëì¹ë¥¼ ìì íëë° ì¤ë¥" + +#: builtin/branch.c:252 +#, c-format +msgid "Error deleting branch '%s'" +msgstr "'%s' ë¸ëì¹ë¥¼ ìì íëë° ì¤ë¥" + +#: builtin/branch.c:259 +#, c-format +msgid "Deleted remote-tracking branch %s (was %s).\n" +msgstr "ë¦¬ëª¨í¸ ì¶ì '%s' ë¸ëì¹ë¥¼ ìì í©ëë¤. (과거 %s)\n" + +#: builtin/branch.c:260 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "%s ë¸ëì¹ ìì (과거 %s).\n" + +#: builtin/branch.c:303 +#, c-format +msgid "[%s: gone]" +msgstr "[%s: ì¬ë¼ì§]" + +#: builtin/branch.c:308 +#, c-format +msgid "[%s]" +msgstr "[%s]" + +#: builtin/branch.c:313 +#, c-format +msgid "[%s: behind %d]" +msgstr "[%s: %dê° ë¤]" + +#: builtin/branch.c:315 +#, c-format +msgid "[behind %d]" +msgstr "[%dê° ë¤]" + +#: builtin/branch.c:319 +#, c-format +msgid "[%s: ahead %d]" +msgstr "[%s: %dê° ì]" + +#: builtin/branch.c:321 +#, c-format +msgid "[ahead %d]" +msgstr "[%dê° ì]" + +#: builtin/branch.c:324 +#, c-format +msgid "[%s: ahead %d, behind %d]" +msgstr "[%s: %dê° ì, %dê° ë¤]" + +#: builtin/branch.c:327 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "[%dê° ì, %dê° ë¤]" + +#: builtin/branch.c:340 +msgid " **** invalid ref ****" +msgstr " **** ì못ë ë í¼ë°ì¤ ****" + +#: builtin/branch.c:366 +#, c-format +msgid "(no branch, rebasing %s)" +msgstr "(ë¸ëì¹ ìì, %s ë¦¬ë² ì´ì¤)" + +#: builtin/branch.c:369 +#, c-format +msgid "(no branch, bisect started on %s)" +msgstr "(ë¸ëì¹ ìì, ì´ë±ë¶ %sìì ìì)" + +#: builtin/branch.c:375 +#, c-format +msgid "(HEAD detached at %s)" +msgstr "(HEAD %s ìì¹ìì ë¶ë¦¬ë¨)" + +#: builtin/branch.c:378 +#, c-format +msgid "(HEAD detached from %s)" +msgstr "(HEAD %s(ì¼)ë¡ë¶í° ë¶ë¦¬ë¨)" + +#: builtin/branch.c:382 +msgid "(no branch)" +msgstr "(ë¸ëì¹ ìì)" + +#: builtin/branch.c:524 +msgid "cannot rename the current branch while not on any." +msgstr "ë¸ëì¹ ìì ìì¼ë©´ì íì¬ ë¸ëì¹ ì´ë¦ì ë°ê¿ ì ììµëë¤." + +#: builtin/branch.c:534 +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "ì못ë ë¸ëì¹ ì´ë¦: '%s'" + +#: builtin/branch.c:549 +msgid "Branch rename failed" +msgstr "ë¸ëì¹ ì´ë¦ ë°ê¾¸ê¸° ì¤í¨" + +#: builtin/branch.c:553 +#, c-format +msgid "Renamed a misnamed branch '%s' away" +msgstr "ì´ë¦ì´ ì못ë '%s' ë¸ëì¹ì ì´ë¦ì ë¤ë¥´ê² ë°ê¿ëë¤" + +#: builtin/branch.c:557 +#, c-format +msgid "Branch renamed to %s, but HEAD is not updated!" +msgstr "ë¸ëì¹ ì´ë¦ì %s(ì¼)ë¡ ë°ê¾¸ì§ë§, HEAD를 ì ë°ì´í¸íì§ ììµëë¤!" + +#: builtin/branch.c:564 +msgid "Branch is renamed, but update of config-file failed" +msgstr "ë¸ëì¹ì ì´ë¦ì ë°ê¾¸ì§ë§, config-file ì ë°ì´í¸ê° ì¤í¨íìµëë¤" + +#: builtin/branch.c:587 +#, c-format +msgid "could not write branch description template: %s" +msgstr "ë¸ëì¹ ì¤ëª ììì ì¸ ì ììµëë¤: %s" + +#: builtin/branch.c:616 +msgid "Generic options" +msgstr "ì¼ë° ìµì " + +# FIXME: give twice? +#: builtin/branch.c:618 +msgid "show hash and subject, give twice for upstream branch" +msgstr "í´ìì ì 목ì íìíê³ , ì ì¤í¸ë¦¼ ë¸ëì¹ì ëí ìì¹ë¥¼ íìí©ëë¤" + +#: builtin/branch.c:619 +msgid "suppress informational messages" +msgstr "ì¬ë¬ê°ì§ ìë´ ë©ìì§ë¥¼ íìíì§ ììµëë¤" + +#: builtin/branch.c:620 +msgid "set up tracking mode (see git-pull(1))" +msgstr "ì¶ì 모ë를 ì¤ì í©ëë¤ (git-pull(1) ì°¸ê³ )" + +#: builtin/branch.c:622 +msgid "change upstream info" +msgstr "ì ì¤í¸ë¦¼ ì 보를 ë°ê¿ëë¤" + +#: builtin/branch.c:626 +msgid "use colored output" +msgstr "ì¬ë¬ ìì¼ë¡ ì¶ë ¥í©ëë¤" + +#: builtin/branch.c:627 +msgid "act on remote-tracking branches" +msgstr "ë¦¬ëª¨í¸ ì¶ì ë¸ëì¹ì ëí´ ëìí©ëë¤" + +#: builtin/branch.c:629 builtin/branch.c:630 +msgid "print only branches that contain the commit" +msgstr "커ë°ì´ ìë ë¸ëì¹ë§ íìí©ëë¤" + +#: builtin/branch.c:633 +msgid "Specific git-branch actions:" +msgstr "í¹ì git-branch ëì:" + +#: builtin/branch.c:634 +msgid "list both remote-tracking and local branches" +msgstr "리모í¸ì ë¡ì»¬ì ë¸ëì¹ ëª©ë¡ì 모ë íìí©ëë¤" + +#: builtin/branch.c:636 +msgid "delete fully merged branch" +msgstr "ìì í ë³í©ë ë¸ëì¹ë¥¼ ìì í©ëë¤" + +#: builtin/branch.c:637 +msgid "delete branch (even if not merged)" +msgstr "ë¸ëì¹ë¥¼ ìì í©ëë¤ (ë³í©ëì§ ììëë¼ë)" + +#: builtin/branch.c:638 +msgid "move/rename a branch and its reflog" +msgstr "ë¸ëì¹ì ê·¸ reflog를 ì®ê¸°ê±°ë ì´ë¦ì ë°ê¿ëë¤" + +#: builtin/branch.c:639 +msgid "move/rename a branch, even if target exists" +msgstr "ëìì´ ì´ë¯¸ ìëë¼ë ë¸ëì¹ë¥¼ ì®ê¸°ê±°ë ì´ë¦ì ë°ê¿ëë¤" + +#: builtin/branch.c:640 +msgid "list branch names" +msgstr "ë¸ëì¹ ì´ë¦ 목ë¡ì íìí©ëë¤" + +#: builtin/branch.c:641 +msgid "create the branch's reflog" +msgstr "ë¸ëì¹ì reflog를 ë§ëëë¤" + +#: builtin/branch.c:643 +msgid "edit the description for the branch" +msgstr "ë¸ëì¹ì ì¤ëª ì í¸ì§í©ëë¤" + +#: builtin/branch.c:644 +msgid "force creation, move/rename, deletion" +msgstr "ê°ì ë¡ ë§ë¤ê³ , ì®ê¸°ê±°ë ì´ë¦ì ë°ê¾¸ê³ , ìì í©ëë¤" + +#: builtin/branch.c:645 +msgid "print only branches that are merged" +msgstr "ë³í©ëë ë¸ëì¹ë§ íìí©ëë¤" + +#: builtin/branch.c:646 +msgid "print only branches that are not merged" +msgstr "ë³í©ëì§ ìë ë¸ëì¹ë§ íìí©ëë¤" + +#: builtin/branch.c:647 +msgid "list branches in columns" +msgstr "목ë¡ì ì¬ë¬ ì´ë¡ íìí©ëë¤" + +#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366 +msgid "key" +msgstr "í¤" + +#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367 +msgid "field name to sort on" +msgstr "ì ë ¬í 기ì¤ì´ ëë íë ì´ë¦" + +#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398 +#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564 +#: builtin/tag.c:369 +msgid "object" +msgstr "ì¤ë¸ì í¸" + +#: builtin/branch.c:652 +msgid "print only branches of the object" +msgstr "í´ë¹ ì¤ë¸ì í¸ì ë¸ëì¹ë§ íìí©ëë¤" + +#: builtin/branch.c:670 +msgid "Failed to resolve HEAD as a valid ref." +msgstr "HEAD를 ì¬ë°ë¥¸ ë í¼ë°ì¤ë¡ 구í´ë´ëë° ì¤í¨íìµëë¤." + +#: builtin/branch.c:674 builtin/clone.c:697 +msgid "HEAD not found below refs/heads!" +msgstr "ë í¼ë°ì¤/í¤ë ìëì HEADê° ììµëë¤!" + +#: builtin/branch.c:694 +msgid "--column and --verbose are incompatible" +msgstr "--column ë° --verbose ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/branch.c:705 builtin/branch.c:747 +msgid "branch name required" +msgstr "ë¸ëì¹ ì´ë¦ì´ íìí©ëë¤" + +#: builtin/branch.c:723 +msgid "Cannot give description to detached HEAD" +msgstr "ë¶ë¦¬ë HEADì ëí ì¤ëª ì ë¶ì¬í ì ììµëë¤" + +#: builtin/branch.c:728 +msgid "cannot edit description of more than one branch" +msgstr "ì¬ë¬ ë¸ëì¹ì ëí ì¤ëª ì í¸ì§í ì ììµëë¤" + +#: builtin/branch.c:735 +#, c-format +msgid "No commit on branch '%s' yet." +msgstr "ìì§ '%s' ë¸ëì¹ì 커ë°ì´ ììµëë¤." + +#: builtin/branch.c:738 +#, c-format +msgid "No branch named '%s'." +msgstr "ì´ë¦ì´ '%s'ì¸ ë¸ëì¹ê° ììµëë¤." + +#: builtin/branch.c:753 +msgid "too many branches for a rename operation" +msgstr "ì´ë¦ ë°ê¾¸ê¸° ìì ì ëí´ ë¸ëì¹ê° ë무 ë§ìµëë¤" + +#: builtin/branch.c:758 +msgid "too many branches to set new upstream" +msgstr "ì ì ì¤í¸ë¦¼ì ì¤ì íëë° ë¸ëì¹ê° ë무 ë§ìµëë¤" + +#: builtin/branch.c:762 +#, c-format +msgid "" +"could not set upstream of HEAD to %s when it does not point to any branch." +msgstr "HEADì ì ì¤í¸ë¦¼ì %s(ì¼)ë¡ ì¤ì í ì ììµëë¤. ì´ë¤ ë¸ëì¹ë ê°ë¦¬í¤ì§ ììµëë¤." + +#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808 +#, c-format +msgid "no such branch '%s'" +msgstr "ê·¸ë° ë¸ëì¹ê° ('%s') ììµëë¤" + +#: builtin/branch.c:769 +#, c-format +msgid "branch '%s' does not exist" +msgstr "'%s' ë¸ëì¹ê° ììµëë¤" + +#: builtin/branch.c:781 +msgid "too many branches to unset upstream" +msgstr "ì ì¤í¸ë¦¼ ì¤ì ì í´ì íëë° ë¸ëì¹ê° ë무 ë§ìµëë¤" + +#: builtin/branch.c:785 +msgid "could not unset upstream of HEAD when it does not point to any branch." +msgstr "HEADì ì ì¤í¸ë¦¼ ì¤ì ì í´ì í ì ììµëë¤. ì´ë¤ ë¸ëì¹ë ê°ë¦¬í¤ì§ ììµëë¤." + +#: builtin/branch.c:791 +#, c-format +msgid "Branch '%s' has no upstream information" +msgstr "'%s' ë¸ëì¹ì ì ì¤í¸ë¦¼ ì ë³´ê° ììµëë¤" + +#: builtin/branch.c:805 +msgid "it does not make sense to create 'HEAD' manually" +msgstr "'HEAD'를 ìëì¼ë¡ ë§ëë ê±´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/branch.c:811 +msgid "-a and -r options to 'git branch' do not make sense with a branch name" +msgstr "'git branch'ì ëí´ -a ë° -r ìµì ì ë¸ëì¹ ì´ë¦ê³¼ ê°ì´ ì°ë©´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/branch.c:814 +#, c-format +msgid "" +"The --set-upstream flag is deprecated and will be removed. Consider using --" +"track or --set-upstream-to\n" +msgstr "--set-upstream ìµì ì ë ì´ì ì¬ì©ëì§ ìê³ ì ê±°ë ìì ì ëë¤. --track ëë --set-upstream-to ìµì ì ì¬ì©í´ ë³´ììì¤\n" + +#: builtin/branch.c:831 +#, c-format +msgid "" +"\n" +"If you wanted to make '%s' track '%s', do this:\n" +"\n" +msgstr "\n'%s'ì(를) ë§ë¤ê³ '%s'ì(를) ì¶ì íê² íë ¤ë©´, ë¤ìì íììì¤:\n" + +#: builtin/branch.c:832 +#, c-format +msgid " git branch -d %s\n" +msgstr " git branch -d %s\n" + +#: builtin/branch.c:833 +#, c-format +msgid " git branch --set-upstream-to %s\n" +msgstr " git branch --set-upstream-to %s\n" + +#: builtin/bundle.c:51 +#, c-format +msgid "%s is okay\n" +msgstr "%s ì ìì ëë¤\n" + +#: builtin/bundle.c:64 +msgid "Need a repository to create a bundle." +msgstr "ë²ë¤ì ë§ëë ¤ë©´ ì ì¥ìê° íìí©ëë¤." + +#: builtin/bundle.c:68 +msgid "Need a repository to unbundle." +msgstr "ë²ë¤ì í´ì íë ¤ë©´ ì ì¥ìê° íìí©ëë¤." + +#: builtin/cat-file.c:428 +msgid "" +"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|" +"<type>|--textconv) <object>" +msgstr "" +"git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<ì¢ ë¥" +">|--textconv) <ì¤ë¸ì í¸>" + +#: builtin/cat-file.c:429 +msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]" +msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]" + +#: builtin/cat-file.c:466 +msgid "<type> can be one of: blob, tree, commit, tag" +msgstr "<ì¢ ë¥>ë ë¤ì ì¤ íëê° ë ì ììµëë¤: blob, tree, commit, tag" + +#: builtin/cat-file.c:467 +msgid "show object type" +msgstr "ì¤ë¸ì í¸ ì¢ ë¥ë¥¼ ë´ ëë¤" + +#: builtin/cat-file.c:468 +msgid "show object size" +msgstr "ì¤ë¸ì í¸ í¬ê¸°ë¥¼ ë´ ëë¤" + +#: builtin/cat-file.c:470 +msgid "exit with zero when there's no error" +msgstr "ì¤ë¥ê° ìì ë 0ì 리í´íê³ ëë ëë¤" + +#: builtin/cat-file.c:471 +msgid "pretty-print object's content" +msgstr "ì¤ë¸ì í¸ì ë´ì©ì ììê² íìí©ëë¤" + +#: builtin/cat-file.c:473 +msgid "for blob objects, run textconv on object's content" +msgstr "ë¸ë¡ ì¤ë¸ì í¸ì ëí´ìë, ì¤ë¸ì í¸ì ë´ì©ì ëí´ textconv를 ì¤íí©ëë¤" + +#: builtin/cat-file.c:475 +msgid "allow -s and -t to work with broken/corrupt objects" +msgstr "-s ë° -t ìµì ì´ ììë ì¤ë¸ì í¸ì ëí´ ëìíëë¡ íì©í©ëë¤" + +#: builtin/cat-file.c:476 +msgid "buffer --batch output" +msgstr "--batch ì¶ë ¥ì ëí´ ë²í¼ë§í©ëë¤" + +#: builtin/cat-file.c:478 +msgid "show info and content of objects fed from the standard input" +msgstr "íì¤ ì ë ¥ìì ì ë ¥ë ì¤ë¸ì í¸ì ì ë³´ì ë´ì©ì íìí©ëë¤" + +#: builtin/cat-file.c:481 +msgid "show info about objects fed from the standard input" +msgstr "íì¤ ì ë ¥ìì ì ë ¥ë ì¤ë¸ì í¸ì ì 보를 íìí©ëë¤" + +#: builtin/cat-file.c:484 +msgid "follow in-tree symlinks (used with --batch or --batch-check)" +msgstr "í¸ë¦¬ ë´ë¶ì ì¬ë³¼ë¦ ë§í¬ë¥¼ ë°ë¼ê°ëë¤ (--batch ëë --batch-checkì ê°ì´ ì¬ì©)" + +#: builtin/cat-file.c:486 +msgid "show all objects with --batch or --batch-check" +msgstr "--batch ëë --batch-checkìì 모ë ì¤ë¸ì í¸ë¥¼ íìí©ëë¤" + +#: builtin/check-attr.c:11 +msgid "git check-attr [-a | --all | <attr>...] [--] <pathname>..." +msgstr "git check-attr [-a | --all | <ìì±>...] [--] <ê²½ë¡ì´ë¦>..." + +#: builtin/check-attr.c:12 +msgid "git check-attr --stdin [-z] [-a | --all | <attr>...]" +msgstr "git check-attr --stdin [-z] [-a | --all | <ìì±>...]" + +#: builtin/check-attr.c:19 +msgid "report all attributes set on file" +msgstr "íì¼ì ì¤ì ë 모ë ìì±ì íìí©ëë¤" + +#: builtin/check-attr.c:20 +msgid "use .gitattributes only from the index" +msgstr "ì¸ë±ì¤ììë§ .gitattributes를 ì¬ì©í©ëë¤" + +#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:96 +msgid "read file names from stdin" +msgstr "íì¤ ì ë ¥ìì íì¼ ì´ë¦ì ì½ìµëë¤" + +#: builtin/check-attr.c:23 builtin/check-ignore.c:24 +msgid "terminate input and output records by a NUL character" +msgstr "NUL 문ì를 기ì¤ì¼ë¡ ìë£ ì ë ¥ ë° ì¶ë ¥ì ë©ì¶¥ëë¤" + +#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325 +msgid "suppress progress reporting" +msgstr "ì§í ìí© íì를 íì§ ììµëë¤" + +#: builtin/check-ignore.c:26 +msgid "show non-matching input paths" +msgstr "ì¼ì¹íì§ ìë ì ë ¥ ê²½ë¡ë¥¼ íìí©ëë¤" + +#: builtin/check-ignore.c:28 +msgid "ignore index when checking" +msgstr "ê²ì¬í ë ì¸ë±ì¤ë¥¼ 무ìí©ëë¤" + +#: builtin/check-ignore.c:154 +msgid "cannot specify pathnames with --stdin" +msgstr "--stdinì¼ë¡ ê²½ë¡ ì´ë¦ì ì§ì í ì ììµëë¤" + +#: builtin/check-ignore.c:157 +msgid "-z only makes sense with --stdin" +msgstr "-z ìµì ì --stdin ìµì ê³¼ ê°ì´ ì¨ì¼ë§ ìë¯¸ê° ììµëë¤" + +#: builtin/check-ignore.c:159 +msgid "no path specified" +msgstr "ê²½ë¡ë¥¼ ì§ì íì§ ìììµëë¤" + +#: builtin/check-ignore.c:163 +msgid "--quiet is only valid with a single pathname" +msgstr "--quiet ìµì ì íëì ê²½ë¡ ì´ë¦ê³¼ ê°ì´ ì¨ì¼ í©ëë¤" + +#: builtin/check-ignore.c:165 +msgid "cannot have both --quiet and --verbose" +msgstr "--quiet ë° --verbose ìµì ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/check-ignore.c:168 +msgid "--non-matching is only valid with --verbose" +msgstr "--non-matching ìµì ì --verbose ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤" + +#: builtin/check-mailmap.c:8 +msgid "git check-mailmap [<options>] <contact>..." +msgstr "git check-mailmap [<ìµì >] <ì°ë½ì²>..." + +#: builtin/check-mailmap.c:13 +msgid "also read contacts from stdin" +msgstr "ë ì°ë½ì²ë¥¼ íì¤ ì ë ¥ìì ì½ìµëë¤" + +#: builtin/check-mailmap.c:24 +#, c-format +msgid "unable to parse contact: %s" +msgstr "ì°ë½ì²ë¥¼ íì±í ì ììµëë¤: %s" + +#: builtin/check-mailmap.c:47 +msgid "no contacts specified" +msgstr "ì°ë½ì²ë¥¼ ì§ì íì§ ìììµëë¤" + +#: builtin/checkout-index.c:126 +msgid "git checkout-index [<options>] [--] [<file>...]" +msgstr "git checkout-index [<ìµì >] [--] [<íì¼>...]" + +#: builtin/checkout-index.c:188 +msgid "check out all files in the index" +msgstr "ì¸ë±ì¤ì 모ë íì¼ì ê°ì ¸ìµëë¤" + +#: builtin/checkout-index.c:189 +msgid "force overwrite of existing files" +msgstr "기존 íì¼ì ê°ì ë¡ ë®ì´ ìëë¤" + +#: builtin/checkout-index.c:191 +msgid "no warning for existing files and files not in index" +msgstr "기존 íì¼ê³¼ ì¸ë±ì¤ì ìë íì¼ì ëí´ ê²½ê³ íì§ ììµëë¤" + +#: builtin/checkout-index.c:193 +msgid "don't checkout new files" +msgstr "ì íì¼ì ê°ì ¸ì¤ì§ ììµëë¤" + +#: builtin/checkout-index.c:195 +msgid "update stat information in the index file" +msgstr "ì¸ë±ì¤ íì¼ì stat ì 보를 ì ë°ì´í¸í©ëë¤" + +#: builtin/checkout-index.c:201 +msgid "read list of paths from the standard input" +msgstr "íì¤ ì ë ¥ìì ê²½ë¡ì 목ë¡ì ì½ìµëë¤" + +#: builtin/checkout-index.c:203 +msgid "write the content to temporary files" +msgstr "ë´ì©ì ìì íì¼ì ìëë¤" + +#: builtin/checkout-index.c:204 builtin/column.c:30 +#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175 +#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181 +msgid "string" +msgstr "문ìì´" + +#: builtin/checkout-index.c:205 +msgid "when creating files, prepend <string>" +msgstr "íì¼ì ë§ë¤ ë, ìì <문ìì´>ì ë¶ì ëë¤" + +#: builtin/checkout-index.c:208 +msgid "copy out the files from named stage" +msgstr "ì§ì í ì¤í ì´ì§ìì íì¼ì ë³µì¬í´ ìµëë¤" + +#: builtin/checkout.c:25 +msgid "git checkout [<options>] <branch>" +msgstr "git checkout [<ìµì >] <ë¸ëì¹>" + +#: builtin/checkout.c:26 +msgid "git checkout [<options>] [<branch>] -- <file>..." +msgstr "git checkout [<ìµì >] [<ë¸ëì¹>] -- <íì¼>..." + +#: builtin/checkout.c:134 builtin/checkout.c:167 +#, c-format +msgid "path '%s' does not have our version" +msgstr "'%s' ê²½ë¡ì ì°ë¦¬ìª½ ë²ì ì´ ììµëë¤" + +#: builtin/checkout.c:136 builtin/checkout.c:169 +#, c-format +msgid "path '%s' does not have their version" +msgstr "'%s' ê²½ë¡ì ìëí¸ ë²ì ì´ ììµëë¤" + +#: builtin/checkout.c:152 +#, c-format +msgid "path '%s' does not have all necessary versions" +msgstr "'%s' ê²½ë¡ì íìí 모ë ë²ì ì´ ììµëë¤" + +#: builtin/checkout.c:196 +#, c-format +msgid "path '%s' does not have necessary versions" +msgstr "'%s' ê²½ë¡ì íìí ë²ì ì´ ììµëë¤" + +#: builtin/checkout.c:213 +#, c-format +msgid "path '%s': cannot merge" +msgstr "'%s' ê²½ë¡: ë³í©í ì ììµëë¤" + +#: builtin/checkout.c:230 +#, c-format +msgid "Unable to add merge result for '%s'" +msgstr "'%s'ì ëí ë³í© 결과를 ì¶ê°í ì ììµëë¤" + +#: builtin/checkout.c:251 builtin/checkout.c:254 builtin/checkout.c:257 +#: builtin/checkout.c:260 +#, c-format +msgid "'%s' cannot be used with updating paths" +msgstr "'%s' ìµì ì ì ë°ì´í¸íë ê²½ë¡ìì ì¸ ì ììµëë¤" + +#: builtin/checkout.c:263 builtin/checkout.c:266 +#, c-format +msgid "'%s' cannot be used with %s" +msgstr "'%s' ìµì ì %s ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/checkout.c:269 +#, c-format +msgid "Cannot update paths and switch to branch '%s' at the same time." +msgstr "ê²½ë¡ë¥¼ ì ë°ì´í¸íê³ '%s' ë¸ëì¹ë¡ ì ííë ì¼ì ëìì í ì ììµëë¤." + +#: builtin/checkout.c:280 builtin/checkout.c:474 +msgid "corrupt index file" +msgstr "ììë ì¸ë±ì¤ íì¼" + +#: builtin/checkout.c:340 builtin/checkout.c:347 +#, c-format +msgid "path '%s' is unmerged" +msgstr "'%s' ê²½ë¡ë¥¼ ë³í©íì§ ìììµëë¤" + +#: builtin/checkout.c:496 +msgid "you need to resolve your current index first" +msgstr "íì¬ ì¸ë±ì¤ë¥¼ 먼ì í´ê²°í´ì¼ í©ëë¤" + +#: builtin/checkout.c:623 +#, c-format +msgid "Can not do reflog for '%s': %s\n" +msgstr "'%s'ì ëí´ reflogí ì ììµëë¤: %s\n" + +#: builtin/checkout.c:661 +msgid "HEAD is now at" +msgstr "HEADì íì¬ ìì¹ë" + +#: builtin/checkout.c:668 +#, c-format +msgid "Reset branch '%s'\n" +msgstr "'%s' ë¸ëì¹ ë¦¬ì \n" + +#: builtin/checkout.c:671 +#, c-format +msgid "Already on '%s'\n" +msgstr "ì´ë¯¸ '%s'ì ììµëë¤\n" + +#: builtin/checkout.c:675 +#, c-format +msgid "Switched to and reset branch '%s'\n" +msgstr "'%s' ë¸ëì¹ë¡ ì ííê³ ë¦¬ì í©ëë¤\n" + +#: builtin/checkout.c:677 builtin/checkout.c:1066 +#, c-format +msgid "Switched to a new branch '%s'\n" +msgstr "ìë¡ ë§ë '%s' ë¸ëì¹ë¡ ì íí©ëë¤\n" + +#: builtin/checkout.c:679 +#, c-format +msgid "Switched to branch '%s'\n" +msgstr "'%s' ë¸ëì¹ë¡ ì íí©ëë¤\n" + +#: builtin/checkout.c:731 +#, c-format +msgid " ... and %d more.\n" +msgstr " ... ê·¸ë¦¬ê³ %dê° ë.\n" + +#: builtin/checkout.c:737 +#, c-format +msgid "" +"Warning: you are leaving %d commit behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgid_plural "" +"Warning: you are leaving %d commits behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgstr[0] "" +"ê²½ê³ : ë¸ëì¹ ì¤ì ì무ê²ìë ì°ê²°ëì§ ìì 커ë°ì´ ë¤ì\n" +"%dê° ììµëë¤:\n" +"\n" +"%s\n" + +#: builtin/checkout.c:756 +#, c-format +msgid "" +"If you want to keep it by creating a new branch, this may be a good time\n" +"to do so with:\n" +"\n" +" git branch <new-branch-name> %s\n" +"\n" +msgid_plural "" +"If you want to keep them by creating a new branch, this may be a good time\n" +"to do so with:\n" +"\n" +" git branch <new-branch-name> %s\n" +"\n" +msgstr[0] "" +"ì ë¸ëì¹ë¥¼ ë§ë¤ì´ì ì´ ì»¤ë°ì ì ì¥íê³ ì¶ì¼ë©´, ì§ê¸ ë¤ìê³¼\n" +"ê°ì´ í ì ììµëë¤:\n" +"\n" +" git branch <ì-ë¸ëì¹-ì´ë¦> %s\n" +"\n" + +#: builtin/checkout.c:792 +msgid "internal error in revision walk" +msgstr "리ë¹ì walkì ë´ë¶ ì¤ë¥" + +#: builtin/checkout.c:796 +msgid "Previous HEAD position was" +msgstr "ì´ì HEAD ìì¹ë" + +#: builtin/checkout.c:823 builtin/checkout.c:1061 +msgid "You are on a branch yet to be born" +msgstr "íì¬ ìì¹ê° ë§ë¤ ìì ì¸ ë¸ëì¹ì ììµëë¤" + +#: builtin/checkout.c:968 +#, c-format +msgid "only one reference expected, %d given." +msgstr "íëì ë í¼ë°ì¤ë§ ì§ì í´ì¼ íì§ë§ %dê°ë¥¼ ì§ì íìµëë¤." + +#: builtin/checkout.c:1007 builtin/worktree.c:213 +#, c-format +msgid "invalid reference: %s" +msgstr "ì못ë ë í¼ë°ì¤: %s" + +#: builtin/checkout.c:1036 +#, c-format +msgid "reference is not a tree: %s" +msgstr "ë í¼ë°ì¤ê° í¸ë¦¬ê° ìëëë¤: %s" + +#: builtin/checkout.c:1075 +msgid "paths cannot be used with switching branches" +msgstr "ë¸ëì¹ë¥¼ ì ííëë° ê²½ë¡ë¥¼ ì¬ì©í ì ììµëë¤" + +#: builtin/checkout.c:1078 builtin/checkout.c:1082 +#, c-format +msgid "'%s' cannot be used with switching branches" +msgstr "'%s' ìµì ì ë¸ëì¹ë¥¼ ì íí ë ì¸ ì ììµëë¤" + +#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094 +#: builtin/checkout.c:1097 +#, c-format +msgid "'%s' cannot be used with '%s'" +msgstr "'%s' ìµì ì '%s' ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/checkout.c:1102 +#, c-format +msgid "Cannot switch branch to a non-commit '%s'" +msgstr "ë¸ëì¹ë¥¼ 커ë°ì´ ìë '%s'(ì¼)ë¡ ì íí ì ììµëë¤" + +#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83 +#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320 +#: builtin/worktree.c:322 +msgid "branch" +msgstr "ë¸ëì¹" + +#: builtin/checkout.c:1136 +msgid "create and checkout a new branch" +msgstr "ì ë¸ëì¹ë¥¼ ë§ë¤ê³ ê°ì ¸ìµëë¤" + +#: builtin/checkout.c:1138 +msgid "create/reset and checkout a branch" +msgstr "ë¸ëì¹ë¥¼ ë§ë¤ê±°ë 리ì íê³ ê°ì ¸ìµëë¤" + +#: builtin/checkout.c:1139 +msgid "create reflog for new branch" +msgstr "ì ë¸ëì¹ì ëí reflog를 ë§ëëë¤" + +#: builtin/checkout.c:1140 +msgid "detach the HEAD at named commit" +msgstr "ì§ì í 커ë°ìì HEAD를 ë¶ë¦¬í©ëë¤" + +#: builtin/checkout.c:1141 +msgid "set upstream info for new branch" +msgstr "ì ë¸ëì¹ì ëí ì ì¤í¸ë¦¼ ì 보를 ì¤ì í©ëë¤" + +#: builtin/checkout.c:1143 +msgid "new-branch" +msgstr "ì-ë¸ëì¹" + +#: builtin/checkout.c:1143 +msgid "new unparented branch" +msgstr "ìì ë¸ëì¹ê° ìë ì ë¸ëì¹" + +#: builtin/checkout.c:1144 +msgid "checkout our version for unmerged files" +msgstr "ë³í©ëì§ ìì íì¼ì ëí´ ì°ë¦¬ìª½ ë²ì ì ê°ì ¸ìµëë¤" + +#: builtin/checkout.c:1146 +msgid "checkout their version for unmerged files" +msgstr "ë³í©ëì§ ìì íì¼ì ëí´ ìëí¸ ë²ì ì ê°ì ¸ìµëë¤" + +#: builtin/checkout.c:1148 +msgid "force checkout (throw away local modifications)" +msgstr "ê°ì ë¡ ì²´í¬ììí©ëë¤ (ë¡ì»¬ìì ìì í ì¬íì ë²ë¦½ëë¤)" + +#: builtin/checkout.c:1149 +msgid "perform a 3-way merge with the new branch" +msgstr "ì ë¸ëì¹ì ëí´ 3-ë°©í¥ ë³í©ì ìíí©ëë¤" + +#: builtin/checkout.c:1150 builtin/merge.c:227 +msgid "update ignored files (default)" +msgstr "무ìíë íì¼ì ì ë°ì´í¸í©ëë¤ (기본ê°)" + +#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250 +msgid "style" +msgstr "ì¤íì¼" + +#: builtin/checkout.c:1152 +msgid "conflict style (merge or diff3)" +msgstr "충ë ì¤íì¼ (merge ëë diff3)" + +# FIXME: ì미 ë¶ëª +#: builtin/checkout.c:1155 +msgid "do not limit pathspecs to sparse entries only" +msgstr "ê²½ë¡ëª ì¸ë¥¼ ë문 í목ìë§ ì ííì§ ììµëë¤" + +#: builtin/checkout.c:1157 +msgid "second guess 'git checkout <no-such-branch>'" +msgstr "'git checkout <ìë-ë¸ëì¹>'ì ëí´ ì¶ì¸¡í©ëë¤" + +#: builtin/checkout.c:1159 +msgid "do not check if another worktree is holding the given ref" +msgstr "ë¤ë¥¸ ìì í´ëì 주ì´ì§ ë í¼ë°ì¤ê° ìëì§ íì¸íì§ ììµëë¤" + +#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112 +#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558 +#: builtin/send-pack.c:168 +msgid "force progress reporting" +msgstr "ê°ì ë¡ ì§í ìí©ì íìí©ëë¤" + +#: builtin/checkout.c:1191 +msgid "-b, -B and --orphan are mutually exclusive" +msgstr "-b, -B ë° --orphan ìµì ì ìë¡ í¸íëì§ ììµëë¤" + +#: builtin/checkout.c:1208 +msgid "--track needs a branch name" +msgstr "--track ìµì ì ë¸ëì¹ ì´ë¦ì´ íìí©ëë¤" + +#: builtin/checkout.c:1213 +msgid "Missing branch name; try -b" +msgstr "ë¸ëì¹ ì´ë¦ì´ ììµëë¤. -b ìµì ì ì¬ì©í´ ë³´ììì¤" + +#: builtin/checkout.c:1249 +msgid "invalid path specification" +msgstr "ê²½ë¡ ëª ì¸ê° ì못ëììµëë¤" + +#: builtin/checkout.c:1256 +#, c-format +msgid "" +"Cannot update paths and switch to branch '%s' at the same time.\n" +"Did you intend to checkout '%s' which can not be resolved as commit?" +msgstr "" +"ëìì ê²½ë¡ë¥¼ ì ë°ì´í¸íê³ '%s' ë¸ëì¹ë¡ ì íí ì ììµëë¤.\n" +"커ë°ì íì¸í ì ìë '%s'ì(를) ê°ì ¸ì¤ë ¤ê³ íì ¨ìµëê¹?" + +#: builtin/checkout.c:1261 +#, c-format +msgid "git checkout: --detach does not take a path argument '%s'" +msgstr "git checkout: --detach ìµì ì ê²½ë¡ ì¸ì를 ë°ì§ ììµëë¤ '%s'" + +#: builtin/checkout.c:1265 +msgid "" +"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" +"checking out of the index." +msgstr "" +"git checkout: --ours/--theirs, --force ë° --merge ìµì ì ì¸ë±ì¤ìì\n" +"ê°ì ¸ì¬ ê²½ì°ìë ìë¡ í¸íëì§ ììµëë¤." + +#: builtin/clean.c:25 +msgid "" +"git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>..." +msgstr "" +"git clean [-d] [-f] [-i] [-n] [-q] [-e <í¨í´>] [-x | -X] [--] <ê²½ë¡>..." + +#: builtin/clean.c:29 +#, c-format +msgid "Removing %s\n" +msgstr "%s ì ê±°\n" + +#: builtin/clean.c:30 +#, c-format +msgid "Would remove %s\n" +msgstr "%s ì ê±°í ìì \n" + +#: builtin/clean.c:31 +#, c-format +msgid "Skipping repository %s\n" +msgstr "%s ì ì¥ì ê±´ëë\n" + +#: builtin/clean.c:32 +#, c-format +msgid "Would skip repository %s\n" +msgstr "%s ì ì¥ì ê±´ëë¸ ìì \n" + +#: builtin/clean.c:33 +#, c-format +msgid "failed to remove %s" +msgstr "%s ì ê±°ì ì¤í¨íìµëë¤" + +#: builtin/clean.c:315 +msgid "" +"Prompt help:\n" +"1 - select a numbered item\n" +"foo - select item based on unique prefix\n" +" - (empty) select nothing" +msgstr "" +"í롬íí¸ ëìë§:\n" +"1 - í´ë¹ ë²í¸ì í목ì ì í\n" +"foo - ì ì¼í ì ëì´ì í´ë¹íë í목 ì í\n" +" - (ë¹ ì ë ¥) ì ííì§ ìì" + +#: builtin/clean.c:319 +msgid "" +"Prompt help:\n" +"1 - select a single item\n" +"3-5 - select a range of items\n" +"2-3,6-9 - select multiple ranges\n" +"foo - select item based on unique prefix\n" +"-... - unselect specified items\n" +"* - choose all items\n" +" - (empty) finish selecting" +msgstr "" +"í롬íí¸ ëìë§:\n" +"1 - í´ë¹ ë²í¸ì í목ì ì í\n" +"3-5 - í´ë¹ ë²ìì í목ì ì í\n" +"2-3,6-9 - ì¬ë¬ ê° ë²ì를 ì í\n" +"foo - ì ì¼í ì ëì´ì í´ë¹íë í목 ì í\n" +"-... - í´ë¹ í목 ì í í´ì \n" +"* - 모ë í목 ì í\n" +" - (ë¹ ì ë ¥) ì í ë§ì¹¨" + +#: builtin/clean.c:535 +#, c-format +msgid "Huh (%s)?" +msgstr "ì´ë¼ë¼ (%s)?" + +#: builtin/clean.c:677 +#, c-format +msgid "Input ignore patterns>> " +msgstr "무ìí í¨í´ì ì ë ¥íììì¤>> " + +#: builtin/clean.c:714 +#, c-format +msgid "WARNING: Cannot find items matched by: %s" +msgstr "ê²½ê³ : ë¤ìì í´ë¹íë í목ì ì°¾ì ì ììµëë¤: %s" + +#: builtin/clean.c:735 +msgid "Select items to delete" +msgstr "ìì í í목ì ì ííììì¤" + +#. TRANSLATORS: Make sure to keep [y/N] as is +#: builtin/clean.c:776 +#, c-format +msgid "Remove %s [y/N]? " +msgstr "%s ì ê±°í©ëê¹ [y/N]? " + +#: builtin/clean.c:801 +msgid "Bye." +msgstr "ë." + +#: builtin/clean.c:809 +msgid "" +"clean - start cleaning\n" +"filter by pattern - exclude items from deletion\n" +"select by numbers - select items to be deleted by numbers\n" +"ask each - confirm each deletion (like \"rm -i\")\n" +"quit - stop cleaning\n" +"help - this screen\n" +"? - help for prompt selection" +msgstr "" +"clean - ì§ì°ê¸° ìì\n" +"filter by pattern - exclude items from deletion\n" +"select by numbers - ìì í í목ì ë²í¸ë¡ ì í\n" +"ask each - ìì í목ì (\"rm -i\" ì²ë¼) íëíë íì¸\n" +"quit - ì§ì°ê¸° ì¤ì§\n" +"help - ì´ íë©´ íì\n" +"? - í롬íí¸ ì í ëìë§" + +#: builtin/clean.c:836 +msgid "*** Commands ***" +msgstr "*** ëª ë ¹ ***" + +#: builtin/clean.c:837 +msgid "What now" +msgstr "무ìì í ê¹ì" + +#: builtin/clean.c:845 +msgid "Would remove the following item:" +msgid_plural "Would remove the following items:" +msgstr[0] "ë¤ì í목ì ì ê±°í ìì ì ëë¤:" + +#: builtin/clean.c:862 +msgid "No more files to clean, exiting." +msgstr "ì§ì¸ íì¼ì´ ì´ì ìì¼ë¯ë¡ ëë ëë¤." + +#: builtin/clean.c:893 +msgid "do not print names of files removed" +msgstr "ì ê±°í íì¼ ì´ë¦ì íìíì§ ììµëë¤" + +#: builtin/clean.c:895 +msgid "force" +msgstr "ê°ì " + +#: builtin/clean.c:896 +msgid "interactive cleaning" +msgstr "ëíí ì§ì°ê¸°" + +#: builtin/clean.c:898 +msgid "remove whole directories" +msgstr "ì ì²´ ëë í°ë¦¬ ì ê±°" + +#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709 +#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182 +msgid "pattern" +msgstr "í¨í´" + +#: builtin/clean.c:900 +msgid "add <pattern> to ignore rules" +msgstr "ê·ì¹ì 무ìíë ¤ë©´ <í¨í´>ì ì¶ê°íììì¤" + +#: builtin/clean.c:901 +msgid "remove ignored files, too" +msgstr "무ìí íì¼ë ì ê±°" + +#: builtin/clean.c:903 +msgid "remove only ignored files" +msgstr "무ìí íì¼ë§ ì ê±°" + +#: builtin/clean.c:921 +msgid "-x and -X cannot be used together" +msgstr "-x ë° -X ìµì ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/clean.c:925 +msgid "" +"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to " +"clean" +msgstr "clean.requireForceê° trueë¡ ì¤ì ëìê³ -i, -n, -f ìµì ì¤ íëë ì°ì§ ìììµëë¤. ì§ì°ì§ ììµëë¤" + +#: builtin/clean.c:928 +msgid "" +"clean.requireForce defaults to true and neither -i, -n, nor -f given; " +"refusing to clean" +msgstr "clean.requireForce 기본ê°ì´ trueì´ê³ -i, -n, -f ìµì ì¤ íëë ì°ì§ ìììµëë¤. ì§ì°ì§ ììµëë¤" + +#: builtin/clone.c:37 +msgid "git clone [<options>] [--] <repo> [<dir>]" +msgstr "git clone [<ìµì >] [--] <ì ì¥ì> [<ëë í°ë¦¬>]" + +#: builtin/clone.c:59 +msgid "don't create a checkout" +msgstr "ì²´í¬ììì ë§ë¤ì§ ììµëë¤" + +#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469 +msgid "create a bare repository" +msgstr "ê°ëµí ì ì¥ì를 ë§ëëë¤" + +#: builtin/clone.c:64 +msgid "create a mirror repository (implies bare)" +msgstr "ë¯¸ë¬ ì ì¥ì를 ë§ëëë¤ (ê°ëµí ì ì¥ìë¡ ì·¨ê¸)" + +#: builtin/clone.c:66 +msgid "to clone from a local repository" +msgstr "ë¡ì»¬ ì ì¥ììì ë³µì í©ëë¤" + +#: builtin/clone.c:68 +msgid "don't use local hardlinks, always copy" +msgstr "ë¡ì»¬ íëë§í¬ë¥¼ ì¬ì©íì§ ìê³ , íì ë³µì¬í©ëë¤" + +#: builtin/clone.c:70 +msgid "setup as shared repository" +msgstr "ê³µì ì ì¥ìë¡ ì¤ì í©ëë¤" + +#: builtin/clone.c:72 builtin/clone.c:74 +msgid "initialize submodules in the clone" +msgstr "ë³µì í 결과물ìì íì 모ëì ì´ê¸°íí©ëë¤" + +#: builtin/clone.c:75 builtin/init-db.c:466 +msgid "template-directory" +msgstr "ìì-ëë í°ë¦¬" + +#: builtin/clone.c:76 builtin/init-db.c:467 +msgid "directory from which templates will be used" +msgstr "ììì ì¬ì©í ëë í°ë¦¬ ìì¹" + +#: builtin/clone.c:78 builtin/submodule--helper.c:179 +msgid "reference repository" +msgstr "ë í¼ë°ì¤ ì ì¥ì" + +#: builtin/clone.c:80 +msgid "use --reference only while cloning" +msgstr "ë³µì í ê²½ì°ìë§ --reference를 ì¬ì©í©ëë¤" + +#: builtin/clone.c:81 builtin/column.c:26 builtin/merge-file.c:44 +msgid "name" +msgstr "ì´ë¦" + +#: builtin/clone.c:82 +msgid "use <name> instead of 'origin' to track upstream" +msgstr "ì ì¤í¸ë¦¼ ì¶ì ì 'origin' ëì <ì´ë¦>ì ì¬ì©í©ëë¤" + +#: builtin/clone.c:84 +msgid "checkout <branch> instead of the remote's HEAD" +msgstr "리모í¸ì HEAD ëì <ë¸ëì¹>를 ê°ì ¸ìµëë¤" + +#: builtin/clone.c:86 +msgid "path to git-upload-pack on the remote" +msgstr "리모í¸ì git-upload-pack ê²½ë¡" + +#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186 +msgid "depth" +msgstr "ê¹ì´" + +#: builtin/clone.c:88 +msgid "create a shallow clone of that depth" +msgstr "ì§ì í ê¹ì´ì ìì ë³µì 를 ë§ëëë¤" + +#: builtin/clone.c:90 +msgid "clone only one branch, HEAD or --branch" +msgstr "íëì ë¸ëì¹ë§ ë³µì í©ëë¤ (HEAD ëë --branchë¡ ì§ì )" + +#: builtin/clone.c:91 builtin/init-db.c:475 +msgid "gitdir" +msgstr "gitdir" + +#: builtin/clone.c:92 builtin/init-db.c:476 +msgid "separate git dir from working tree" +msgstr "ê¹ ëë í°ë¦¬ë¥¼ ìì í´ëì ë³ê°ì ìì¹ì ëìµëë¤" + +#: builtin/clone.c:93 +msgid "key=value" +msgstr "í¤=ê°" + +#: builtin/clone.c:94 +msgid "set config inside the new repository" +msgstr "ì ì ì¥ì ììì ì¤ì í©ëë¤" + +#: builtin/clone.c:300 +#, c-format +msgid "reference repository '%s' as a linked checkout is not supported yet." +msgstr "ë í¼ë°ì¤ '%s' ì ì¥ì를 ì°ê²°ë ì²´í¬ììì¼ë¡ ì°ê¸°ë ìì§ ì§ìíì§ ììµëë¤." + +#: builtin/clone.c:302 +#, c-format +msgid "reference repository '%s' is not a local repository." +msgstr "ë í¼ë°ì¤ '%s' ì ì¥ìê° ë¡ì»¬ ì ì¥ìê° ìëëë¤." + +#: builtin/clone.c:307 +#, c-format +msgid "reference repository '%s' is shallow" +msgstr "ë í¼ë°ì¤ '%s' ì ì¥ìê° ìì ì ì¥ìì ëë¤" + +#: builtin/clone.c:310 +#, c-format +msgid "reference repository '%s' is grafted" +msgstr "ë í¼ë°ì¤ '%s' ì ì¥ìê° ë¶ì´ ìë ì ì¥ìì ëë¤" + +#: builtin/clone.c:375 builtin/diff.c:84 +#, c-format +msgid "failed to stat '%s'" +msgstr "'%s'ì ëí´ stat()ì´ ì¤í¨íìµëë¤" + +#: builtin/clone.c:377 +#, c-format +msgid "%s exists and is not a directory" +msgstr "'%s'ì´(ê°) ìì§ë§ ëë í°ë¦¬ê° ìëëë¤" + +#: builtin/clone.c:391 +#, c-format +msgid "failed to stat %s\n" +msgstr "'%s'ì ëí´ stat()ì´ ì¤í¨íìµëë¤\n" + +#: builtin/clone.c:413 +#, c-format +msgid "failed to create link '%s'" +msgstr "'%s' ë§í¬ë¥¼ ë§ëëë° ì¤í¨íìµëë¤" + +#: builtin/clone.c:417 +#, c-format +msgid "failed to copy file to '%s'" +msgstr "íì¼ì '%s'(ì¼)ë¡ ë³µì¬íëë° ì¤í¨íìµëë¤" + +#: builtin/clone.c:442 builtin/clone.c:626 +#, c-format +msgid "done.\n" +msgstr "ìë£.\n" + +#: builtin/clone.c:454 +msgid "" +"Clone succeeded, but checkout failed.\n" +"You can inspect what was checked out with 'git status'\n" +"and retry the checkout with 'git checkout -f HEAD'\n" +msgstr "" +"ë³µì ê° ì±ê³µíì§ë§, ì²´í¬ììì´ ì¤í¨íìµëë¤.\n" +"'git status' ëª ë ¹ì¼ë¡ 무ìì ì²´í¬ììíëì§ ì´í´ë³¼ ì ìê³ \n" +"'git checkout -f HEAD'ë¡ ì²´í¬ììì ë¤ì í ì ììµëë¤\n" + +#: builtin/clone.c:531 +#, c-format +msgid "Could not find remote branch %s to clone." +msgstr "ë³µì í 리모í¸ì %s ë¸ëì¹ë¥¼ ì°¾ì ì ììµëë¤." + +#: builtin/clone.c:621 +#, c-format +msgid "Checking connectivity... " +msgstr "ì°ê²°ì íì¸íë ì¤ì ëë¤..." + +#: builtin/clone.c:624 +msgid "remote did not send all necessary objects" +msgstr "리모í¸ìì íìí ì¤ë¸ì í¸ë¥¼ 모ë ë³´ë´ì§ ìììµëë¤" + +#: builtin/clone.c:688 +msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" +msgstr "ë¦¬ëª¨í¸ HEADê° ìë ë í¼ë°ì¤ë¥¼ ì°¸ê³ íë¯ë¡, ì²´í¬ììí ì ììµëë¤.\n" + +#: builtin/clone.c:719 +msgid "unable to checkout working tree" +msgstr "ìì í´ë를 ì²´í¬ììí ì ììµëë¤" + +#: builtin/clone.c:808 +msgid "cannot repack to clean up" +msgstr "ì 리ì©ì¼ë¡ repackí ì ììµëë¤" + +#: builtin/clone.c:810 +msgid "cannot unlink temporary alternates file" +msgstr "ë³´ì¡° ìì íì¼ì ìì í ì ììµëë¤" + +#: builtin/clone.c:842 +msgid "Too many arguments." +msgstr "ë무 ì¸ìê° ë§ìµëë¤." + +#: builtin/clone.c:846 +msgid "You must specify a repository to clone." +msgstr "ë³µì í ì ì¥ì를 ì§ì í´ì¼ í©ëë¤." + +#: builtin/clone.c:857 +#, c-format +msgid "--bare and --origin %s options are incompatible." +msgstr "--bare ë° --origin %s ìµì ì í¸íëì§ ììµëë¤." + +#: builtin/clone.c:860 +msgid "--bare and --separate-git-dir are incompatible." +msgstr "--bare ë° --separate-git-dir ìµì ì í¸íëì§ ììµëë¤." + +#: builtin/clone.c:873 +#, c-format +msgid "repository '%s' does not exist" +msgstr "'%s' ì ì¥ìê° ììµëë¤" + +#: builtin/clone.c:879 builtin/fetch.c:1166 +#, c-format +msgid "depth %s is not a positive number" +msgstr "ê¹ì´ê°(%s) 0ë³´ë¤ í° ìê° ìëëë¤" + +#: builtin/clone.c:889 +#, c-format +msgid "destination path '%s' already exists and is not an empty directory." +msgstr "ëì ê²½ë¡ê°('%s') ì´ë¯¸ ìê³ ë¹ ëë í°ë¦¬ê° ìëëë¤." + +#: builtin/clone.c:899 +#, c-format +msgid "working tree '%s' already exists." +msgstr "ìì í´ëê°('%s') ì´ë¯¸ ììµëë¤." + +#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224 +#: builtin/worktree.c:221 builtin/worktree.c:248 +#, c-format +msgid "could not create leading directories of '%s'" +msgstr "'%s'ì ì ëë í°ë¦¬ë¥¼ ë§ë¤ ì ììµëë¤" + +#: builtin/clone.c:917 +#, c-format +msgid "could not create work tree dir '%s'" +msgstr "ìì ëë í°ë¦¬ë¥¼('%s') ë§ë¤ ì ììµëë¤" + +#: builtin/clone.c:935 +#, c-format +msgid "Cloning into bare repository '%s'...\n" +msgstr "ê°ëµí ì ì¥ìë¡('%s') ë³µì í©ëë¤...\n" + +#: builtin/clone.c:937 +#, c-format +msgid "Cloning into '%s'...\n" +msgstr "'%s'ì ë³µì í©ëë¤...\n" + +#: builtin/clone.c:975 +msgid "--depth is ignored in local clones; use file:// instead." +msgstr "--depth ìµì ì ë¡ì»¬ ë³µì ìì 무ìë©ëë¤. ëì ì 'file://'ì ì¬ì©íììì¤." + +#: builtin/clone.c:978 +msgid "source repository is shallow, ignoring --local" +msgstr "ì본 ì ì¥ìê° ìì ì ì¥ìì´ë¯ë¡, --local ìµì ì 무ìí©ëë¤" + +#: builtin/clone.c:983 +msgid "--local is ignored" +msgstr "--local ìµì ì 무ìë©ëë¤" + +#: builtin/clone.c:987 +#, c-format +msgid "Don't know how to clone %s" +msgstr "%sì ë³µì ë°©ë²ì ìì§ ëª»í©ëë¤" + +#: builtin/clone.c:1036 builtin/clone.c:1044 +#, c-format +msgid "Remote branch %s not found in upstream %s" +msgstr "리모í¸ì %s ë¸ëì¹ê° ì ì¤í¸ë¦¼ %sì ììµëë¤" + +#: builtin/clone.c:1047 +msgid "You appear to have cloned an empty repository." +msgstr "ë¹ ì ì¥ì를 ë³µì í ê²ì²ë¼ ë³´ì ëë¤." + +#: builtin/column.c:9 +msgid "git column [<options>]" +msgstr "git column [<ìµì >]" + +#: builtin/column.c:26 +msgid "lookup config vars" +msgstr "ì¤ì ë³ì를 ì°¾ì ë´ ëë¤" + +#: builtin/column.c:27 builtin/column.c:28 +msgid "layout to use" +msgstr "ì¬ì©í ë°°ì¹" + +#: builtin/column.c:29 +msgid "Maximum width" +msgstr "ìµë ëë¹" + +#: builtin/column.c:30 +msgid "Padding space on left border" +msgstr "ì¼ìª½ ê°ì¥ì리ì ì±ì¸ 공백" + +#: builtin/column.c:31 +msgid "Padding space on right border" +msgstr "ì¤ë¥¸ìª½ ê°ì¥ì리ì ì±ì¸ 공백" + +#: builtin/column.c:32 +msgid "Padding space between columns" +msgstr "ì´ ì¬ì´ì ì±ì¸ 공백" + +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "--commandë 첫 ë²ì§¸ ì¸ìì¬ì¼ í©ëë¤" + +#: builtin/commit.c:38 +msgid "git commit [<options>] [--] <pathspec>..." +msgstr "git commit [<ìµì >] [--] <ê²½ë¡ëª ì¸>..." + +#: builtin/commit.c:43 +msgid "git status [<options>] [--] <pathspec>..." +msgstr "git status [<ìµì >] [--] <ê²½ë¡ëª ì¸>..." + +#: builtin/commit.c:48 +msgid "" +"Your name and email address were configured automatically based\n" +"on your username and hostname. Please check that they are accurate.\n" +"You can suppress this message by setting them explicitly. Run the\n" +"following command and follow the instructions in your editor to edit\n" +"your configuration file:\n" +"\n" +" git config --global --edit\n" +"\n" +"After doing this, you may fix the identity used for this commit with:\n" +"\n" +" git commit --amend --reset-author\n" +msgstr "" +"ì´ë¦ê³¼ ì ìë©ì¼ 주ì를 ì¬ì©ì ì´ë¦ê³¼ í¸ì¤í¸ ì´ë¦ì ì´ì©í´ì ìëì¼ë¡\n" +"ì¤ì íìµëë¤. ì´ ì ë³´ê° ë§ëì§ íì¸íììì¤. ì´ ë©ìì§ë¥¼ ë³´ì§ ìì¼ë ¤ë©´ ì ë³´" +"를\n" +"ëª ìì ì¼ë¡ ì¤ì íììì¤. ë¤ì ëª ë ¹ì´ë¥¼ ì¤ííê³ í¸ì§ê¸°ì ìë´ì ë°ë¼ ì¤ì \n" +"íì¼ì í¸ì§íììì¤:\n" +"\n" +" git config --global --edit\n" +"\n" +"ì´ë ê² í ë¤ì, ì´ ì»¤ë°ì ì¬ì©í ì ì ì 보를 ë¤ìê³¼ ê°ì´ í´ì ë°ê¿ ì ììµë" +"ë¤:\n" +"\n" +" git commit --amend --reset-author\n" + +#: builtin/commit.c:61 +msgid "" +"Your name and email address were configured automatically based\n" +"on your username and hostname. Please check that they are accurate.\n" +"You can suppress this message by setting them explicitly:\n" +"\n" +" git config --global user.name \"Your Name\"\n" +" git config --global user.email you@example.com\n" +"\n" +"After doing this, you may fix the identity used for this commit with:\n" +"\n" +" git commit --amend --reset-author\n" +msgstr "" +"ì´ë¦ê³¼ ì ìë©ì¼ 주ì를 ì¬ì©ì ì´ë¦ê³¼ í¸ì¤í¸ ì´ë¦ì ì´ì©í´ì\n" +"ìëì¼ë¡ ì¤ì íìµëë¤. ì´ ì ë³´ê° ë§ëì§ íì¸íììì¤. ì´ ë©ìì§ë¥¼\n" +"ë³´ì§ ìì¼ë ¤ë©´ ì 보를 ëª ìì ì¼ë¡ ì¤ì íììì¤:\n" +"\n" +" git config --global user.name \"ë´ ì´ë¦\"\n" +" git config --global user.email you@example.com\n" +"\n" +"ì´ë ê² í ë¤ì, ì´ ì»¤ë°ì ì¬ì©í ì ì ì 보를 ë¤ìê³¼ ê°ì´ í´ì ë°ê¿ ì ììµë" +"ë¤:\n" +"\n" +" git commit --amend --reset-author\n" + +#: builtin/commit.c:73 +msgid "" +"You asked to amend the most recent commit, but doing so would make\n" +"it empty. You can repeat your command with --allow-empty, or you can\n" +"remove the commit entirely with \"git reset HEAD^\".\n" +msgstr "" +"ìµì´ì 커ë°ì ë°ê¾¸ë ¤ê³ íì§ë§, ê·¸ë ê² íë©´ 커ë°ì´ ë¹ì´ ìê² ë©ëë¤.\n" +"--allow-empty ìµì ê³¼ ê°ì´ ì´ ëª ë ¹ì ë°ë³µí ìë ìê³ , \"git reset HEAD\"\n" +"ëª ë ¹ì¼ë¡ 커ë°ì ìì í ì ê±°í ìë ììµëë¤.\n" + +#: builtin/commit.c:78 +msgid "" +"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" +"If you wish to commit it anyway, use:\n" +"\n" +" git commit --allow-empty\n" +"\n" +msgstr "" +"ì´ì 커맷 ë¹¼ì¤ê¸°ê° ë¹ì´ ììµëë¤. ìë§ë 충ë í´ê²° ê³¼ì ìì ê·¸ë ê² ëì\n" +"ê²ì ëë¤. ê·¸ëë 커ë°íë ¤ë©´ ë¤ìê³¼ ê°ì´ íììì¤:\n" +"\n" +" git commit --allow-empty\n" +"\n" + +#: builtin/commit.c:85 +msgid "Otherwise, please use 'git reset'\n" +msgstr "ìëë©´ 'git reset'ì ì¬ì©íììì¤\n" + +#: builtin/commit.c:88 +msgid "" +"If you wish to skip this commit, use:\n" +"\n" +" git reset\n" +"\n" +"Then \"git cherry-pick --continue\" will resume cherry-picking\n" +"the remaining commits.\n" +msgstr "" +"ì´ ì»¤ë°ì ê±´ëë°ë ¤ë©´, ë¤ìì ì¬ì©íììì¤:\n" +"\n" +" git reset\n" +"\n" +"ê·¸ ë¤ìì \"git cherry-pick --continue\"를 íë©´ ëë¨¸ì§ ì»¤ë°ì\n" +"ëí´ ì»¤ë° ë¹¼ì¤ê¸°ë¥¼ ë¤ì ììí©ëë¤.\n" + +#: builtin/commit.c:305 +msgid "failed to unpack HEAD tree object" +msgstr "HEAD í¸ë¦¬ ì¤ë¸ì í¸ì 묶ìì í¸ëë° ì¤í¨íìµëë¤" + +#: builtin/commit.c:346 +msgid "unable to create temporary index" +msgstr "ìì ì¸ë±ì¤ë¥¼ ë§ë¤ ì ììµëë¤" + +#: builtin/commit.c:352 +msgid "interactive add failed" +msgstr "ëíí ì¶ê°ê° ì¤í¨íìµëë¤" + +#: builtin/commit.c:365 +msgid "unable to update temporary index" +msgstr "ìì ì¸ë±ì¤ë¥¼ ì ë°ì´í¸í ì ììµëë¤" + +#: builtin/commit.c:367 +msgid "Failed to update main cache tree" +msgstr "주ì ìºì í¸ë¦¬ë¥¼ ì ë°ì´í¸íëë° ì¤í¨íìµëë¤" + +#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463 +msgid "unable to write new_index file" +msgstr "new_index íì¼ì ì¸ ì ììµëë¤" + +#: builtin/commit.c:445 +msgid "cannot do a partial commit during a merge." +msgstr "ë³í©íë ì¤ ë¶ë¶ 커ë°ì í ì ììµëë¤." + +#: builtin/commit.c:447 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "ì»¤ë° ë¹¼ì¤ê¸°ë¥¼ íë ì¤ ë¶ë¶ 커ë°ì í ì ììµëë¤." + +#: builtin/commit.c:456 +msgid "cannot read the index" +msgstr "ì¸ë±ì¤ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/commit.c:475 +msgid "unable to write temporary index file" +msgstr "ìì ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤" + +#: builtin/commit.c:580 +#, c-format +msgid "commit '%s' lacks author header" +msgstr "'%s' 커ë°ì ìì±ì í¤ëê° ììµëë¤" + +#: builtin/commit.c:582 +#, c-format +msgid "commit '%s' has malformed author line" +msgstr "'%s' 커ë°ì ìì±ì í¤ë íìì´ ì못ëììµëë¤" + +#: builtin/commit.c:601 +msgid "malformed --author parameter" +msgstr "--author íë¼ë¯¸í° íìì´ ì못ëììµëë¤" + +#: builtin/commit.c:609 +#, c-format +msgid "invalid date format: %s" +msgstr "ìê° íìì´ ì못ëììµëë¤: %s" + +#: builtin/commit.c:653 +msgid "" +"unable to select a comment character that is not used\n" +"in the current commit message" +msgstr "" +"íì¬ ì»¤ë° ë©ìì§ìì ì¬ì©ëì§ ìë 주ì 문ì를\n" +"ì íí ì ììµëë¤" + +#: builtin/commit.c:690 builtin/commit.c:723 builtin/commit.c:1080 +#, c-format +msgid "could not lookup commit %s" +msgstr "%s 커ë°ì ì°¾ìë³¼ ì ììµëë¤" + +#: builtin/commit.c:702 builtin/shortlog.c:273 +#, c-format +msgid "(reading log message from standard input)\n" +msgstr "(íì¤ ì ë ¥ìì ë¡ê·¸ ë©ìì§ë¥¼ ì½ì)\n" + +#: builtin/commit.c:704 +msgid "could not read log from standard input" +msgstr "íì¤ ì ë ¥ìì ë¡ê·¸ ë©ìì§ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/commit.c:708 +#, c-format +msgid "could not read log file '%s'" +msgstr "'%s' ë¡ê·¸ íì¼ì ì½ì ì ììµëë¤" + +#: builtin/commit.c:730 +msgid "could not read MERGE_MSG" +msgstr "MERGE_MSG를 ì½ì ì ììµëë¤" + +#: builtin/commit.c:734 +msgid "could not read SQUASH_MSG" +msgstr "SQUASH_MSG를 ì½ì ì ììµëë¤" + +#: builtin/commit.c:785 +msgid "could not write commit template" +msgstr "ì»¤ë° ììì ì¸ ì ììµëë¤" + +#: builtin/commit.c:803 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a merge.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"ë³í©ì 커ë°íë ¤ë ê²ì¼ë¡ ë³´ì ëë¤.\n" +"ê·¸ë ì§ ìë¤ë©´, ë¤ì íì¼ì ì§ì°ê³ ,\n" +"\t%s\n" +"ë¤ì ìëíììì¤.\n" + +#: builtin/commit.c:808 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"ì»¤ë° ë¹¼ì¤ê¸°ë¥¼ 커ë°íë ¤ë ê²ì¼ë¡ ë³´ì ëë¤.\n" +"ê·¸ë ì§ ìë¤ë©´, ë¤ì íì¼ì ì§ì°ê³ ,\n" +"\t%s\n" +"ë¤ì ìëíììì¤.\n" + +#: builtin/commit.c:821 +#, c-format +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '%c' will be ignored, and an empty message aborts the commit.\n" +msgstr "" +"ë³ê²½ ì¬íì ëí ì»¤ë° ë©ìì§ë¥¼ ì ë ¥íììì¤. '%c' 문ìë¡ ììíë\n" +"ì¤ì 무ìëê³ , ë©ìì§ë¥¼ ì ë ¥íì§ ìì¼ë©´ 커ë°ì´ ì¤ì§ë©ëë¤.\n" + +#: builtin/commit.c:828 +#, c-format +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '%c' will be kept; you may remove them yourself if you want to.\n" +"An empty message aborts the commit.\n" +msgstr "" +"ë³ê²½ ì¬íì ëí ì»¤ë° ë©ìì§ë¥¼ ì ë ¥íììì¤. '%c' 문ìë¡ ììíë\n" +"ì¤ì ë³´ì¡´ëë, íìíë©´ ì§ì ì ê±°íììì¤. ë©ìì§ë¥¼ ì ë ¥íì§\n" +"ìì¼ë©´ 커ë°ì´ ì¤ì§ë©ëë¤.\n" + +#: builtin/commit.c:848 +#, c-format +msgid "%sAuthor: %.*s <%.*s>" +msgstr "%sìì±ì: %.*s <%.*s>" + +#: builtin/commit.c:856 +#, c-format +msgid "%sDate: %s" +msgstr "%sìê°: %s" + +#: builtin/commit.c:863 +#, c-format +msgid "%sCommitter: %.*s <%.*s>" +msgstr "%s커미í°: %.*s <%.*s>" + +#: builtin/commit.c:881 +msgid "Cannot read index" +msgstr "ì¸ë±ì¤ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/commit.c:938 +msgid "Error building trees" +msgstr "í¸ë¦¬ë¥¼ ë§ëëë° ì¤ë¥" + +#: builtin/commit.c:953 builtin/tag.c:266 +#, c-format +msgid "Please supply the message using either -m or -F option.\n" +msgstr "ë©ìì§ë¥¼ -m ëë -F ìµì ì¼ë¡ ì ë ¥íììì¤.\n" + +#: builtin/commit.c:1055 +#, c-format +msgid "--author '%s' is not 'Name <email>' and matches no existing author" +msgstr "" +"--author '%s' ìµì ì´ 'ì´ë¦ <ì ìë©ì¼>' íìì´ ìëê³ ê¸°ì¡´ ìì±ììë ììµëë¤" + +#: builtin/commit.c:1070 builtin/commit.c:1310 +#, c-format +msgid "Invalid untracked files mode '%s'" +msgstr "ì¶ì ëì§ ìë íì¼ ëª¨ëê° ('%s') ì못ëììµëë¤" + +#: builtin/commit.c:1107 +msgid "--long and -z are incompatible" +msgstr "--long ë° -z ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/commit.c:1137 +msgid "Using both --reset-author and --author does not make sense" +msgstr "--reset-author ë° --author ìµì ì 모ë ì¬ì©íë©´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/commit.c:1146 +msgid "You have nothing to amend." +msgstr "ë°ê¿ ì¬íì´ ììµëë¤." + +#: builtin/commit.c:1149 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "ë³í© ì¤ì ììµëë¤ -- 커ë°ì ë°ê¿ ì ììµëë¤." + +#: builtin/commit.c:1151 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "ì»¤ë° ë¹¼ì¤ê¸° ì¤ì ììµëë¤ -- 커ë°ì ë°ê¿ ì ììµëë¤." + +#: builtin/commit.c:1154 +msgid "Options --squash and --fixup cannot be used together" +msgstr "--squash ë° --fixup ìµì ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/commit.c:1164 +msgid "Only one of -c/-C/-F/--fixup can be used." +msgstr "-c/-C/-F/--fixup ìµì ì¤ì íëë§ ì¬ì©í ì ììµëë¤." + +#: builtin/commit.c:1166 +msgid "Option -m cannot be combined with -c/-C/-F/--fixup." +msgstr "-m ìµì ì -c/-C/-F/--fixup ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤." + +#: builtin/commit.c:1174 +msgid "--reset-author can be used only with -C, -c or --amend." +msgstr "--reset-author ìµì ì -C, -c ëë --amend ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤." + +#: builtin/commit.c:1191 +msgid "Only one of --include/--only/--all/--interactive/--patch can be used." +msgstr "" +"--include/--only/--all/--interactive/--patch ìµì ì¤ íëë§ ì¬ì©í ì ììµë" +"ë¤." + +#: builtin/commit.c:1193 +msgid "No paths with --include/--only does not make sense." +msgstr "ê²½ë¡ê° ìì´ --include/--only ìµì ì ì°ë©´ ìë¤ê° ë§ì§ ììµëë¤." + +#: builtin/commit.c:1195 +msgid "Clever... amending the last one with dirty index." +msgstr "기ë°íë¤ì... ë§ì§ë§ì ë³ê²½ë ì¸ë±ì¤ë¡ ë°ê¿ëë¤." + +#: builtin/commit.c:1197 +msgid "Explicit paths specified without -i or -o; assuming --only paths..." +msgstr "-i ëë -o ìì´ ëª ìì ì¸ ê²½ë¡ë¥¼ ì§ì íìµëë¤. --only ê²½ë¡ë¥¼ ê°ì í©ëë¤..." + +#: builtin/commit.c:1209 builtin/tag.c:475 +#, c-format +msgid "Invalid cleanup mode %s" +msgstr "ì못ë ì 리 모ë %s" + +#: builtin/commit.c:1214 +msgid "Paths with -a does not make sense." +msgstr "-a ìµì ê³¼ ê²½ë¡ë¥¼ ê°ì´ ì¬ì©íë©´ ìë¤ê° ë§ì§ ììµëë¤." + +#: builtin/commit.c:1324 builtin/commit.c:1605 +msgid "show status concisely" +msgstr "ìí를 ê°ëµíê² íìí©ëë¤" + +#: builtin/commit.c:1326 builtin/commit.c:1607 +msgid "show branch information" +msgstr "ë¸ëì¹ ì 보를 íìí©ëë¤" + +#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544 +#: builtin/worktree.c:423 +msgid "machine-readable output" +msgstr "ì»´í¨í°ê° ì½ì ì ìë íì" + +#: builtin/commit.c:1331 builtin/commit.c:1611 +msgid "show status in long format (default)" +msgstr "긴 íìì¼ë¡ ìí를 íìí©ëë¤ (기본ê°)" + +#: builtin/commit.c:1334 builtin/commit.c:1614 +msgid "terminate entries with NUL" +msgstr "NUL 문ìë¡ í목ì ëë ëë¤" + +#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981 +#: builtin/fast-export.c:984 builtin/tag.c:353 +msgid "mode" +msgstr "모ë" + +#: builtin/commit.c:1337 builtin/commit.c:1617 +msgid "show untracked files, optional modes: all, normal, no. (Default: all)" +msgstr "ì¶ì ëì§ ìë íì¼ì íìí©ëë¤. ì¶ê° ìµì : all, normal, no (기본ê°: all)" + +#: builtin/commit.c:1340 +msgid "show ignored files" +msgstr "무ìëë íì¼ì íìí©ëë¤" + +#: builtin/commit.c:1341 parse-options.h:155 +msgid "when" +msgstr "ì¸ì " + +#: builtin/commit.c:1342 +msgid "" +"ignore changes to submodules, optional when: all, dirty, untracked. " +"(Default: all)" +msgstr "íì 모ëì ë³ê²½ì 무ìí©ëë¤. ì¶ê° ìµì : all, dirty, untracked. (기본ê°: all)" + +#: builtin/commit.c:1344 +msgid "list untracked files in columns" +msgstr "ì¶ì ëì§ ìë íì¼ì 목ë¡ì ì¬ë¬ ì´ë¡ íìí©ëë¤" + +#: builtin/commit.c:1430 +msgid "couldn't look up newly created commit" +msgstr "ìë¡ ë§ë 커ë°ì ì°¾ìë³¼ ì ììµëë¤" + +#: builtin/commit.c:1432 +msgid "could not parse newly created commit" +msgstr "ìë¡ ë§ë 커ë°ì íì±í ì ììµëë¤" + +#: builtin/commit.c:1477 +msgid "detached HEAD" +msgstr "HEAD ë¶ë¦¬ë¨" + +#: builtin/commit.c:1480 +msgid " (root-commit)" +msgstr " (ìµìì-커ë°)" + +#: builtin/commit.c:1575 +msgid "suppress summary after successful commit" +msgstr "ì±ê³µì ì¸ ì»¤ë° íì ìì½ì íìíì§ ììµëë¤" + +#: builtin/commit.c:1576 +msgid "show diff in commit message template" +msgstr "ì»¤ë° ë©ìì§ ììì diff를 íìí©ëë¤" + +#: builtin/commit.c:1578 +msgid "Commit message options" +msgstr "ì»¤ë° ë©ìì§ ìµì " + +#: builtin/commit.c:1579 builtin/tag.c:351 +msgid "read message from file" +msgstr "íì¼ìì ë©ìì§ë¥¼ ì½ìµëë¤" + +#: builtin/commit.c:1580 +msgid "author" +msgstr "ìì±ì" + +#: builtin/commit.c:1580 +msgid "override author for commit" +msgstr "커ë°ì ìì±ì를 ì§ì í©ëë¤" + +#: builtin/commit.c:1581 builtin/gc.c:326 +msgid "date" +msgstr "ìê°" + +#: builtin/commit.c:1581 +msgid "override date for commit" +msgstr "커ë°ì ìê°ì ì§ì í©ëë¤" + +#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392 +#: builtin/notes.c:555 builtin/tag.c:349 +msgid "message" +msgstr "ë©ìì§" + +#: builtin/commit.c:1582 +msgid "commit message" +msgstr "ì»¤ë° ë©ìì§" + +#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585 +#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79 +msgid "commit" +msgstr "커ë°" + +#: builtin/commit.c:1583 +msgid "reuse and edit message from specified commit" +msgstr "ì§ì í 커ë°ì ë©ìì§ë¥¼ ì¬ì¬ì©íê³ í¸ì§í©ëë¤" + +#: builtin/commit.c:1584 +msgid "reuse message from specified commit" +msgstr "ì§ì í 커ë°ìì ë©ìì§ë¥¼ ì¬ì¬ì©í©ëë¤" + +#: builtin/commit.c:1585 +msgid "use autosquash formatted message to fixup specified commit" +msgstr "ì§ì í 커ë°ì ìì íëë° autosquash íì ë©ìì§ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/commit.c:1586 +msgid "use autosquash formatted message to squash specified commit" +msgstr "ì§ì í 커ë°ì í©ì¹ëë° autosquash íì ë©ìì§ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/commit.c:1587 +msgid "the commit is authored by me now (used with -C/-c/--amend)" +msgstr "커ë°ì ë´ê° ìì±í ê²ì¼ë¡ ë§ëëë¤ (-C/-c/--amendì ê°ì´ ì¬ì©)" + +#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86 +msgid "add Signed-off-by:" +msgstr "Signed-off-by: ì¤ì ì¶ê°í©ëë¤" + +#: builtin/commit.c:1589 +msgid "use specified template file" +msgstr "ì§ì í ìì íì¼ì ì¬ì©í©ëë¤" + +#: builtin/commit.c:1590 +msgid "force edit of commit" +msgstr "ì»¤ë° í¸ì§ì ê°ì í©ëë¤" + +#: builtin/commit.c:1591 +msgid "default" +msgstr "기본ê°" + +#: builtin/commit.c:1591 builtin/tag.c:354 +msgid "how to strip spaces and #comments from message" +msgstr "ë©ìì§ìì 공백과 #주ìì ì§ìëë¤" + +#: builtin/commit.c:1592 +msgid "include status in commit message template" +msgstr "ì»¤ë° ë©ìì§ ììì ìí를 í¬í¨í©ëë¤" + +#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156 +#: builtin/revert.c:93 +msgid "GPG sign commit" +msgstr "GPG ìëª ì»¤ë°" + +#: builtin/commit.c:1597 +msgid "Commit contents options" +msgstr "ì»¤ë° ë´ì© ìµì " + +#: builtin/commit.c:1598 +msgid "commit all changed files" +msgstr "ë³ê²½ë íì¼ì 모ë 커ë°í©ëë¤" + +#: builtin/commit.c:1599 +msgid "add specified files to index for commit" +msgstr "ì§ì í íì¼ì 커ë°í ì¸ë±ì¤ì ì¶ê°í©ëë¤" + +#: builtin/commit.c:1600 +msgid "interactively add files" +msgstr "ëííì¼ë¡ íì¼ì ì¶ê°í©ëë¤" + +#: builtin/commit.c:1601 +msgid "interactively add changes" +msgstr "ëííì¼ë¡ ë³ê²½ ì¬íì ì¶ê°í©ëë¤" + +#: builtin/commit.c:1602 +msgid "commit only specified files" +msgstr "ì§ì í íì¼ë§ 커ë°í©ëë¤" + +#: builtin/commit.c:1603 +msgid "bypass pre-commit hook" +msgstr "ì»¤ë° ì íí¬ë¥¼ ê±´ëëëë¤" + +#: builtin/commit.c:1604 +msgid "show what would be committed" +msgstr "무ìì 커ë°í ì§ íìí©ëë¤" + +#: builtin/commit.c:1615 +msgid "amend previous commit" +msgstr "ë°ë¡ ì 커ë°ì ë°ê¿ëë¤" + +#: builtin/commit.c:1616 +msgid "bypass post-rewrite hook" +msgstr "ë¤ìì°ê¸° í íí¬ë¥¼ ê±´ëëëë¤" + +#: builtin/commit.c:1621 +msgid "ok to record an empty change" +msgstr "ë¹ ë³ê²½ ì¬íì 기ë¡íëë¡ íì©í©ëë¤" + +#: builtin/commit.c:1623 +msgid "ok to record a change with an empty message" +msgstr "ë¹ ë©ìì§ì ê°ì´ ë³ê²½ ì¬íì 기ë¡íëë¡ íì©í©ëë¤" + +#: builtin/commit.c:1652 +msgid "could not parse HEAD commit" +msgstr "HEAD 커ë°ì íì±í ì ììµëë¤" + +#: builtin/commit.c:1698 +#, c-format +msgid "Corrupt MERGE_HEAD file (%s)" +msgstr "ììë MERGE_HEAD íì¼ (%s)" + +#: builtin/commit.c:1705 +msgid "could not read MERGE_MODE" +msgstr "MERGE_MODE를 ì½ì ì ììµëë¤" + +#: builtin/commit.c:1724 +#, c-format +msgid "could not read commit message: %s" +msgstr "ì»¤ë° ë©ìì§ë¥¼ ì½ì ì ììµëë¤: %s" + +#: builtin/commit.c:1735 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "커ë°ì ì¤ì§í©ëë¤. ë©ìì§ë¥¼ í¸ì§íì§ ìììµëë¤.\n" + +#: builtin/commit.c:1740 +#, c-format +msgid "Aborting commit due to empty commit message.\n" +msgstr "커ë°ì ì¤ì§í©ëë¤. ì»¤ë° ë©ìì§ê° ë¹ì´ ììµëë¤.\n" + +#: builtin/commit.c:1788 +msgid "" +"Repository has been updated, but unable to write\n" +"new_index file. Check that disk is not full and quota is\n" +"not exceeded, and then \"git reset HEAD\" to recover." +msgstr "" +"ì ì¥ì를 ì ë°ì´í¸íìµëë¤. íì§ë§ new_index íì¼ì ì¸ ì\n" +"ììµëë¤. ëì¤í¬ê° ê½ ì°¨ì§ ììê³ ì í ì©ëì ëì´ê°ì§\n" +"ììëì§ íì¸íììì¤. ê·¸ë¦¬ê³ 'git reset HEAD'ë¡ ë³µêµ¬íììì¤." + +#: builtin/config.c:8 +msgid "git config [<options>]" +msgstr "git config [<ìµì >]" + +#: builtin/config.c:54 +msgid "Config file location" +msgstr "ì¤ì íì¼ ìì¹" + +#: builtin/config.c:55 +msgid "use global config file" +msgstr "ê³µíµ ì¤ì íì¼ì ì¬ì©í©ëë¤" + +#: builtin/config.c:56 +msgid "use system config file" +msgstr "ìì¤í ì¤ì íì¼ì ì¬ì©í©ëë¤" + +#: builtin/config.c:57 +msgid "use repository config file" +msgstr "ì ì¥ì ì¤ì íì¼ì ì¬ì©í©ëë¤" + +#: builtin/config.c:58 +msgid "use given config file" +msgstr "ì§ì í ì¤ì íì¼ì ì¬ì©í©ëë¤" + +#: builtin/config.c:59 +msgid "blob-id" +msgstr "ë¸ë¡-id" + +#: builtin/config.c:59 +msgid "read config from given blob object" +msgstr "ì§ì í ë¸ë¡ ì¤ë¸ì í¸ìì ì¤ì ì ì½ìµëë¤" + +#: builtin/config.c:60 +msgid "Action" +msgstr "ëì" + +#: builtin/config.c:61 +msgid "get value: name [value-regex]" +msgstr "ê°ì ê°ì ¸ìµëë¤: <ì´ë¦> [<ê°-ì ê·ì>]" + +#: builtin/config.c:62 +msgid "get all values: key [value-regex]" +msgstr "모ë ê°ì ê°ì ¸ìµëë¤: <í¤> [<ê°-ì ê·ì>]" + +#: builtin/config.c:63 +msgid "get values for regexp: name-regex [value-regex]" +msgstr "ì ê·ìì ëí ê°ì ê°ì ¸ìµëë¤: <ì´ë¦-ì ê·ì> [<ê°-ì ê·ì>]" + +#: builtin/config.c:64 +msgid "get value specific for the URL: section[.var] URL" +msgstr "<URL>ì í¹ì ëë ê°ì ê°ì ¸ìµëë¤: <ì¹ì >[.<ë³ì>] <URL>" + +#: builtin/config.c:65 +msgid "replace all matching variables: name value [value_regex]" +msgstr "í´ë¹íë ë³ì를 모ë ì ê±°í©ëë¤: <ì´ë¦> <ê°> [<ê°-ì ê·ì>]" + +#: builtin/config.c:66 +msgid "add a new variable: name value" +msgstr "ì ë³ì를 ì¶ê°í©ëë¤: <ì´ë¦> <ê°>" + +#: builtin/config.c:67 +msgid "remove a variable: name [value-regex]" +msgstr "ë³ì를 ì ê±°í©ëë¤: <ì´ë¦> [<ê°-ì ê·ì>]" + +#: builtin/config.c:68 +msgid "remove all matches: name [value-regex]" +msgstr "í´ë¹íë í목ì 모ë ì ê±°í©ëë¤: <ì´ë¦> [<ê°-ì ê·ì>]" + +#: builtin/config.c:69 +msgid "rename section: old-name new-name" +msgstr "ì¹ì ì ì´ë¦ì ë°ê¿ëë¤: <ì-ì´ë¦> <ì-ì´ë¦>" + +#: builtin/config.c:70 +msgid "remove a section: name" +msgstr "ì¹ì ì ì ê±°í©ëë¤: <ì´ë¦>" + +#: builtin/config.c:71 +msgid "list all" +msgstr "ì ì²´ 목ë¡ì íìí©ëë¤" + +#: builtin/config.c:72 +msgid "open an editor" +msgstr "í¸ì§ê¸°ë¥¼ ì½ëë¤" + +#: builtin/config.c:73 +msgid "find the color configured: slot [default]" +msgstr "ì¤ì í ìì ì°¾ìµëë¤: slot [<기본ê°>]" + +#: builtin/config.c:74 +msgid "find the color setting: slot [stdout-is-tty]" +msgstr "ì ì¤ì ì ì°¾ìµëë¤: slot [<íì¤ì¶ë ¥ì´-TTYì¸ì§-ì¬ë¶>]" + +#: builtin/config.c:75 +msgid "Type" +msgstr "ê° ì¢ ë¥" + +#: builtin/config.c:76 +msgid "value is \"true\" or \"false\"" +msgstr "ê°ì´ \"true\" ëë \"false\"ì ëë¤" + +#: builtin/config.c:77 +msgid "value is decimal number" +msgstr "ê°ì´ ìì§ìì ëë¤" + +#: builtin/config.c:78 +msgid "value is --bool or --int" +msgstr "ê°ì´ --bool ëë --intì ëë¤" + +#: builtin/config.c:79 +msgid "value is a path (file or directory name)" +msgstr "ê°ì´ ê²½ë¡(íì¼ ëë ëë í°ë¦¬ ì´ë¦)ì ëë¤" + +#: builtin/config.c:80 +msgid "Other" +msgstr "기í" + +#: builtin/config.c:81 +msgid "terminate values with NUL byte" +msgstr "ê°ì NUL ë°ì´í¸ë¡ ëë ëë¤" + +#: builtin/config.c:82 +msgid "show variable names only" +msgstr "ë³ì ì´ë¦ë§ íìí©ëë¤" + +#: builtin/config.c:83 +msgid "respect include directives on lookup" +msgstr "ì°¾ìë³¼ ë include ì§ìì´ë¥¼ ê³ ë ¤í©ëë¤" + +#: builtin/config.c:303 +msgid "unable to parse default color value" +msgstr "기본 ì ê°ì íì±í ì ììµëë¤" + +#: builtin/config.c:441 +#, c-format +msgid "" +"# This is Git's per-user configuration file.\n" +"[user]\n" +"# Please adapt and uncomment the following lines:\n" +"#\tname = %s\n" +"#\temail = %s\n" +msgstr "" +"# ê¹ì ì¬ì©ìë³ ì¤ì íì¼ì ëë¤.\n" +"[user]\n" +"# ë¤ì ì¤ì ìë§ê² ê³ ì¹ê³ ìì 주ìì ì ê±°íììì¤:\n" +"#\tname = %s\n" +"#\temail = %s\n" + +#: builtin/config.c:575 +#, c-format +msgid "cannot create configuration file %s" +msgstr "%s ì¤ì íì¼ì ë§ë¤ ì ììµëë¤" + +#: builtin/count-objects.c:77 +msgid "git count-objects [-v] [-H | --human-readable]" +msgstr "git count-objects [-v] [-H | --human-readable]" + +#: builtin/count-objects.c:87 +msgid "print sizes in human readable format" +msgstr "ì¬ëì´ ì½ê¸° ì¢ì íìì¼ë¡ í¬ê¸°ë¥¼ íìí©ëë¤" + +#: builtin/describe.c:17 +msgid "git describe [<options>] [<commit-ish>...]" +msgstr "git describe [<ìµì >] [<커ë°-ë°ì>...]" + +#: builtin/describe.c:18 +msgid "git describe [<options>] --dirty" +msgstr "git describe [<ìµì >] --dirty" + +#: builtin/describe.c:217 +#, c-format +msgid "annotated tag %s not available" +msgstr "주ì ë¬ë¦° %s í그를 ì¬ì©í ì ììµëë¤" + +#: builtin/describe.c:221 +#, c-format +msgid "annotated tag %s has no embedded name" +msgstr "주ì ë¬ë¦° %s íê·¸ì ë´ì¥ë ì´ë¦ì´ ììµëë¤" + +#: builtin/describe.c:223 +#, c-format +msgid "tag '%s' is really '%s' here" +msgstr "'%s' íê·¸ê° ì¤ì ì¬ê¸° '%s'ì ëë¤" + +#: builtin/describe.c:250 builtin/log.c:459 +#, c-format +msgid "Not a valid object name %s" +msgstr "ì¬ë°ë¥¸ ì¤ë¸ì í¸ ì´ë¦ì´ ìëëë¤ (%s)" + +#: builtin/describe.c:253 +#, c-format +msgid "%s is not a valid '%s' object" +msgstr "%sì(ë) ì¬ë°ë¥¸ '%s' ì¤ë¸ì í¸ê° ìëëë¤" + +#: builtin/describe.c:270 +#, c-format +msgid "no tag exactly matches '%s'" +msgstr "ì´ë¤ íê·¸ë '%s'ì(ê³¼) ì íí ì¼ì¹íì§ ììµëë¤" + +#: builtin/describe.c:272 +#, c-format +msgid "searching to describe %s\n" +msgstr "%s ì¤ëª ì ìí´ ê²ìíë ì¤\n" + +#: builtin/describe.c:319 +#, c-format +msgid "finished search at %s\n" +msgstr "%sìì ê²ì ë§ì¹¨\n" + +#: builtin/describe.c:346 +#, c-format +msgid "" +"No annotated tags can describe '%s'.\n" +"However, there were unannotated tags: try --tags." +msgstr "" +"ì´ë¤ 주ì ë¬ë¦° íê·¸ë '%s'ì(를) ì¤ëª íì§ ììµëë¤.\n" +"íì§ë§ 주ì ë¬ë¦¬ì§ ìì íê·¸ê° ììµëë¤: --tags ìµì ì í´ ë³´ììì¤." + +#: builtin/describe.c:350 +#, c-format +msgid "" +"No tags can describe '%s'.\n" +"Try --always, or create some tags." +msgstr "" +"ì´ë¤ íê·¸ë '%s'ì(를) ì¤ëª í ì ììµëë¤.\n" +"--always ìµì ì ì¨ ë³´ê±°ë, í그를 ë§ë¤ì´ ë³´ììì¤." + +#: builtin/describe.c:371 +#, c-format +msgid "traversed %lu commits\n" +msgstr "ì»¤ë° %luê°ë¥¼ ê°ë¡ì§ë ìµëë¤\n" + +#: builtin/describe.c:374 +#, c-format +msgid "" +"more than %i tags found; listed %i most recent\n" +"gave up search at %s\n" +msgstr "" +"í그를 %iê° ëê² ì°¾ììµëë¤. ê°ì¥ ìµê·¼ì %iê° ëª©ë¡ì\n" +"íìí©ëë¤. %s ìì¹ìì ê²ìì ì¤ì§í©ëë¤.\n" + +#: builtin/describe.c:396 +msgid "find the tag that comes after the commit" +msgstr "ì»¤ë° ë¤ìì ì¤ë í그를 ì°¾ìµëë¤" + +#: builtin/describe.c:397 +msgid "debug search strategy on stderr" +msgstr "íì¤ ì¤ë¥ìì ê²ì ì ëµì ëë²ê¹ í©ëë¤" + +#: builtin/describe.c:398 +msgid "use any ref" +msgstr "모ë ë í¼ë°ì¤ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/describe.c:399 +msgid "use any tag, even unannotated" +msgstr "모ë í그를, 주ì ë¬ë¦¬ì§ ìì íê·¸ê¹ì§ ì¬ì©í©ëë¤" + +#: builtin/describe.c:400 +msgid "always use long format" +msgstr "íì 긴 íìì ì¬ì©í©ëë¤" + +#: builtin/describe.c:401 +msgid "only follow first parent" +msgstr "첫 ë²ì§¸ ì´ì 커ë°ë§ ë°ë¼ê°ëë¤" + +#: builtin/describe.c:404 +msgid "only output exact matches" +msgstr "ì íí ì¼ì¹íë íëª©ë§ ì¶ë ¥í©ëë¤" + +#: builtin/describe.c:406 +msgid "consider <n> most recent tags (default: 10)" +msgstr "<n>ê°ì ê°ì¥ ìµê·¼ì íê·¸ë§ ê³ ë ¤í©ëë¤ (기본ê°: 10)" + +#: builtin/describe.c:408 +msgid "only consider tags matching <pattern>" +msgstr "<í¨í´>ê³¼ ì¼ì¹íë íê·¸ë§ ê³ ë ¤í©ëë¤" + +#: builtin/describe.c:410 builtin/name-rev.c:314 +msgid "show abbreviated commit object as fallback" +msgstr "ëìì¼ë¡ ìì½í ì»¤ë° ì¤ë¸ì í¸ë¥¼ íìí©ëë¤" + +#: builtin/describe.c:411 +msgid "mark" +msgstr "íì" + +#: builtin/describe.c:412 +msgid "append <mark> on dirty working tree (default: \"-dirty\")" +msgstr "ë³ê²½ë ìì í´ëì <íì>를 ë¤ì ë¶ì ëë¤ (기본ê°: \"-dirty\")" + +#: builtin/describe.c:430 +msgid "--long is incompatible with --abbrev=0" +msgstr "--long ìµì ì --abbrev=0 ìµì ê³¼ í¸íëì§ ììµëë¤" + +#: builtin/describe.c:456 +msgid "No names found, cannot describe anything." +msgstr "ì´ë¦ì´ ììµëë¤. ì무ê²ë ì¤ëª í ì ììµëë¤." + +#: builtin/describe.c:476 +msgid "--dirty is incompatible with commit-ishes" +msgstr "--dirty ìµì ì 커ë°ê°ì í목과 í¸íëì§ ìììµëë¤" + +#: builtin/diff.c:86 +#, c-format +msgid "'%s': not a regular file or symlink" +msgstr "'%s': ì¼ë° íì¼ì´ë ì¬ë³¼ë¦ ë§í¬ê° ìëëë¤" + +#: builtin/diff.c:237 +#, c-format +msgid "invalid option: %s" +msgstr "ì못ë ìµì : %s" + +#: builtin/diff.c:358 +msgid "Not a git repository" +msgstr "ê¹ ì ì¥ìê° ìëëë¤" + +#: builtin/diff.c:401 +#, c-format +msgid "invalid object '%s' given." +msgstr "ì못ë '%s' ì¤ë¸ì í¸ê° 주ì´ì¡ìµëë¤." + +#: builtin/diff.c:410 +#, c-format +msgid "more than two blobs given: '%s'" +msgstr "ë ê°ë³´ë¤ ë§ì ë¸ë¡ì´ 주ì´ì¡ìµëë¤: '%s'" + +#: builtin/diff.c:417 +#, c-format +msgid "unhandled object '%s' given." +msgstr "ì²ë¦¬íì§ ìì '%s' ì¤ë¸ì í¸ê° 주ì´ì¡ìµëë¤." + +#: builtin/fast-export.c:25 +msgid "git fast-export [rev-list-opts]" +msgstr "git fast-export [rev-list-ìµì ]" + +#: builtin/fast-export.c:980 +msgid "show progress after <n> objects" +msgstr "ì¤ë¸ì í¸ <n>ê° ë¤ì ì§í ìí©ì íìí©ëë¤" + +#: builtin/fast-export.c:982 +msgid "select handling of signed tags" +msgstr "ìëª í íê·¸ì ì²ë¦¬ ë°©ìì ì íí©ëë¤" + +#: builtin/fast-export.c:985 +msgid "select handling of tags that tag filtered objects" +msgstr "íí°ë§í ì¤ë¸ì í¸ì ëí íê·¸ì ì²ë¦¬ ë°©ìì ì íí©ëë¤" + +#: builtin/fast-export.c:988 +msgid "Dump marks to this file" +msgstr "ì´ íì¼ë¡ íì를 ë´ë³´ë ëë¤" + +#: builtin/fast-export.c:990 +msgid "Import marks from this file" +msgstr "ì´ íì¼ìì íì를 ê°ì ¸ìµëë¤" + +#: builtin/fast-export.c:992 +msgid "Fake a tagger when tags lack one" +msgstr "íê·¸ì íê·¸ë¶ì¸ ì¬ëì´ ìì ë ê°ì§ë¡ ë§ëëë¤" + +#: builtin/fast-export.c:994 +msgid "Output full tree for each commit" +msgstr "ì»¤ë° ë§ë¤ ì ì²´ í¸ë¦¬ë¥¼ ì¶ë ¥í©ëë¤" + +#: builtin/fast-export.c:996 +msgid "Use the done feature to terminate the stream" +msgstr "ì¤í¸ë¦¼ì ëë´ëë° ìë£ ê¸°ë¥ì ì¬ì©í©ëë¤" + +#: builtin/fast-export.c:997 +msgid "Skip output of blob data" +msgstr "ë¸ë¡ ë°ì´í°ì ì¶ë ¥ì ê±´ëëëë¤" + +#: builtin/fast-export.c:998 +msgid "refspec" +msgstr "ë í¼ë°ì¤ëª ì¸" + +#: builtin/fast-export.c:999 +msgid "Apply refspec to exported refs" +msgstr "ë í¼ë°ì¤ëª ì¸ë¥¼ ë´ë³´ë¸ ë í¼ë°ì¤ì ì ì©í©ëë¤" + +#: builtin/fast-export.c:1000 +msgid "anonymize output" +msgstr "ì¶ë ¥ì ìµëª íí©ëë¤" + +#: builtin/fetch.c:20 +msgid "git fetch [<options>] [<repository> [<refspec>...]]" +msgstr "git fetch [<ìµì >] [<ì ì¥ì> [<ë í¼ë°ì¤ëª ì¸>...]]" + +#: builtin/fetch.c:21 +msgid "git fetch [<options>] <group>" +msgstr "git fetch [<ìµì >] <그룹>" + +#: builtin/fetch.c:22 +msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]" +msgstr "git fetch --multiple [<ìµì >] [(<ì ì¥ì> | <그룹>)...]" + +#: builtin/fetch.c:23 +msgid "git fetch --all [<options>]" +msgstr "git fetch --all [<ìµì >]" + +#: builtin/fetch.c:90 builtin/pull.c:162 +msgid "fetch from all remotes" +msgstr "모ë 리모í¸ìì ê°ì ¸ìµëë¤" + +#: builtin/fetch.c:92 builtin/pull.c:165 +msgid "append to .git/FETCH_HEAD instead of overwriting" +msgstr "ë®ì´ì°ì§ ë§ê³ .git/FETCH_HEADì ë§ë¶ì ëë¤" + +#: builtin/fetch.c:94 builtin/pull.c:168 +msgid "path to upload pack on remote end" +msgstr "ë¦¬ëª¨í¸ ìª½ì 묶ìì ì ë¡ëí ê²½ë¡" + +#: builtin/fetch.c:95 builtin/pull.c:170 +msgid "force overwrite of local branch" +msgstr "ë¡ì»¬ ë¸ëì¹ë¥¼ ê°ì ë¡ ë®ì´ìëë¤" + +#: builtin/fetch.c:97 +msgid "fetch from multiple remotes" +msgstr "ì¬ë¬ 리모í¸ìì ê°ì ¸ìµëë¤" + +#: builtin/fetch.c:99 builtin/pull.c:172 +msgid "fetch all tags and associated objects" +msgstr "모ë íê·¸ì ê´ë ¨ ì¤ë¸ì í¸ë¥¼ ê°ì ¸ìµëë¤" + +#: builtin/fetch.c:101 +msgid "do not fetch all tags (--no-tags)" +msgstr "모ë í그를 ê°ì ¸ì¤ì§ ììµëë¤ (--no-tags)" + +#: builtin/fetch.c:103 builtin/pull.c:175 +msgid "prune remote-tracking branches no longer on remote" +msgstr "리모í¸ì ì´ì ìë ë¦¬ëª¨í¸ ì¶ì ë¸ëì¹ë¥¼ ìë¼ë ëë¤" + +#: builtin/fetch.c:104 builtin/pull.c:178 +msgid "on-demand" +msgstr "주문í" + +#: builtin/fetch.c:105 builtin/pull.c:179 +msgid "control recursive fetching of submodules" +msgstr "íì 모ë ì¬ê·ì ì¼ë¡ ê°ì ¸ì¤ê¸° ë°©ìì ì¤ì í©ëë¤" + +#: builtin/fetch.c:109 builtin/pull.c:184 +msgid "keep downloaded pack" +msgstr "ë¤ì´ë¡ëí 묶ìì ë³´ì¡´í©ëë¤" + +#: builtin/fetch.c:111 +msgid "allow updating of HEAD ref" +msgstr "HEAD ë í¼ë°ì¤ ì ë°ì´í¸ë¥¼ íì©í©ëë¤" + +#: builtin/fetch.c:114 builtin/pull.c:187 +msgid "deepen history of shallow clone" +msgstr "ìì ë³µì ì ì»¤ë° ë´ìì ê¹ê² ë§ëëë¤" + +#: builtin/fetch.c:116 builtin/pull.c:190 +msgid "convert to a complete repository" +msgstr "ìì í ì ì¥ìë¡ ì íí©ëë¤" + +#: builtin/fetch.c:118 builtin/log.c:1233 +msgid "dir" +msgstr "ëë í°ë¦¬" + +#: builtin/fetch.c:119 +msgid "prepend this to submodule path output" +msgstr "íì 모ë ê²½ë¡ ì¶ë ¥ì ìì ì´ ëë í°ë¦¬ë¥¼ ë¶ì ëë¤" + +#: builtin/fetch.c:122 +msgid "default mode for recursion" +msgstr "ì¬ê· 기본 모ë" + +#: builtin/fetch.c:124 builtin/pull.c:193 +msgid "accept refs that update .git/shallow" +msgstr ".git/shallow를 ì ë°ì´í¸íë ë í¼ë°ì¤ë¥¼ íì©í©ëë¤" + +#: builtin/fetch.c:125 builtin/pull.c:195 +msgid "refmap" +msgstr "ë í¼ë°ì¤ë§µ" + +#: builtin/fetch.c:126 builtin/pull.c:196 +msgid "specify fetch refmap" +msgstr "ë í¼ë°ì¤ë§µ ê°ì ¸ì¤ê¸°ë¥¼ ì§ì í©ëë¤" + +#: builtin/fetch.c:378 +msgid "Couldn't find remote ref HEAD" +msgstr "ë¦¬ëª¨í¸ ë í¼ë°ì¤ HEAD를 ì°¾ì ì ììµëë¤" + +#: builtin/fetch.c:458 +#, c-format +msgid "object %s not found" +msgstr "%s ì¤ë¸ì í¸ê° ììµëë¤" + +#: builtin/fetch.c:463 +msgid "[up to date]" +msgstr "[ìµì ìí]" + +#: builtin/fetch.c:477 +#, c-format +msgid "! %-*s %-*s -> %s (can't fetch in current branch)" +msgstr "! %-*s %-*s -> %s (íì¬ ë¸ëì¹ìì ê°ì ¸ì¬ ì ìì)" + +#: builtin/fetch.c:478 builtin/fetch.c:566 +msgid "[rejected]" +msgstr "[ê±°ë¶ë¨]" + +#: builtin/fetch.c:489 +msgid "[tag update]" +msgstr "[íê·¸ ì ë°ì´í¸]" + +#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544 +msgid " (unable to update local ref)" +msgstr " (ë¡ì»¬ ë í¼ë°ì¤ë¥¼ ì ë°ì´í¸í ì ìì)" + +#: builtin/fetch.c:509 +msgid "[new tag]" +msgstr "[ìë¡ì´ íê·¸]" + +#: builtin/fetch.c:512 +msgid "[new branch]" +msgstr "[ìë¡ì´ ë¸ëì¹]" + +#: builtin/fetch.c:515 +msgid "[new ref]" +msgstr "[ìë¡ì´ ë í¼ë°ì¤]" + +#: builtin/fetch.c:561 +msgid "unable to update local ref" +msgstr "ë¡ì»¬ ë í¼ë°ì¤ë¥¼ ì ë°ì´í¸í ì ììµëë¤" + +#: builtin/fetch.c:561 +msgid "forced update" +msgstr "ê°ì ì ë°ì´í¸" + +#: builtin/fetch.c:568 +msgid "(non-fast-forward)" +msgstr "(ì ë°©í¥ ì§íì´ ìë)" + +#: builtin/fetch.c:602 builtin/fetch.c:843 +#, c-format +msgid "cannot open %s: %s\n" +msgstr "%sì(를) ì´ ì ììµëë¤: %s\n" + +#: builtin/fetch.c:611 +#, c-format +msgid "%s did not send all necessary objects\n" +msgstr "%sì´(ê°) 모ë íìí ì¤ë¸ì í¸ë¥¼ ë³´ë´ì§ ìììµëë¤\n" + +#: builtin/fetch.c:629 +#, c-format +msgid "reject %s because shallow roots are not allowed to be updated" +msgstr "ìì ìµììì ì ë°ì´í¸ê° íì©ëì§ ìì¼ë¯ë¡ %sì(를) ê±°ë¶í©ëë¤" + +#: builtin/fetch.c:716 builtin/fetch.c:808 +#, c-format +msgid "From %.*s\n" +msgstr "%.*s URLìì\n" + +#: builtin/fetch.c:727 +#, c-format +msgid "" +"some local refs could not be updated; try running\n" +" 'git remote prune %s' to remove any old, conflicting branches" +msgstr "" +"ì ë°ì´í¸í ì ìë ë¡ì»¬ ë í¼ë°ì¤ê° ììµëë¤. 과거 충ë ë¸ëì¹ë¥¼\n" +" ì ê±°íë ¤ë©´ 'git remote prune %s' ëª ë ¹ì ì¤íí´ ë³´ììì¤" + +#: builtin/fetch.c:779 +#, c-format +msgid " (%s will become dangling)" +msgstr " (%s ë í¼ë°ì¤ê° ì°ê²°ì´ ëì´ì§ê² ë©ëë¤)" + +#: builtin/fetch.c:780 +#, c-format +msgid " (%s has become dangling)" +msgstr " (%s ë í¼ë°ì¤ê° ì°ê²°ì´ ëì´ì¡ìµëë¤)" + +#: builtin/fetch.c:812 +msgid "[deleted]" +msgstr "[ìì ë¨]" + +#: builtin/fetch.c:813 builtin/remote.c:1040 +msgid "(none)" +msgstr "(ìì)" + +#: builtin/fetch.c:833 +#, c-format +msgid "Refusing to fetch into current branch %s of non-bare repository" +msgstr "ê°ëµí ì ì¥ìê° ìë ì ì¥ìì íì¬ %s ë¸ëì¹ë¡ ê°ì ¸ì¤ê¸°ë¥¼ ê±°ì í©ëë¤" + +#: builtin/fetch.c:852 +#, c-format +msgid "Option \"%s\" value \"%s\" is not valid for %s" +msgstr "\"%s\" ìµì ì \"%s\" ê°ì %sì ëí´ ì¬ë°ë¥´ì§ ììµëë¤" + +#: builtin/fetch.c:855 +#, c-format +msgid "Option \"%s\" is ignored for %s\n" +msgstr "\"%s\" ìµì ì '%s'ì ëí´ ë¬´ìë©ëë¤\n" + +#: builtin/fetch.c:911 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "'%s'ìì ê°ì ¸ì¤ë ë°©ë²ì ì ì ììµëë¤" + +#: builtin/fetch.c:1072 +#, c-format +msgid "Fetching %s\n" +msgstr "%sì(를) ê°ì ¸ì¤ë ì¤\n" + +#: builtin/fetch.c:1074 builtin/remote.c:96 +#, c-format +msgid "Could not fetch %s" +msgstr "%sì(를) ê°ì ¸ì¬ ì ììµëë¤" + +#: builtin/fetch.c:1092 +msgid "" +"No remote repository specified. Please, specify either a URL or a\n" +"remote name from which new revisions should be fetched." +msgstr "" +"ë¦¬ëª¨í¸ ì ì¥ì를 ì§ì íì§ ìììµëë¤. ì 리ë¹ì ì ê°ì ¸ì¬ ì ìë\n" +"URLì´ë ë¦¬ëª¨í¸ ì´ë¦ì ì§ì íììì¤." + +#: builtin/fetch.c:1115 +msgid "You need to specify a tag name." +msgstr "íê·¸ ì´ë¦ì ì§ì í´ì¼ í©ëë¤." + +#: builtin/fetch.c:1157 +msgid "--depth and --unshallow cannot be used together" +msgstr "--depth ë° --unshallow ìµì ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/fetch.c:1159 +msgid "--unshallow on a complete repository does not make sense" +msgstr "ìì í ì ì¥ìì ëí´ --unshallow ìµì ì ì¬ì©íë ê±´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/fetch.c:1179 +msgid "fetch --all does not take a repository argument" +msgstr "fetch --all ëª ë ¹ì ì ì¥ì ì¸ìê° ììµëë¤" + +#: builtin/fetch.c:1181 +msgid "fetch --all does not make sense with refspecs" +msgstr "fetch --all ëª ë ¹ì ë í¼ë°ì¤ëª ì¸ ì¸ìì ê°ì´ ì°ë©´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/fetch.c:1192 +#, c-format +msgid "No such remote or remote group: %s" +msgstr "ê·¸ë° ë¦¬ëª¨í¸ë ë¦¬ëª¨í¸ ê·¸ë£¹ì´ ììµëë¤: %s" + +#: builtin/fetch.c:1200 +msgid "Fetching a group and specifying refspecs does not make sense" +msgstr "그룹ì ê°ì ¸ì¤ê³ ë í¼ë°ì¤ëª ì¸ë¥¼ ì§ì íë©´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/fmt-merge-msg.c:14 +msgid "" +"git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]" +msgstr "" +"git fmt-merge-msg [-m <ë©ìì§>] [--log[=<n>] | --no-log] [--file <íì¼>]" + +#: builtin/fmt-merge-msg.c:667 +msgid "populate log with at most <n> entries from shortlog" +msgstr "shortlogìì ìµë <n>ê° ë¡ê·¸ë¥¼ íìí©ëë¤" + +#: builtin/fmt-merge-msg.c:670 +msgid "alias for --log (deprecated)" +msgstr "--logì ëì¼ (ìì´ì§ ìì )" + +#: builtin/fmt-merge-msg.c:673 +msgid "text" +msgstr "í ì¤í¸" + +#: builtin/fmt-merge-msg.c:674 +msgid "use <text> as start of message" +msgstr "<í ì¤í¸>를 ìì ë©ìì§ë¡ ì¬ì©í©ëë¤" + +#: builtin/fmt-merge-msg.c:675 +msgid "file to read from" +msgstr "ì½ì´ë¤ì¼ íì¼" + +#: builtin/for-each-ref.c:9 +msgid "git for-each-ref [<options>] [<pattern>]" +msgstr "git for-each-ref [<ìµì >] [<í¨í´>]" + +#: builtin/for-each-ref.c:10 +msgid "git for-each-ref [--points-at <object>]" +msgstr "git for-each-ref [--points-at <ì¤ë¸ì í¸>]" + +#: builtin/for-each-ref.c:11 +msgid "git for-each-ref [(--merged | --no-merged) [<object>]]" +msgstr "git for-each-ref [(--merged | --no-merged) [<ì¤ë¸ì í¸>]]" + +#: builtin/for-each-ref.c:12 +msgid "git for-each-ref [--contains [<object>]]" +msgstr "git for-each-ref [--contains [<ì¤ë¸ì í¸>]]" + +#: builtin/for-each-ref.c:27 +msgid "quote placeholders suitably for shells" +msgstr "ì ¸ì ì í©íê² íë ì´ì¤íë를 ì¸ì©í©ëë¤" + +#: builtin/for-each-ref.c:29 +msgid "quote placeholders suitably for perl" +msgstr "íì ì í©íê² íë ì´ì¤íë를 ì¸ì©í©ëë¤" + +#: builtin/for-each-ref.c:31 +msgid "quote placeholders suitably for python" +msgstr "íì´ì¬ì ì í©íê² íë ì´ì¤íë를 ì¸ì©í©ëë¤" + +#: builtin/for-each-ref.c:33 +msgid "quote placeholders suitably for Tcl" +msgstr "í°í´ì ì í©íê² íë ì´ì¤íë를 ì¸ì©í©ëë¤" + +#: builtin/for-each-ref.c:36 +msgid "show only <n> matched refs" +msgstr "<n>ê°ì í´ë¹íë ë í¼ë°ì¤ë§ íìí©ëë¤" + +#: builtin/for-each-ref.c:37 builtin/tag.c:372 +msgid "format to use for the output" +msgstr "ì¶ë ¥ì ì¬ì©í íì" + +#: builtin/for-each-ref.c:41 +msgid "print only refs which points at the given object" +msgstr "주ì´ì§ ì¤ë¸ì í¸ë¥¼ ê°ë¦¬í¤ë ë í¼ë°ì¤ë§ íìí©ëë¤" + +#: builtin/for-each-ref.c:43 +msgid "print only refs that are merged" +msgstr "ë³í©íë ë í¼ë°ì¤ë§ íìí©ëë¤" + +#: builtin/for-each-ref.c:44 +msgid "print only refs that are not merged" +msgstr "ë³í©íì§ ìë ë í¼ë°ì¤ë§ íìí©ëë¤" + +#: builtin/for-each-ref.c:45 +msgid "print only refs which contain the commit" +msgstr "커ë°ì´ í¬í¨ë ë í¼ë°ì¤ë§ íìí©ëë¤" + +#: builtin/fsck.c:156 builtin/prune.c:140 +msgid "Checking connectivity" +msgstr "ì°ê²°ì íì¸íë ì¤ì ëë¤" + +#: builtin/fsck.c:486 +msgid "Checking object directories" +msgstr "ì¤ë¸ì í¸ ëë í°ë¦¬ë¥¼ íì¸íë ì¤ì ëë¤" + +#: builtin/fsck.c:553 +msgid "git fsck [<options>] [<object>...]" +msgstr "git fsck [<ìµì >] [<ì¤ë¸ì í¸>...]" + +#: builtin/fsck.c:559 +msgid "show unreachable objects" +msgstr "ì ê·¼í ì ìë ì¤ë¸ì í¸ë¥¼ íìí©ëë¤" + +#: builtin/fsck.c:560 +msgid "show dangling objects" +msgstr "ì°ê²°ì´ ëì´ì§ ì¤ë¸ì í¸ë¥¼ íìí©ëë¤" + +#: builtin/fsck.c:561 +msgid "report tags" +msgstr "í그를 ì립ëë¤" + +#: builtin/fsck.c:562 +msgid "report root nodes" +msgstr "ìµìì ë ¸ë를 ì립ëë¤" + +#: builtin/fsck.c:563 +msgid "make index objects head nodes" +msgstr "ì¸ë±ì¤ ì¤ë¸ì í¸ í¤ë ë ¸ë를 ë§ëëë¤" + +#: builtin/fsck.c:564 +msgid "make reflogs head nodes (default)" +msgstr "reflog í¤ë ë ¸ë를 ë§ëëë¤ (기본ê°)" + +#: builtin/fsck.c:565 +msgid "also consider packs and alternate objects" +msgstr "묶ìê³¼ ë³´ì¡° ì¤ë¸ì í¸ë ë§ëëë¤" + +#: builtin/fsck.c:566 +msgid "check only connectivity" +msgstr "ì°ê²°ë§ íì¸í©ëë¤" + +#: builtin/fsck.c:567 +msgid "enable more strict checking" +msgstr "ë ì격íê² íì¸í©ëë¤" + +#: builtin/fsck.c:569 +msgid "write dangling objects in .git/lost-found" +msgstr ".git/lost-found ìì ì°ê²°ì´ ëì´ì§ ì¤ë¸ì í¸ë¥¼ ìëë¤" + +#: builtin/fsck.c:570 builtin/prune.c:107 +msgid "show progress" +msgstr "ì§í ìí©ì íìí©ëë¤" + +#: builtin/fsck.c:631 +msgid "Checking objects" +msgstr "ì¤ë¸ì í¸ë¥¼ íì¸í©ëë¤" + +#: builtin/gc.c:25 +msgid "git gc [<options>]" +msgstr "git gc [<ìµì >]" + +#: builtin/gc.c:72 +#, c-format +msgid "Invalid %s: '%s'" +msgstr "ì못ë %s: '%s'" + +#: builtin/gc.c:139 +#, c-format +msgid "insanely long object directory %.*s" +msgstr "ë¹ì ìì ì¼ë¡ 긴 ì¤ë¸ì í¸ ëë í°ë¦¬ %.*s" + +#: builtin/gc.c:290 +#, c-format +msgid "" +"The last gc run reported the following. Please correct the root cause\n" +"and remove %s.\n" +"Automatic cleanup will not be performed until the file is removed.\n" +"\n" +"%s" +msgstr "" +"ë§ì§ë§ ê°ë¹ì§ì»¬ë í°ìì ë¤ìì ìë ¤ììµëë¤. ìì¸ì ë°ë¡ì¡ì\n" +"ë¤ì %s íì¼ì ì ê±°íììì¤.\n" +"ì´ íì¼ì ì ê±°í기 ì ìë ìë ì 리 ìì ì ìííì§ ììµëë¤.\n" +"\n" +"%s" + +#: builtin/gc.c:327 +msgid "prune unreferenced objects" +msgstr "ë í¼ë°ì¤íì§ ìë ì¤ë¸ì í¸ë¥¼ ìë¼ë ëë¤" + +#: builtin/gc.c:329 +msgid "be more thorough (increased runtime)" +msgstr "ë ìì¸í ê²ì¬í©ëë¤ (ì¤í ìê° ëì´ë¨)" + +#: builtin/gc.c:330 +msgid "enable auto-gc mode" +msgstr "ìë ê°ë¹ì§ì»¬ë í° ëª¨ë를 ì¬ì©í©ëë¤" + +#: builtin/gc.c:331 +msgid "force running gc even if there may be another gc running" +msgstr "ì´ë¯¸ ê°ë¹ì§ì»¬ë í°ê° ì¤í ì¤ì´ëë¼ë ê°ì ë¡ ê°ë¹ì§ì»¬ë í°ë¥¼ ì¤íí©ëë¤" + +#: builtin/gc.c:373 +#, c-format +msgid "Auto packing the repository in background for optimum performance.\n" +msgstr "ìµì ì±ë¥ì ìí´ ë°±ê·¸ë¼ì´ëìì ìëì¼ë¡ ì ì¥ìì 묶ìì ë§ëëë¤.\n" + +#: builtin/gc.c:375 +#, c-format +msgid "Auto packing the repository for optimum performance.\n" +msgstr "ìµì ì±ë¥ì ìí´ ìëì¼ë¡ ì ì¥ìì 묶ìì ë§ëëë¤.\n" + +#: builtin/gc.c:376 +#, c-format +msgid "See \"git help gc\" for manual housekeeping.\n" +msgstr "ìë ê´ë¦¬ ìì ì \"git help gc\" ë´ì©ì ì°¸ê³ íììì¤.\n" + +#: builtin/gc.c:397 +#, c-format +msgid "" +"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)" +msgstr "ê°ë¹ì§ì»¬ë í°ê° ì´ë¯¸ '%s' ì»´í¨í°ìì %<PRIuMAX> PIDë¡ ì¤í ì¤ì ëë¤ (ìëë©´ --force를 ì¬ì©íììì¤)" + +#: builtin/gc.c:441 +msgid "" +"There are too many unreachable loose objects; run 'git prune' to remove them." +msgstr "ëì¨í ì¤ë¸ì í¸ê° ë무 ë§ìµëë¤. ì ê±°íë ¤ë©´ 'git prune'ì ì¤ííììì¤." + +#: builtin/grep.c:23 +msgid "git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]" +msgstr "git grep [<ìµì >] [-e] <í¨í´> [<리ë¹ì >...] [[--] <ê²½ë¡>...]" + +#: builtin/grep.c:218 +#, c-format +msgid "grep: failed to create thread: %s" +msgstr "grep: ì¤ë ë를 ë§ëëë° ì¤í¨íìµëë¤: %s" + +#: builtin/grep.c:441 builtin/grep.c:476 +#, c-format +msgid "unable to read tree (%s)" +msgstr "í¸ë¦¬ë¥¼ ì½ì ì ììµëë¤ (%s)" + +#: builtin/grep.c:491 +#, c-format +msgid "unable to grep from object of type %s" +msgstr "ì¢ ë¥ê° %sì¸ ì¤ë¸ì í¸ìì grepì í ì ììµëë¤" + +#: builtin/grep.c:547 +#, c-format +msgid "switch `%c' expects a numerical value" +msgstr "`%c' ìµì ìë ì«ì ê°ì´ ìì¼ í©ëë¤" + +#: builtin/grep.c:564 +#, c-format +msgid "cannot open '%s'" +msgstr "'%s'ì(를) ì´ ì ììµëë¤" + +#: builtin/grep.c:633 +msgid "search in index instead of in the work tree" +msgstr "ìì í´ë ëì ì ì¸ë±ì¤ìì ê²ìí©ëë¤" + +#: builtin/grep.c:635 +msgid "find in contents not managed by git" +msgstr "ê¹ì¼ë¡ ê´ë¦¬íì§ ìì ë´ì©ìì ì°¾ìµëë¤" + +#: builtin/grep.c:637 +msgid "search in both tracked and untracked files" +msgstr "ì¶ì ëë íì¼ê³¼ ì¶ì ëì§ ìë íì¼ ëª¨ëìì ê²ìí©ëë¤" + +#: builtin/grep.c:639 +msgid "ignore files specified via '.gitignore'" +msgstr "'.gitignore'ë¡ ì§ì í íì¼ì 무ìí©ëë¤" + +#: builtin/grep.c:642 +msgid "show non-matching lines" +msgstr "ì¼ì¹íì§ ìë ì¤ì íìí©ëë¤" + +#: builtin/grep.c:644 +msgid "case insensitive matching" +msgstr "ëì문ì 구ë³íì§ ìê³ ë§ì¶¥ëë¤" + +#: builtin/grep.c:646 +msgid "match patterns only at word boundaries" +msgstr "ë¨ì´ ê²½ê³ ë¶ë¶ì ëí´ìë§ í¨í´ì ë§ì¶¥ëë¤" + +#: builtin/grep.c:648 +msgid "process binary files as text" +msgstr "ë°ì´ë리 íì¼ì í ì¤í¸ë¡ ì²ë¦¬í©ëë¤" + +#: builtin/grep.c:650 +msgid "don't match patterns in binary files" +msgstr "ë°ì´ë리 íì¼ìì í¨í´ì ë§ì¶ì§ ììµëë¤" + +#: builtin/grep.c:653 +msgid "process binary files with textconv filters" +msgstr "textconv íí°ë¥¼ ì¬ì©í´ ë°ì´ë리 íì¼ì ì²ë¦¬í©ëë¤" + +#: builtin/grep.c:655 +msgid "descend at most <depth> levels" +msgstr "ìµë <ê¹ì´> ë¨ê³ë§í¼ ë´ë ¤ê°ëë¤" + +#: builtin/grep.c:659 +msgid "use extended POSIX regular expressions" +msgstr "POSIX íì¥ ì ê·ìì ì¬ì©í©ëë¤" + +#: builtin/grep.c:662 +msgid "use basic POSIX regular expressions (default)" +msgstr "기본 POSIX ì ê·ìì ì¬ì©í©ëë¤ (기본ê°)" + +#: builtin/grep.c:665 +msgid "interpret patterns as fixed strings" +msgstr "í¨í´ì ê³ ì 문ìì´ë¡ í´ìí©ëë¤" + +#: builtin/grep.c:668 +msgid "use Perl-compatible regular expressions" +msgstr "íê³¼ í¸íëë ì ê·ìì ì¬ì©í©ëë¤" + +#: builtin/grep.c:671 +msgid "show line numbers" +msgstr "ì¤ ë²í¸ë¥¼ íìí©ëë¤" + +#: builtin/grep.c:672 +msgid "don't show filenames" +msgstr "íì¼ ì´ë¦ì íìíì§ ììµëë¤" + +#: builtin/grep.c:673 +msgid "show filenames" +msgstr "íì¼ ì´ë¦ì íìí©ëë¤" + +#: builtin/grep.c:675 +msgid "show filenames relative to top directory" +msgstr "íì¼ ì´ë¦ì ìµìì ëë í°ë¦¬ ìë ê²½ë¡ë¡ íìí©ëë¤" + +#: builtin/grep.c:677 +msgid "show only filenames instead of matching lines" +msgstr "ì¼ì¹íë ì¤ì íìíì§ ìê³ íì¼ ì´ë¦ë§ íìí©ëë¤" + +#: builtin/grep.c:679 +msgid "synonym for --files-with-matches" +msgstr "--files-with-matches ìµì ê³¼ ëì¼" + +#: builtin/grep.c:682 +msgid "show only the names of files without match" +msgstr "ì¼ì¹íì§ ìë íì¼ì ì´ë¦ë§ íìí©ëë¤" + +#: builtin/grep.c:684 +msgid "print NUL after filenames" +msgstr "íì¼ ì´ë¦ ë¤ìì NULì ì¶ë ¥í©ëë¤" + +#: builtin/grep.c:686 +msgid "show the number of matches instead of matching lines" +msgstr "ì¼ì¹íë ì¤ì íìíì§ ìê³ ì¼ì¹íë ì를 íìí©ëë¤" + +#: builtin/grep.c:687 +msgid "highlight matches" +msgstr "ì¼ì¹íë ë¶ë¶ì ê°ì¡°í©ëë¤" + +#: builtin/grep.c:689 +msgid "print empty line between matches from different files" +msgstr "ë¤ë¥¸ íì¼ ì¬ì´ì ì¼ì¹íë ë¶ë¶ì ì¬ì´ì ë¹ ì¤ì ì¶ë ¥í©ëë¤" + +#: builtin/grep.c:691 +msgid "show filename only once above matches from same file" +msgstr "ê°ì íì¼ìì ì¬ë¬ ê°ê° ì¼ì¹íë©´ íì¼ ì´ë¦ì í ë²ë§ íìí©ëë¤" + +#: builtin/grep.c:694 +msgid "show <n> context lines before and after matches" +msgstr "ì¼ì¹íë ë¶ë¶ ìë¤ì 컨í ì¤í¸ë¥¼ <n>ì¤ íìí©ëë¤" + +#: builtin/grep.c:697 +msgid "show <n> context lines before matches" +msgstr "ì¼ì¹íë ë¶ë¶ ìì 컨í ì¤í¸ë¥¼ <n>ì¤ íìí©ëë¤" + +#: builtin/grep.c:699 +msgid "show <n> context lines after matches" +msgstr "ì¼ì¹íë ë¶ë¶ ë¤ì 컨í ì¤í¸ë¥¼ <n>ì¤ íìí©ëë¤" + +#: builtin/grep.c:700 +msgid "shortcut for -C NUM" +msgstr "-C NUM ìµì ì ì¤ì" + +#: builtin/grep.c:703 +msgid "show a line with the function name before matches" +msgstr "ì¼ì¹ í목 ìì í¨ì ì´ë¦ ì¤ì íìí©ëë¤" + +#: builtin/grep.c:705 +msgid "show the surrounding function" +msgstr "ë¤ì´ ìë í¨ì를 íìí©ëë¤" + +#: builtin/grep.c:708 +msgid "read patterns from file" +msgstr "íì¼ìì í¨í´ì ì½ìµëë¤" + +#: builtin/grep.c:710 +msgid "match <pattern>" +msgstr "<í¨í´>ê³¼ ì¼ì¹" + +#: builtin/grep.c:712 +msgid "combine patterns specified with -e" +msgstr "-e ìµì ì¼ë¡ ì§ì í í¨í´ì ê²°í©í©ëë¤" + +#: builtin/grep.c:724 +msgid "indicate hit with exit status without output" +msgstr "ì¶ë ¥íì§ ìê³ ì¼ì¹íë í목ì exit() ìí ë²í¸ë¡ 리í´í©ëë¤" + +#: builtin/grep.c:726 +msgid "show only matches from files that match all patterns" +msgstr "모ë í¨í´ê³¼ ì¼ì¹íë íì¼ì ì¼ì¹íë ë¶ë¶ë§ íìí©ëë¤" + +#: builtin/grep.c:728 +msgid "show parse tree for grep expression" +msgstr "grep ííìì ëí íì± í¸ë¦¬ë¥¼ íìí©ëë¤" + +#: builtin/grep.c:732 +msgid "pager" +msgstr "íì´ì " + +#: builtin/grep.c:732 +msgid "show matching files in the pager" +msgstr "ì¼ì¹íë íì¼ì íì´ì íë¡ê·¸ë¨ìì íìí©ëë¤" + +#: builtin/grep.c:735 +msgid "allow calling of grep(1) (ignored by this build)" +msgstr "grep(1) ì¤íì íì©í©ëë¤ (ì´ ë¹ëììë 무ì)" + +#: builtin/grep.c:793 +msgid "no pattern given." +msgstr "í¨í´ì ì§ì íì§ ìììµëë¤." + +#: builtin/grep.c:851 +msgid "--open-files-in-pager only works on the worktree" +msgstr "--open-files-in-pager ìµì ì ìì í´ëììë§ ëìí©ëë¤" + +#: builtin/grep.c:877 +msgid "--cached or --untracked cannot be used with --no-index." +msgstr "--cached ëë --untracked ìµì ì --no-index ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤." + +#: builtin/grep.c:882 +msgid "--no-index or --untracked cannot be used with revs." +msgstr "--no-index ëë --untracked ìµì ì 리ë¹ì ê³¼ ê°ì´ ì¸ ì ììµëë¤." + +#: builtin/grep.c:885 +msgid "--[no-]exclude-standard cannot be used for tracked contents." +msgstr "--[no-]exclude-standard ìµì ì ì¶ì ëë ë´ì©ì ëí´ ì¸ ì ììµëë¤." + +#: builtin/grep.c:893 +msgid "both --cached and trees are given." +msgstr "--cached ìµì ê³¼ í¸ë¦¬ë¥¼ 모ë ì§ì íìµëë¤." + +#: builtin/hash-object.c:80 +msgid "" +"git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] " +"[--] <file>..." +msgstr "" +"git hash-object [-t <ì¢ ë¥>] [-w] [--path=<íì¼> | --no-filters] [--stdin] " +"[--] <íì¼>..." + +#: builtin/hash-object.c:81 +msgid "git hash-object --stdin-paths" +msgstr "git hash-object --stdin-paths" + +#: builtin/hash-object.c:92 +msgid "type" +msgstr "ì¢ ë¥" + +#: builtin/hash-object.c:92 +msgid "object type" +msgstr "ì¤ë¸ì í¸ ì¢ ë¥" + +#: builtin/hash-object.c:93 +msgid "write the object into the object database" +msgstr "ì¤ë¸ì í¸ë¥¼ ì¤ë¸ì í¸ ë°ì´í°ë² ì´ì¤ë¡ ìëë¤" + +#: builtin/hash-object.c:95 +msgid "read the object from stdin" +msgstr "íì¤ ì ë ¥ìì ì¤ë¸ì í¸ë¥¼ ì½ìµëë¤" + +#: builtin/hash-object.c:97 +msgid "store file as is without filters" +msgstr "íì¼ì íí° ìì´ ê·¸ëë¡ ì ì¥í©ëë¤" + +#: builtin/hash-object.c:98 +msgid "" +"just hash any random garbage to create corrupt objects for debugging Git" +msgstr "ììì ì°ë 기 ë°ì´í°ë¥¼ í´ìí´ ììë ì¤ë¸ì í¸ë¥¼ ë§ëëë¤ (ëë²ê¹ ì©)" + +#: builtin/hash-object.c:99 +msgid "process file as it were from this path" +msgstr "íì¼ì´ ì´ ê²½ë¡ìì ì¨ ê²ì²ë¼ ì²ë¦¬í©ëë¤" + +#: builtin/help.c:41 +msgid "print all available commands" +msgstr "ì¬ì© ê°ë¥í 모ë ëª ë ¹ì 목ë¡ì íìí©ëë¤" + +#: builtin/help.c:42 +msgid "print list of useful guides" +msgstr "ì ì©í ìë´ì 목ë¡ì íìí©ëë¤" + +#: builtin/help.c:43 +msgid "show man page" +msgstr "맨 íì´ì§ë¥¼ íìí©ëë¤" + +#: builtin/help.c:44 +msgid "show manual in web browser" +msgstr "ì¹ ë¸ë¼ì°ì ìì ì¤ëª ì를 íìí©ëë¤" + +#: builtin/help.c:46 +msgid "show info page" +msgstr "ì¸í¬ íì´ì§ë¥¼ íìí©ëë¤" + +#: builtin/help.c:52 +msgid "git help [--all] [--guides] [--man | --web | --info] [<command>]" +msgstr "git help [--all] [--guides] [--man | --web | --info] [<ëª ë ¹>]" + +#: builtin/help.c:64 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "'%s' ëìë§ í¬ë§·ì ì¸ìí ì ììµëë¤" + +#: builtin/help.c:91 +msgid "Failed to start emacsclient." +msgstr "emacsclient ììì ì¤í¨íìµëë¤." + +#: builtin/help.c:104 +msgid "Failed to parse emacsclient version." +msgstr "emacsclient ë²ì íì±ì ì¤í¨íìµëë¤." + +#: builtin/help.c:112 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "emacsclient '%d' ë²ì ì ë무 과거 (< 22) ë²ì ì ëë¤." + +#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "ì¤í ì¤í¨: '%s': %s" + +#: builtin/help.c:208 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"'%s': ì§ìíì§ ìë 맨 íì´ì§ 보기 íë¡ê·¸ë¨ ê²½ë¡.\n" +"ëì ì 'man.<ë구>.cmd' ìµì ì ì¬ì©í´ ë³´ììì¤." + +#: builtin/help.c:220 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" +"'%s': ì§ìíì§ ìë 맨 íì´ì§ 보기 íë¡ê·¸ë¨ ëª ë ¹.\n" +"ëì ì 'man.<ë구>.path' ìµì ì ì¬ì©í´ ë³´ììì¤." + +#: builtin/help.c:337 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "'%s': ì ì ìë 맨 íì´ì§ 보기 íë¡ê·¸ë¨." + +#: builtin/help.c:354 +msgid "no man viewer handled the request" +msgstr "ìì²ì ì²ë¦¬í 맨 íì´ì§ 보기 íë¡ê·¸ë¨ì´ ììµëë¤" + +#: builtin/help.c:362 +msgid "no info viewer handled the request" +msgstr "ìì²ì ì²ë¦¬í ì¸í¬ íì´ì§ 보기 íë¡ê·¸ë¨ì´ ììµëë¤" + +#: builtin/help.c:411 +msgid "Defining attributes per path" +msgstr "ê²½ë¡ë§ë¤ ìì± ì ìí기" + +#: builtin/help.c:412 +msgid "Everyday Git With 20 Commands Or So" +msgstr "매ì¼ë§¤ì¼ ì¬ì©íë 20ê° ë´ì¸ì ê¹ ëª ë ¹" + +#: builtin/help.c:413 +msgid "A Git glossary" +msgstr "ê¹ ì©ì´ ì¬ì " + +#: builtin/help.c:414 +msgid "Specifies intentionally untracked files to ignore" +msgstr "ìëì ì¼ë¡ ì¶ì íì§ ìë íì¼ì 무ìíê² ì§ì í기" + +#: builtin/help.c:415 +msgid "Defining submodule properties" +msgstr "íì 모ë ìì± ì ìí기" + +#: builtin/help.c:416 +msgid "Specifying revisions and ranges for Git" +msgstr "ê¹ì 리ë¹ì ë° ë²ì를 ì§ì í기" + +#: builtin/help.c:417 +msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" +msgstr "ê¹ ë°ë¼í기 ìë´ì (ë²ì 1.5.1 ì´í)" + +#: builtin/help.c:418 +msgid "An overview of recommended workflows with Git" +msgstr "ì¶ì²íë ê¹ íì© ìì ììì ê°ì" + +#: builtin/help.c:430 +msgid "The common Git guides are:\n" +msgstr "ì주 ì¬ì©íë ê¹ ìë´ìë ë¤ìê³¼ ê°ìµëë¤:\n" + +#: builtin/help.c:451 builtin/help.c:468 +#, c-format +msgid "usage: %s%s" +msgstr "ì¬ì©ë²: %s%s" + +#: builtin/help.c:484 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "`git %s' ëª ë ¹ì `%s' ëª ë ¹ì ë¨ì¶ì ëë¤" + +#: builtin/index-pack.c:152 +#, c-format +msgid "unable to open %s" +msgstr "%sì(를) ì´ ì ììµëë¤" + +#: builtin/index-pack.c:202 +#, c-format +msgid "object type mismatch at %s" +msgstr "ì¤ë¸ì í¸ ì¢ ë¥ê° ë§ì§ ììµëë¤ (%s)" + +#: builtin/index-pack.c:222 +#, c-format +msgid "did not receive expected object %s" +msgstr "ììí %s ì¤ë¸ì í¸ë¥¼ ë°ì§ ìììµëë¤" + +#: builtin/index-pack.c:225 +#, c-format +msgid "object %s: expected type %s, found %s" +msgstr "%s ì¤ë¸ì í¸: ììí ì¢ ë¥ %s, ì¤ì %s" + +#: builtin/index-pack.c:267 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "%d ë°ì´í¸ë¥¼ ì±ì¸ ì ììµëë¤" + +#: builtin/index-pack.c:277 +msgid "early EOF" +msgstr "ë무 빨리 íì¼ì´ ëë¨" + +#: builtin/index-pack.c:278 +msgid "read error on input" +msgstr "ì ë ¥ì ì½ê¸° ì¤ë¥" + +#: builtin/index-pack.c:290 +msgid "used more bytes than were available" +msgstr "ìë ë°ì´í¸ë³´ë¤ ë ë§ì´ ì¬ì©í©ëë¤" + +#: builtin/index-pack.c:297 +msgid "pack too large for current definition of off_t" +msgstr "íì¬ ì ìë off_tì ë¹í´ 묶ìì´ ë무 í½ëë¤" + +#: builtin/index-pack.c:313 +#, c-format +msgid "unable to create '%s'" +msgstr "'%s'ì(를) ë§ë¤ ì ììµëë¤" + +#: builtin/index-pack.c:318 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "'%s' 묶ì íì¼ì ì´ ì ììµëë¤" + +#: builtin/index-pack.c:332 +msgid "pack signature mismatch" +msgstr "묶ì ìëª ì´ ë§ì§ ììµëë¤" + +#: builtin/index-pack.c:334 +#, c-format +msgid "pack version %<PRIu32> unsupported" +msgstr "묶ìì %<PRIu32> ë²ì ì ì§ìíì§ ììµëë¤" + +#: builtin/index-pack.c:352 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "묶ìì %lu ì¤íì ì ì못ë ì¤ë¸ì í¸ê° ììµëë¤: %s" + +#: builtin/index-pack.c:473 +#, c-format +msgid "inflate returned %d" +msgstr "inflateê° %dë²ì 리í´íìµëë¤" + +#: builtin/index-pack.c:522 +msgid "offset value overflow for delta base object" +msgstr "ë¸í ë² ì´ì¤ ì¤ë¸ì í¸ì ëí´ ì¤íì ê°ì´ ì¤ë²íë¡ì°" + +#: builtin/index-pack.c:530 +msgid "delta base offset is out of bound" +msgstr "ë¸í ë² ì´ì¤ ì¤íì ì´ ë²ì를 ë²ì´ë¬ìµëë¤" + +#: builtin/index-pack.c:538 +#, c-format +msgid "unknown object type %d" +msgstr "ì ì ìë ì¤ë¸ì í¸ ì¢ ë¥ %dë²" + +#: builtin/index-pack.c:569 +msgid "cannot pread pack file" +msgstr "묶ì íì¼ì ëí´ pread를 í ì ììµëë¤" + +#: builtin/index-pack.c:571 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "묶ì íì¼ì´ ë무 ì¼ì° ëë¨. %lu ë°ì´í¸ ë¶ì¡±" + +#: builtin/index-pack.c:597 +msgid "serious inflate inconsistency" +msgstr "ì¬ê°í inflate ë¶ì¡°í" + +#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772 +#: builtin/index-pack.c:806 builtin/index-pack.c:815 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "SHA1 충ëì´ %sìì ë°ê²¬ëììµëë¤!" + +#: builtin/index-pack.c:746 builtin/pack-objects.c:162 +#: builtin/pack-objects.c:254 +#, c-format +msgid "unable to read %s" +msgstr "%sì(를) ì½ì ì ììµëë¤" + +#: builtin/index-pack.c:812 +#, c-format +msgid "cannot read existing object %s" +msgstr "기존 %s ì¤ë¸ì í¸ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/index-pack.c:826 +#, c-format +msgid "invalid blob object %s" +msgstr "ì못ë ë¸ë¡ ì¤ë¸ì í¸ %s" + +#: builtin/index-pack.c:840 +#, c-format +msgid "invalid %s" +msgstr "ì못ë %s" + +#: builtin/index-pack.c:843 +msgid "Error in object" +msgstr "ì¤ë¸ì í¸ì ì¤ë¥" + +#: builtin/index-pack.c:845 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "%sì 모ë íì ì¤ë¸ì í¸ì ì ê·¼í ì ììµëë¤" + +#: builtin/index-pack.c:917 builtin/index-pack.c:948 +msgid "failed to apply delta" +msgstr "ë¸í를 ì ì©íëë° ì¤í¨íìµëë¤" + +#: builtin/index-pack.c:1118 +msgid "Receiving objects" +msgstr "ì¤ë¸ì í¸ë¥¼ ë°ë ì¤" + +#: builtin/index-pack.c:1118 +msgid "Indexing objects" +msgstr "ì¤ë¸ì í¸ ì¸ë±ì¤ë¥¼ ë§ëë ì¤" + +#: builtin/index-pack.c:1150 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "묶ìì´ ììëììµëë¤ (SHA1 ì¼ì¹íì§ ìì)" + +#: builtin/index-pack.c:1155 +msgid "cannot fstat packfile" +msgstr "묶ì íì¼ì ëí´ fstat()í ì ììµëë¤" + +#: builtin/index-pack.c:1158 +msgid "pack has junk at the end" +msgstr "묶ìì ëì ì°ë 기 ë°ì´í°ê° ììµëë¤" + +#: builtin/index-pack.c:1169 +msgid "confusion beyond insanity in parse_pack_objects()" +msgstr "parse_pack_objects()ìì ê·¹ì¬í í¼ë" + +#: builtin/index-pack.c:1194 +msgid "Resolving deltas" +msgstr "ë¸í를 ììë´ë ì¤" + +#: builtin/index-pack.c:1205 +#, c-format +msgid "unable to create thread: %s" +msgstr "ì¤ë ë를 ë§ë¤ ì ììµëë¤: %s" + +#: builtin/index-pack.c:1247 +msgid "confusion beyond insanity" +msgstr "ê·¹ì¬í í¼ë" + +#: builtin/index-pack.c:1253 +#, c-format +msgid "completed with %d local objects" +msgstr "ë¡ì»¬ ì¤ë¸ì í¸ %dê° ë§ì¹¨" + +#: builtin/index-pack.c:1263 +#, c-format +msgid "Unexpected tail checksum for %s (disk corruption?)" +msgstr "%sì ëí´ ììì¹ ëª»í í ì¼ ì²´í¬ì¬ (ëì¤í¬ ìì?)" + +#: builtin/index-pack.c:1267 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "묶ìì ììë´ì§ 못í ë¸í %dê°ê° ììµëë¤" + +#: builtin/index-pack.c:1291 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "ì¶ê°í ì¤ë¸ì í¸ë¥¼ deflateí ì ììµëë¤ (%d)" + +#: builtin/index-pack.c:1367 +#, c-format +msgid "local object %s is corrupt" +msgstr "%s ë¡ì»¬ ì¤ë¸ì í¸ê° ììëììµëë¤" + +#: builtin/index-pack.c:1391 +msgid "error while closing pack file" +msgstr "묶ì íì¼ì ë«ëë° ì¤ë¥" + +#: builtin/index-pack.c:1404 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "'%s' ë³´ì¡´ íì¼ì ì¸ ì ììµëë¤" + +#: builtin/index-pack.c:1412 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "ì´ '%s' ë³´ì¡´ íì¼ì ë«ì§ 못íìµëë¤" + +#: builtin/index-pack.c:1425 +msgid "cannot store pack file" +msgstr "묶ì íì¼ì ì ì¥í ì ììµëë¤" + +#: builtin/index-pack.c:1436 +msgid "cannot store index file" +msgstr "ì¸ë±ì¤ íì¼ì ì ì¥í ì ììµëë¤" + +#: builtin/index-pack.c:1469 +#, c-format +msgid "bad pack.indexversion=%<PRIu32>" +msgstr "ì못ë pack.indexversion=%<PRIu32>" + +#: builtin/index-pack.c:1475 +#, c-format +msgid "invalid number of threads specified (%d)" +msgstr "ì못ë ì¤ë ë ì를 ì§ì íìµëë¤ (%d)" + +#: builtin/index-pack.c:1479 builtin/index-pack.c:1663 +#, c-format +msgid "no threads support, ignoring %s" +msgstr "ì¤ë ë 기ë¥ì´ ììµëë¤. %s 무ì" + +#: builtin/index-pack.c:1537 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "기존 '%s' 묶ì íì¼ì ì´ ì ììµëë¤" + +#: builtin/index-pack.c:1539 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "'%s'ì ëí 기존 묶ì idx íì¼ì ì´ ì ììµëë¤" + +#: builtin/index-pack.c:1586 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "ë¸í ìë: ì¤ë¸ì í¸ %dê°" + +#: builtin/index-pack.c:1593 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "ì²´ì¸ ê¸¸ì´ = %d: ì¤ë¸ì í¸ %luê°" + +#: builtin/index-pack.c:1623 +msgid "Cannot come back to cwd" +msgstr "íì¬ ëë í°ë¦¬ë¡ ëìì¬ ì ììµëë¤" + +#: builtin/index-pack.c:1675 builtin/index-pack.c:1678 +#: builtin/index-pack.c:1690 builtin/index-pack.c:1694 +#, c-format +msgid "bad %s" +msgstr "ì못ë %s" + +#: builtin/index-pack.c:1708 +msgid "--fix-thin cannot be used without --stdin" +msgstr "--fix-thin ìµì ì --stdin ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/index-pack.c:1712 builtin/index-pack.c:1721 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "'%s' 묶ìíì¼ ì´ë¦ì´ '.pack'ì¼ë¡ ëëì§ ììµëë¤" + +#: builtin/index-pack.c:1729 +msgid "--verify with no packfile name given" +msgstr "--verify ìµì ì 묶ìíì¼ ì´ë¦ì ì§ì íì§ ìììµëë¤" + +#: builtin/init-db.c:55 +#, c-format +msgid "cannot stat '%s'" +msgstr "'%s'ì(를) stat()í ì ììµëë¤" + +#: builtin/init-db.c:61 +#, c-format +msgid "cannot stat template '%s'" +msgstr "'%s' ììì stat()í ì ììµëë¤" + +#: builtin/init-db.c:66 +#, c-format +msgid "cannot opendir '%s'" +msgstr "'%s'ì(를) opendir()í ì ììµëë¤" + +#: builtin/init-db.c:77 +#, c-format +msgid "cannot readlink '%s'" +msgstr "'%s'ì(를) readlink()í ì ììµëë¤" + +#: builtin/init-db.c:79 +#, c-format +msgid "cannot symlink '%s' '%s'" +msgstr "'%s'ì(를) '%s'ì symlink()í ì ììµëë¤" + +#: builtin/init-db.c:85 +#, c-format +msgid "cannot copy '%s' to '%s'" +msgstr "'%s'ì(를) '%s'ì ë³µì¬í ì ììµëë¤" + +#: builtin/init-db.c:89 +#, c-format +msgid "ignoring template %s" +msgstr "%s ììì 무ìí©ëë¤" + +#: builtin/init-db.c:118 +#, c-format +msgid "templates not found %s" +msgstr "%sì ììì´ ììµëë¤" + +#: builtin/init-db.c:131 +#, c-format +msgid "not copying templates of a wrong format version %d from '%s'" +msgstr "'%2$s'ìì ì못ë íì ë²ì %1$dì ììì ë³µì¬íì§ ììµëë¤" + +#: builtin/init-db.c:309 builtin/init-db.c:312 +#, c-format +msgid "%s already exists" +msgstr "%s íì¼ì´ ì´ë¯¸ ììµëë¤" + +#: builtin/init-db.c:340 +#, c-format +msgid "unable to handle file type %d" +msgstr "íì¼ ì¢ ë¥ %dë²ì ì²ë¦¬í ì ììµëë¤" + +#: builtin/init-db.c:343 +#, c-format +msgid "unable to move %s to %s" +msgstr "%sì(를) %s(ì¼)ë¡ ì®ê¸¸ ì ììµëë¤" + +#. TRANSLATORS: The first '%s' is either "Reinitialized +#. existing" or "Initialized empty", the second " shared" or +#. "", and the last '%s%s' is the verbatim directory name. +#: builtin/init-db.c:399 +#, c-format +msgid "%s%s Git repository in %s%s\n" +msgstr "%s%s ê¹ ì ì¥ì, ìì¹ %s%s\n" + +#: builtin/init-db.c:400 +msgid "Reinitialized existing" +msgstr "ë¤ì ì´ê¸°í: 기존" + +#: builtin/init-db.c:400 +msgid "Initialized empty" +msgstr "ì´ê¸°í: ë¹" + +#: builtin/init-db.c:401 +msgid " shared" +msgstr " ê³µì " + +#: builtin/init-db.c:448 +msgid "" +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--" +"shared[=<permissions>]] [<directory>]" +msgstr "" +"git init [-q | --quiet] [--bare] [--template=<ìì-ëë í°ë¦¬>] [--shared[=<ê¶" +"í>]] [<ëë í°ë¦¬>]" + +#: builtin/init-db.c:471 +msgid "permissions" +msgstr "ê¶í" + +#: builtin/init-db.c:472 +msgid "specify that the git repository is to be shared amongst several users" +msgstr "ê¹ ì ì¥ì를 ë¤ë¥¸ ì¬ì©ìê° ê³µì í ì ìê² ì§ì " + +#: builtin/init-db.c:506 builtin/init-db.c:511 +#, c-format +msgid "cannot mkdir %s" +msgstr "%sì ëí´ mkdir를 í ì ììµëë¤" + +#: builtin/init-db.c:515 +#, c-format +msgid "cannot chdir to %s" +msgstr "%sì ëí´ chdir를 í ì ììµëë¤" + +#: builtin/init-db.c:536 +#, c-format +msgid "" +"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" +"dir=<directory>)" +msgstr "" +"%s (ëë --work-tree=<ëë í°ë¦¬>) íì©ëì§ ìì. %s (ëë --git-" +"dir=<directory>) ì§ì ì´ ìì¼ë©´" + +#: builtin/init-db.c:564 +#, c-format +msgid "Cannot access work tree '%s'" +msgstr "ìì í´ë '%s'ì ì ê·¼í ì ììµëë¤" + +#: builtin/interpret-trailers.c:15 +msgid "" +"git interpret-trailers [--trim-empty] [(--trailer <token>[(=|:)<value>])...] " +"[<file>...]" +msgstr "" +"git interpret-trailers [--trim-empty] [(--trailer <í í°>[(=|:)<ê°>])...] [<í" +"ì¼>...]" + +#: builtin/interpret-trailers.c:25 +msgid "trim empty trailers" +msgstr "ë¹ í¸ë ì¼ë¬ë¥¼ ìë¼ë ëë¤" + +#: builtin/interpret-trailers.c:26 +msgid "trailer" +msgstr "í¸ë ì¼ë¬" + +#: builtin/interpret-trailers.c:27 +msgid "trailer(s) to add" +msgstr "ì¶ê°í í¸ë ì¼ë¬" + +#: builtin/log.c:43 +msgid "git log [<options>] [<revision-range>] [[--] <path>...]" +msgstr "git log [<ìµì >] [<리ë¹ì -ë²ì>] [[--] <ê²½ë¡>...]" + +#: builtin/log.c:44 +msgid "git show [<options>] <object>..." +msgstr "git show [<ìµì >] <ì¤ë¸ì í¸>..." + +#: builtin/log.c:83 +#, c-format +msgid "invalid --decorate option: %s" +msgstr "ì못ë --decorate ìµì : %s" + +#: builtin/log.c:131 +msgid "suppress diff output" +msgstr "diff를 ì¶ë ¥íì§ ììµëë¤" + +#: builtin/log.c:132 +msgid "show source" +msgstr "ìì¤ë¥¼ íìí©ëë¤" + +#: builtin/log.c:133 +msgid "Use mail map file" +msgstr "ë©ì¼ 맵 íì¼ì ì¬ì©í©ëë¤" + +#: builtin/log.c:134 +msgid "decorate options" +msgstr "꾸미기 ìµì " + +#: builtin/log.c:137 +msgid "Process line range n,m in file, counting from 1" +msgstr "íì¼ìì n,m ë²ìì ì¤ì ì²ë¦¬í©ëë¤ (1ë¶í° ìì)" + +#: builtin/log.c:233 +#, c-format +msgid "Final output: %d %s\n" +msgstr "ìµì¢ ì¶ë ¥: %d %s\n" + +#: builtin/log.c:465 +#, c-format +msgid "git show %s: bad file" +msgstr "git show %s: ì못ë íì¼" + +#: builtin/log.c:479 builtin/log.c:572 +#, c-format +msgid "Could not read object %s" +msgstr "%s ì¤ë¸ì í¸ë¥¼ ì½ì ì ììµëë¤" + +#: builtin/log.c:596 +#, c-format +msgid "Unknown type: %d" +msgstr "ì ì ìë ì¢ ë¥: %d" + +#: builtin/log.c:714 +msgid "format.headers without value" +msgstr "format.headers ì¤ì ì ê°ì´ ìì" + +#: builtin/log.c:798 +msgid "name of output directory is too long" +msgstr "ì¶ë ¥ ëë í°ë¦¬ì ì´ë¦ì´ ë무 ê¹ëë¤" + +#: builtin/log.c:813 +#, c-format +msgid "Cannot open patch file %s" +msgstr "%s í¨ì¹ íì¼ì ì´ ì ììµëë¤" + +#: builtin/log.c:827 +msgid "Need exactly one range." +msgstr "ì íí íëì ë²ìê° íìí©ëë¤." + +#: builtin/log.c:837 +msgid "Not a range." +msgstr "ë²ìê° ìëëë¤." + +#: builtin/log.c:943 +msgid "Cover letter needs email format" +msgstr "커ë²ë í°ë ì ìë©ì¼ íìì´ì´ì¼ í©ëë¤" + +#: builtin/log.c:1022 +#, c-format +msgid "insane in-reply-to: %s" +msgstr "ì ì ëê° in-reply-to í¤ë: %s" + +#: builtin/log.c:1050 +msgid "git format-patch [<options>] [<since> | <revision-range>]" +msgstr "git format-patch [<ìµì >] [<ìììê°> | <리ë¹ì -ë²ì>]" + +#: builtin/log.c:1095 +msgid "Two output directories?" +msgstr "ì¶ë ¥ ëë í°ë¦¬ê° ëê°?" + +#: builtin/log.c:1211 +msgid "use [PATCH n/m] even with a single patch" +msgstr "íëì í¨ì¹ì ëí´ìë [PATCh n/m]ì ë¶ì ëë¤" + +#: builtin/log.c:1214 +msgid "use [PATCH] even with multiple patches" +msgstr "ì¬ë¬ ê° í¨ì¹ì ëí´ìë [PATCH]를 ë¶ì ëë¤" + +#: builtin/log.c:1218 +msgid "print patches to standard out" +msgstr "í¨ì¹ë¥¼ íì¤ ì¶ë ¥ì¼ë¡ íìí©ëë¤" + +#: builtin/log.c:1220 +msgid "generate a cover letter" +msgstr "커ë²ë í°ë¥¼ ë§ëëë¤" + +#: builtin/log.c:1222 +msgid "use simple number sequence for output file names" +msgstr "ì¶ë ¥ íì¼ ì´ë¦ì ê°ë¨í ì¼ë ¨ ë²í¸ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/log.c:1223 +msgid "sfx" +msgstr "íì¥ì" + +#: builtin/log.c:1224 +msgid "use <sfx> instead of '.patch'" +msgstr "'.patch' ëì <íì¥ì>를 ì¬ì©í©ëë¤" + +#: builtin/log.c:1226 +msgid "start numbering patches at <n> instead of 1" +msgstr "í¨ì¹ ë²í¸ë¥¼ 1 ëì <n>ìì ììí©ëë¤" + +#: builtin/log.c:1228 +msgid "mark the series as Nth re-roll" +msgstr "ì리ì¦ë¥¼ Në²ì§¸ re-rollë¡ íìí©ëë¤" + +#: builtin/log.c:1230 +msgid "Use [<prefix>] instead of [PATCH]" +msgstr "[PATCH] ëì [<ì ëì´>]를 ì¬ì©í©ëë¤" + +#: builtin/log.c:1233 +msgid "store resulting files in <dir>" +msgstr "ê²°ê³¼ íì¼ì <ëë í°ë¦¬>ì ì ì¥í©ëë¤" + +#: builtin/log.c:1236 +msgid "don't strip/add [PATCH]" +msgstr "[PATCH]를 ì르거ë ì¶ê°íì§ ììµëë¤" + +#: builtin/log.c:1239 +msgid "don't output binary diffs" +msgstr "ë°ì´ë리 diff를 ë§ë¤ì§ ììµëë¤" + +#: builtin/log.c:1241 +msgid "output all-zero hash in From header" +msgstr "From í¤ëìì 모ë 0ì¸ í´ì를 ì¶ë ¥í©ëë¤" + +#: builtin/log.c:1243 +msgid "don't include a patch matching a commit upstream" +msgstr "ì ì¤í¸ë¦¼ì ìë í¨ì¹ë¥¼ í¬í¨íì§ ììµëë¤" + +#: builtin/log.c:1245 +msgid "show patch format instead of default (patch + stat)" +msgstr "ê¸°ë³¸ê° (í¨ì¹ + íµê³) ëì í¨ì¹ íìì íìí©ëë¤" + +#: builtin/log.c:1247 +msgid "Messaging" +msgstr "ë©ìì§" + +#: builtin/log.c:1248 +msgid "header" +msgstr "í¤ë" + +#: builtin/log.c:1249 +msgid "add email header" +msgstr "ì ìë©ì¼ í¤ë" + +#: builtin/log.c:1250 builtin/log.c:1252 +msgid "email" +msgstr "ì ìë©ì¼" + +#: builtin/log.c:1250 +msgid "add To: header" +msgstr "To: í¤ë를 ì¶ê°í©ëë¤" + +#: builtin/log.c:1252 +msgid "add Cc: header" +msgstr "Cc: í¤ë를 ì¶ê°í©ëë¤" + +#: builtin/log.c:1254 +msgid "ident" +msgstr "ì ì" + +#: builtin/log.c:1255 +msgid "set From address to <ident> (or committer ident if absent)" +msgstr "<ì ì>ìì From 주ì를 ì¤ì í©ëë¤ (ìì¼ë©´ ì»¤ë¯¸í° ì£¼ì ì ì ì¬ì©)" + +#: builtin/log.c:1257 +msgid "message-id" +msgstr "ë©ìì§-ID" + +#: builtin/log.c:1258 +msgid "make first mail a reply to <message-id>" +msgstr "첫 ë©ì¼ì <ë©ìì§-ID>ì ëí ëµì¥ ë©ì¼ë¡ ë§ëëë¤" + +#: builtin/log.c:1259 builtin/log.c:1262 +msgid "boundary" +msgstr "ê²½ê³" + +#: builtin/log.c:1260 +msgid "attach the patch" +msgstr "í¨ì¹ë¥¼ 첨ë¶í©ëë¤" + +#: builtin/log.c:1263 +msgid "inline the patch" +msgstr "í¨ì¹ë¥¼ 본문ì í¬í¨í©ëë¤" + +#: builtin/log.c:1267 +msgid "enable message threading, styles: shallow, deep" +msgstr "ë©ìì§ì ì¤ë ë를 ì¬ì©, ì¤íì¼: shallow, deep" + +#: builtin/log.c:1269 +msgid "signature" +msgstr "ìëª " + +#: builtin/log.c:1270 +msgid "add a signature" +msgstr "ìëª ì ì¶ê°í©ëë¤" + +#: builtin/log.c:1272 +msgid "add a signature from a file" +msgstr "íì¼ìì ìëª ì ì¶ê°í©ëë¤" + +#: builtin/log.c:1273 +msgid "don't print the patch filenames" +msgstr "í¨ì¹ íì¼ ì´ë¦ì íìíì§ ììµëë¤" + +#: builtin/log.c:1362 +msgid "-n and -k are mutually exclusive." +msgstr "-n ë° -k ìµì ì íëë§ ì¨ì¼ í©ëë¤." + +#: builtin/log.c:1364 +msgid "--subject-prefix and -k are mutually exclusive." +msgstr "--subject-prefix ë° -k ìµì ì íëë§ ì¨ì¼ í©ëë¤." + +#: builtin/log.c:1372 +msgid "--name-only does not make sense" +msgstr "--name-only ìµì ì ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/log.c:1374 +msgid "--name-status does not make sense" +msgstr "--name-status ìµì ì ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/log.c:1376 +msgid "--check does not make sense" +msgstr "--check ìµì ì ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/log.c:1401 +msgid "standard output, or directory, which one?" +msgstr "íì¤ ì¶ë ¥ì´ë ëë í°ë¦¬ ì¤ì íëë§ ì§ì í´ì¼ í©ëë¤." + +#: builtin/log.c:1403 +#, c-format +msgid "Could not create directory '%s'" +msgstr "'%s' ëë í°ë¦¬ë¥¼ ë§ë¤ ì ììµëë¤" + +#: builtin/log.c:1500 +#, c-format +msgid "unable to read signature file '%s'" +msgstr "'%s' ìëª íì¼ì ì½ì ì ììµëë¤" + +#: builtin/log.c:1563 +msgid "Failed to create output files" +msgstr "ì¶ë ¥ íì¼ì ë§ëëë° ì¤í¨íìµëë¤" + +#: builtin/log.c:1611 +msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]" +msgstr "git cherry [-v] [<ì ì¤í¸ë¦¼> [<í¤ë> [<íê³ê°>]]]" + +#: builtin/log.c:1665 +#, c-format +msgid "" +"Could not find a tracked remote branch, please specify <upstream> manually.\n" +msgstr "ì¶ì ëë ë¦¬ëª¨í¸ ë¸ëì¹ë¥¼ ì°¾ì ì ììµëë¤. <ì ì¤í¸ë¦¼>ì ìëì¼ë¡ ì§ì íììì¤.\n" + +#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690 +#, c-format +msgid "Unknown commit %s" +msgstr "ì ì ìë ì»¤ë° %s" + +#: builtin/ls-files.c:358 +msgid "git ls-files [<options>] [<file>...]" +msgstr "git ls-files [<ìµì >] [<íì¼>...]" + +#: builtin/ls-files.c:415 +msgid "identify the file status with tags" +msgstr "íì¼ ìí를 íê·¸ì ê°ì´ íìí©ëë¤" + +#: builtin/ls-files.c:417 +msgid "use lowercase letters for 'assume unchanged' files" +msgstr "'ë³ê²½ëì§ ììë¤ê³ ê°ì ' íì¼ì ì문ì를 ì¬ì©í©ëë¤" + +#: builtin/ls-files.c:419 +msgid "show cached files in the output (default)" +msgstr "ì¶ë ¥ì ìºìë íì¼ì íìí©ëë¤ (기본ê°)" + +#: builtin/ls-files.c:421 +msgid "show deleted files in the output" +msgstr "ì¶ë ¥ì ìì ë íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:423 +msgid "show modified files in the output" +msgstr "ì¶ë ¥ì ìì ë íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:425 +msgid "show other files in the output" +msgstr "ì¶ë ¥ì 기í íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:427 +msgid "show ignored files in the output" +msgstr "ì¶ë ¥ì 무ìë íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:430 +msgid "show staged contents' object name in the output" +msgstr "ì¶ë ¥ì ì»¤ë° íìë ë´ì©ì ì¤ë¸ì í¸ ì´ë¦ì íìí©ëë¤" + +#: builtin/ls-files.c:432 +msgid "show files on the filesystem that need to be removed" +msgstr "íì¼ ìì¤í ìì ì ê±°í´ì¼ íë íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:434 +msgid "show 'other' directories' names only" +msgstr "기í ëë í°ë¦¬ì ì´ë¦ë§ íìí©ëë¤" + +#: builtin/ls-files.c:437 +msgid "don't show empty directories" +msgstr "ë¹ ëë í°ë¦¬ íìíì§ ì기" + +#: builtin/ls-files.c:440 +msgid "show unmerged files in the output" +msgstr "ì¶ë ¥ì ë³í©íì§ ìì íì¼ì íìí©ëë¤" + +#: builtin/ls-files.c:442 +msgid "show resolve-undo information" +msgstr "resolve-undo ì 보를 íìí©ëë¤" + +#: builtin/ls-files.c:444 +msgid "skip files matching pattern" +msgstr "í¨í´ì ì¼ì¹íë íì¼ì ê±´ëëëë¤" + +#: builtin/ls-files.c:447 +msgid "exclude patterns are read from <file>" +msgstr "ì ì¸í í¨í´ì <íì¼>ìì ì½ìµëë¤" + +#: builtin/ls-files.c:450 +msgid "read additional per-directory exclude patterns in <file>" +msgstr "<íì¼>ìì ì¶ê°ì ì¸ ëë í ë¦¬ë³ ì ì¸ í¨í´ì ì½ìµëë¤" + +#: builtin/ls-files.c:452 +msgid "add the standard git exclusions" +msgstr "íì¤ ê¹ ì ì¸ í¨í´ì ì¶ê°í©ëë¤" + +#: builtin/ls-files.c:455 +msgid "make the output relative to the project top directory" +msgstr "ìµìì ëë í 리 ìë ê²½ë¡ë¡ ì¶ë ¥í©ëë¤" + +#: builtin/ls-files.c:458 +msgid "if any <file> is not in the index, treat this as an error" +msgstr "<íì¼>ì´ ì¸ë±ì¤ ìì ìì¼ë©´ ì¤ë¥ë¡ ì·¨ê¸í©ëë¤" + +#: builtin/ls-files.c:459 +msgid "tree-ish" +msgstr "í¸ë¦¬-ë°ì" + +#: builtin/ls-files.c:460 +msgid "pretend that paths removed since <tree-ish> are still present" +msgstr "<í¸ë¦¬-ë°ì> ë¤ë¡ ì ê±°í ê²½ë¡ê° ìë¤ê³ ê°ì í©ëë¤" + +#: builtin/ls-files.c:462 +msgid "show debugging data" +msgstr "ëë²ê¹ ë°ì´í°ë¥¼ íìí©ëë¤" + +#: builtin/ls-tree.c:28 +msgid "git ls-tree [<options>] <tree-ish> [<path>...]" +msgstr "git ls-tree [<ìµì >] <í¸ë¦¬-ë°ì> [<ê²½ë¡>...]" + +#: builtin/ls-tree.c:128 +msgid "only show trees" +msgstr "í¸ë¦¬ë§ íì" + +#: builtin/ls-tree.c:130 +msgid "recurse into subtrees" +msgstr "íì í¸ë¦¬ë¡ ì¬ê·ì ì¼ë¡ ì ì©" + +#: builtin/ls-tree.c:132 +msgid "show trees when recursing" +msgstr "ì¬ê·ì ì¼ë¡ ì ì©í ë í¸ë¦¬ íì" + +#: builtin/ls-tree.c:135 +msgid "terminate entries with NUL byte" +msgstr "í목ì NUL ë°ì´í¸ë¡ ëë ëë¤" + +#: builtin/ls-tree.c:136 +msgid "include object size" +msgstr "ì¤ë¸ì í¸ í¬ê¸° í¬í¨" + +#: builtin/ls-tree.c:138 builtin/ls-tree.c:140 +msgid "list only filenames" +msgstr "íì¼ ì´ë¦ë§ ëª©ë¡ íì" + +#: builtin/ls-tree.c:143 +msgid "use full path names" +msgstr "ì ì²´ ê²½ë¡ ì´ë¦ ì¬ì©" + +#: builtin/ls-tree.c:145 +msgid "list entire tree; not just current directory (implies --full-name)" +msgstr "ì ì²´ í¸ë¦¬ ëª©ë¡ íì, íì¬ ëë í°ë¦¬ë§ ìëë¼ (--full-name ìµì í¬í¨)" + +#: builtin/merge.c:45 +msgid "git merge [<options>] [<commit>...]" +msgstr "git merge [<ìµì >] [<커ë°>...]" + +#: builtin/merge.c:46 +msgid "git merge [<options>] <msg> HEAD <commit>" +msgstr "git merge [<ìµì >] <ë©ìì§> HEAD <커ë°>" + +#: builtin/merge.c:47 +msgid "git merge --abort" +msgstr "git merge --abort" + +#: builtin/merge.c:100 +msgid "switch `m' requires a value" +msgstr "`m' ìµì ìë ê°ì´ íìí©ëë¤" + +#: builtin/merge.c:137 +#, c-format +msgid "Could not find merge strategy '%s'.\n" +msgstr "'%s' ë³í© ì ëµì ì°¾ì ì ììµëë¤.\n" + +#: builtin/merge.c:138 +#, c-format +msgid "Available strategies are:" +msgstr "ì¬ì© ê°ë¥í ì ëµì:" + +#: builtin/merge.c:143 +#, c-format +msgid "Available custom strategies are:" +msgstr "ì¬ì© ê°ë¥í ì¬ì©ì ì¤ì ì ëµì:" + +#: builtin/merge.c:193 builtin/pull.c:119 +msgid "do not show a diffstat at the end of the merge" +msgstr "ë³í©ì´ ëë ë diffstatì íìíì§ ììµëë¤" + +#: builtin/merge.c:196 builtin/pull.c:122 +msgid "show a diffstat at the end of the merge" +msgstr "ë³í©ì´ ëë ë diffstatì íìí©ëë¤" + +#: builtin/merge.c:197 builtin/pull.c:125 +msgid "(synonym to --stat)" +msgstr "(--stat ìµì ê³¼ ëì¼)" + +#: builtin/merge.c:199 builtin/pull.c:128 +msgid "add (at most <n>) entries from shortlog to merge commit message" +msgstr "ë³í© 커ë°ì ë©ìì§ì shortlog í목ì (ìµë <n>ê°) ì¶ê°í©ëë¤" + +#: builtin/merge.c:202 builtin/pull.c:131 +msgid "create a single commit instead of doing a merge" +msgstr "ë³í©íë ëì íëì 커ë°ì ë§ëëë¤" + +#: builtin/merge.c:204 builtin/pull.c:134 +msgid "perform a commit if the merge succeeds (default)" +msgstr "ë³í©ì´ ì±ê³µíë©´ 커ë°ì í©ëë¤ (기본ê°)" + +#: builtin/merge.c:206 builtin/pull.c:137 +msgid "edit message before committing" +msgstr "ì»¤ë° ì ì ë©ìì§ë¥¼ í¸ì§í©ëë¤" + +#: builtin/merge.c:207 +msgid "allow fast-forward (default)" +msgstr "ì ë°©í¥ ì§íì íì©í©ëë¤ (기본ê°)" + +#: builtin/merge.c:209 builtin/pull.c:143 +msgid "abort if fast-forward is not possible" +msgstr "ì ë°©í¥ ì§íì´ ë¶ê°ë¥íë©´ ì¤ì§í©ëë¤" + +#: builtin/merge.c:213 +msgid "Verify that the named commit has a valid GPG signature" +msgstr "ì´ë¦ ë¶ì¸ 커ë°ì ì¬ë°ë¥¸ GPG ìëª ì´ ìëì§ ê²ì¦í©ëë¤" + +#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148 +#: builtin/revert.c:89 +msgid "strategy" +msgstr "ì ëµ" + +#: builtin/merge.c:215 builtin/pull.c:149 +msgid "merge strategy to use" +msgstr "ì¬ì©í ë³í© ì ëµ" + +#: builtin/merge.c:216 builtin/pull.c:152 +msgid "option=value" +msgstr "ìµì =ê°" + +#: builtin/merge.c:217 builtin/pull.c:153 +msgid "option for selected merge strategy" +msgstr "ì íí ë³í© ì ëµì ëí ìµì " + +#: builtin/merge.c:219 +msgid "merge commit message (for a non-fast-forward merge)" +msgstr "ë³í© ì»¤ë° ë©ìì§ (ì ë°©í¥ì´ ìë ë³í©ì ëí´)" + +#: builtin/merge.c:223 +msgid "abort the current in-progress merge" +msgstr "íì¬ ì§í ì¤ì¸ ë³í©ì ì¤ì§í©ëë¤" + +#: builtin/merge.c:251 +msgid "could not run stash." +msgstr "stash를 ì¤íí ì ììµëë¤." + +#: builtin/merge.c:256 +msgid "stash failed" +msgstr "stash ì¤í¨" + +#: builtin/merge.c:261 +#, c-format +msgid "not a valid object: %s" +msgstr "ì¬ë°ë¥¸ ì¤ë¸ì í¸ê° ìëëë¤: %s" + +#: builtin/merge.c:280 builtin/merge.c:297 +msgid "read-tree failed" +msgstr "read-tree ì¤í¨" + +#: builtin/merge.c:327 +msgid " (nothing to squash)" +msgstr " (í©ì¹ ë´ì©ì´ ììµëë¤)" + +#: builtin/merge.c:340 +#, c-format +msgid "Squash commit -- not updating HEAD\n" +msgstr "ì»¤ë° í©ì¹ê¸° -- HEAD를 ì ë°ì´í¸íì§ ììµëë¤\n" + +#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975 +#: builtin/merge.c:988 +#, c-format +msgid "Could not write to '%s'" +msgstr "'%s'ì ì¸ ì ììµëë¤" + +#: builtin/merge.c:372 +msgid "Writing SQUASH_MSG" +msgstr "SQUASH_MSG를 ì°ë ì¤" + +#: builtin/merge.c:374 +msgid "Finishing SQUASH_MSG" +msgstr "SQUASH_MSG를 ë§ì¹ë ì¤" + +#: builtin/merge.c:397 +#, c-format +msgid "No merge message -- not updating HEAD\n" +msgstr "ë³í© ë©ìì§ê° ììµëë¤ -- HEAD를 ì ë°ì´í¸íì§ ììµëë¤\n" + +#: builtin/merge.c:447 +#, c-format +msgid "'%s' does not point to a commit" +msgstr "'%s'ì´(ê°) 커ë°ì ê°ë¦¬í¤ì§ ììµëë¤" + +#: builtin/merge.c:537 +#, c-format +msgid "Bad branch.%s.mergeoptions string: %s" +msgstr "ì못ë branch.%s.mergeoptions 문ìì´: %s" + +#: builtin/merge.c:656 +msgid "Not handling anything other than two heads merge." +msgstr "ë ê°ì í¤ë ë³í© ì¸ìë ì²ë¦¬íì§ ììµëë¤." + +#: builtin/merge.c:670 +#, c-format +msgid "Unknown option for merge-recursive: -X%s" +msgstr "merge-recursiveì ëí´ ì ì ìë ìµì : -X%s" + +#: builtin/merge.c:683 +#, c-format +msgid "unable to write %s" +msgstr "%sì ì¸ ì ììµëë¤" + +#: builtin/merge.c:772 +#, c-format +msgid "Could not read from '%s'" +msgstr "'%s'ìì ì½ì ì ììµëë¤" + +#: builtin/merge.c:781 +#, c-format +msgid "Not committing merge; use 'git commit' to complete the merge.\n" +msgstr "ë³í©ì 커ë°íì§ ììµëë¤. ë³í©ì ë§ì¹ë ¤ë©´ 'git commit'ì ì¬ì©íììì¤.\n" + +#: builtin/merge.c:787 +#, c-format +msgid "" +"Please enter a commit message to explain why this merge is necessary,\n" +"especially if it merges an updated upstream into a topic branch.\n" +"\n" +"Lines starting with '%c' will be ignored, and an empty message aborts\n" +"the commit.\n" +msgstr "" +"ì ì´ ë³í©ì´ íìíì§ë¥¼ ì¤ëª íë ì»¤ë° ë©ìì§ë¥¼ ì ë ¥íììì¤. í¹í\n" +"ì ì¤í¸ë¦¼ ì ë°ì´í¸ë¥¼ ì´ë¤ 목ì ì© ë¸ëì¹ë¡ ë³í©í ëë ë°ëì ê·¸ë ê²\n" +"íììì¤.\n" +"\n" +"'%c' 문ìë¡ ììíë ì¤ì 무ìëê³ , ë©ìì§ê° ë¹ì´ ìì¼ë©´ 커ë°ì\n" +"ì¤ì§í©ëë¤.\n" + +#: builtin/merge.c:811 +msgid "Empty commit message." +msgstr "ë¹ ì»¤ë° ë©ìì§." + +#: builtin/merge.c:823 +#, c-format +msgid "Wonderful.\n" +msgstr "íë¥í©ëë¤.\n" + +#: builtin/merge.c:878 +#, c-format +msgid "Automatic merge failed; fix conflicts and then commit the result.\n" +msgstr "ìë ë³í©ì´ ì¤í¨íìµëë¤. 충ëì ë°ë¡ì¡ê³ 결과물ì 커ë°íììì¤.\n" + +#: builtin/merge.c:894 +#, c-format +msgid "'%s' is not a commit" +msgstr "'%s'ì(ë) 커ë°ì´ ìëëë¤" + +#: builtin/merge.c:935 +msgid "No current branch." +msgstr "íì¬ ë¸ëì¹ê° ììµëë¤." + +#: builtin/merge.c:937 +msgid "No remote for the current branch." +msgstr "íì¬ ë¸ëì¹ì ëí 리모í¸ê° ììµëë¤." + +#: builtin/merge.c:939 +msgid "No default upstream defined for the current branch." +msgstr "íì¬ ë¸ëì¹ì ëí´ ê¸°ë³¸ ì ì¤í¸ë¦¼ì ì§ì íì§ ìììµëë¤." + +#: builtin/merge.c:944 +#, c-format +msgid "No remote-tracking branch for %s from %s" +msgstr "ë¦¬ëª¨í¸ %2$sìì %1$sì ëí ë¦¬ëª¨í¸ ì¶ì ë¸ëì¹ê° ììµëë¤" + +#: builtin/merge.c:1079 +#, c-format +msgid "could not close '%s'" +msgstr "'%s'ì(를) ë«ì ì ììµëë¤" + +#: builtin/merge.c:1206 +msgid "There is no merge to abort (MERGE_HEAD missing)." +msgstr "ì¤ì§í ë³í© ìì ì´ ììµëë¤. (MERGE_HEADê° ìì)" + +#: builtin/merge.c:1222 +msgid "" +"You have not concluded your merge (MERGE_HEAD exists).\n" +"Please, commit your changes before you merge." +msgstr "" +"ë³í©ì ë§ì¹ì§ ìììµëë¤. (MERGE_HEAD ìì)\n" +"ë³í©í기 ì ì ë³ê²½ ì¬íì 커ë°íììì¤." + +#: builtin/merge.c:1229 +msgid "" +"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" +"Please, commit your changes before you merge." +msgstr "" +"ì»¤ë° ë¹¼ì¤ê¸°ë¥¼ ë§ì¹ì§ ìììµëë¤. (COMMIT_PICK_HEAD ìì)\n" +"ë³í©í기 ì ì ë³ê²½ ì¬íì 커ë°íììì¤." + +#: builtin/merge.c:1232 +msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." +msgstr "ì»¤ë° ë¹¼ì¤ê¸°ë¥¼ ë§ì¹ì§ ìììµëë¤. (CHERRY_PICK_HEAD ìì)" + +#: builtin/merge.c:1241 +msgid "You cannot combine --squash with --no-ff." +msgstr "--squash ìµì ì --no-ff ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤." + +#: builtin/merge.c:1249 +msgid "No commit specified and merge.defaultToUpstream not set." +msgstr "커ë°ì ì§ì íì§ ììê³ merge.defaultToUpstream를 ì¤ì íì§ ìììµëë¤." + +#: builtin/merge.c:1266 +msgid "Squash commit into empty head not supported yet" +msgstr "ë¹ í¤ëë¡ ì»¤ë°ì í©ì¹ê¸°ë ì§ìíì§ ììµëë¤" + +#: builtin/merge.c:1268 +msgid "Non-fast-forward commit does not make sense into an empty head" +msgstr "ì ë°©í¥ì´ ìë 커ë°ì ë¹ í¤ëììë ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/merge.c:1274 +#, c-format +msgid "%s - not something we can merge" +msgstr "%s - ë³í©í ì ìë íëª©ì´ ìëëë¤" + +#: builtin/merge.c:1276 +msgid "Can merge only exactly one commit into empty head" +msgstr "ë¹ í¤ëìë ì íí íëì 커ë°ë§ ë³í©í ì ììµëë¤" + +#: builtin/merge.c:1331 +#, c-format +msgid "Commit %s has an untrusted GPG signature, allegedly by %s." +msgstr "%s 커ë°ì ì 뢰íì§ ìë (ìëª ìê° %së¼ê³ íë) GPG ìëª ì´ ììµëë¤." + +#: builtin/merge.c:1334 +#, c-format +msgid "Commit %s has a bad GPG signature allegedly by %s." +msgstr "%s 커ë°ì ì못ë (ìëª ìê° %së¼ê³ íë) GPG ìëª ì´ ììµëë¤." + +#: builtin/merge.c:1337 +#, c-format +msgid "Commit %s does not have a GPG signature." +msgstr "%s 커ë°ì GPG ìëª ì´ ììµëë¤." + +#: builtin/merge.c:1340 +#, c-format +msgid "Commit %s has a good GPG signature by %s\n" +msgstr "%s 커ë°ì %sì ì¬ë°ë¥¸ GPG ìëª ì´ ììµëë¤\n" + +#: builtin/merge.c:1423 +#, c-format +msgid "Updating %s..%s\n" +msgstr "ì ë°ì´í¸ ì¤ %s..%s\n" + +#: builtin/merge.c:1460 +#, c-format +msgid "Trying really trivial in-index merge...\n" +msgstr "ì주 ê°ë¨í ì¸ë±ì¤ ë´ë¶ ë³í©ì ìëí©ëë¤...\n" + +#: builtin/merge.c:1467 +#, c-format +msgid "Nope.\n" +msgstr "ìë.\n" + +#: builtin/merge.c:1499 +msgid "Not possible to fast-forward, aborting." +msgstr "ì ë°©í¥ì´ ë¶ê°ë¥íë¯ë¡, ì¤ì§í©ëë¤." + +#: builtin/merge.c:1522 builtin/merge.c:1601 +#, c-format +msgid "Rewinding the tree to pristine...\n" +msgstr "í¸ë¦¬ë¥¼ 본ë ìì¹ë¡ ëë립ëë¤...\n" + +#: builtin/merge.c:1526 +#, c-format +msgid "Trying merge strategy %s...\n" +msgstr "ë³í© ì ëµ %s ìë...\n" + +#: builtin/merge.c:1592 +#, c-format +msgid "No merge strategy handled the merge.\n" +msgstr "ë³í©ì ì²ë¦¬í ì ëµì´ ììµëë¤.\n" + +#: builtin/merge.c:1594 +#, c-format +msgid "Merge with strategy %s failed.\n" +msgstr "ì ëµ %s(ì¼)ë¡ ë³í©ì´ ì¤í¨íìµëë¤.\n" + +#: builtin/merge.c:1603 +#, c-format +msgid "Using the %s to prepare resolving by hand.\n" +msgstr "ìë í´ê²°ì ì¤ë¹ë¥¼ ìí´ %s ì ëµì ì¬ì©í©ëë¤.\n" + +#: builtin/merge.c:1615 +#, c-format +msgid "Automatic merge went well; stopped before committing as requested\n" +msgstr "ìë ë³í©ì´ ì ì§íëììµëë¤. ìì²íëë¡ ì»¤ë° ì ì ì¤ì§í©ëë¤\n" + +#: builtin/merge-base.c:29 +msgid "git merge-base [-a | --all] <commit> <commit>..." +msgstr "git merge-base [-a | --all] <커ë°> <커ë°>..." + +#: builtin/merge-base.c:30 +msgid "git merge-base [-a | --all] --octopus <commit>..." +msgstr "git merge-base [-a | --all] --octopus <커ë°>..." + +#: builtin/merge-base.c:31 +msgid "git merge-base --independent <commit>..." +msgstr "git merge-base --independent <커ë°>..." + +#: builtin/merge-base.c:32 +msgid "git merge-base --is-ancestor <commit> <commit>" +msgstr "git merge-base --is-ancestor <커ë°> <커ë°>" + +#: builtin/merge-base.c:33 +msgid "git merge-base --fork-point <ref> [<commit>]" +msgstr "git merge-base --fork-point <ë í¼ë°ì¤> [<커ë°>]" + +#: builtin/merge-base.c:214 +msgid "output all common ancestors" +msgstr "모ë 과거 ê³µíµ ì»¤ë°ì ì¶ë ¥í©ëë¤" + +#: builtin/merge-base.c:216 +msgid "find ancestors for a single n-way merge" +msgstr "íëì n-ë°©í¥ ë³í©ì ëí 과거 커ë°ì ì°¾ìµëë¤" + +#: builtin/merge-base.c:218 +msgid "list revs not reachable from others" +msgstr "ë¤ë¥¸ ê³³ìì ì ê·¼ ë¶ê°ë¥í 리ë¹ì 목ë¡ì ì¶ë ¥í©ëë¤" + +#: builtin/merge-base.c:220 +msgid "is the first one ancestor of the other?" +msgstr "첫ë²ì§¸ê° ë¤ë¥¸ ê²ì 과거 커ë°ì¸ì§ ì¬ë¶?" + +#: builtin/merge-base.c:222 +msgid "find where <commit> forked from reflog of <ref>" +msgstr "<ë í¼ë°ì¤>ì reflogìì <커ë°>ì´ ë¶ë¦¬ë ìì¹ë¥¼ ì°¾ìµëë¤" + +#: builtin/merge-file.c:8 +msgid "" +"git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> " +"<orig-file> <file2>" +msgstr "git merge-file [<ìµì >] [-L <ì´ë¦1> [-L <orig> [-L <ì´ë¦2>]]] <íì¼1> <본ë-íì¼> <íì¼2>" + +#: builtin/merge-file.c:33 +msgid "send results to standard output" +msgstr "결과를 íì¤ ì¶ë ¥ì¼ë¡ ë³´ë ëë¤" + +#: builtin/merge-file.c:34 +msgid "use a diff3 based merge" +msgstr "diff3 ê¸°ë° ë³í©ì ì¬ì©í©ëë¤" + +#: builtin/merge-file.c:35 +msgid "for conflicts, use our version" +msgstr "충ëì´ ë°ìíë©´, ì°ë¦¬ìª½ ë²ì ì ì¬ì©í©ëë¤" + +#: builtin/merge-file.c:37 +msgid "for conflicts, use their version" +msgstr "충ëì´ ë°ìíë©´, ìëí¸ ë²ì ì ì¬ì©í©ëë¤" + +#: builtin/merge-file.c:39 +msgid "for conflicts, use a union version" +msgstr "충ëì´ ë°ìíë©´, í©ì¹ ë²ì ì ì¬ì©í©ëë¤" + +#: builtin/merge-file.c:42 +msgid "for conflicts, use this marker size" +msgstr "충ëì´ ë°ìíë©´, ì´ í¬ê¸°ë¡ íìí©ëë¤" + +#: builtin/merge-file.c:43 +msgid "do not warn about conflicts" +msgstr "충ëì ëí´ ê²½ê³ íì§ ììµëë¤" + +#: builtin/merge-file.c:45 +msgid "set labels for file1/orig-file/file2" +msgstr "<íì¼1>/<본ë-íì¼>/<íì¼2>ì ëí ë ì´ë¸ì ì¤ì í©ëë¤" + +#: builtin/mktree.c:64 +msgid "git mktree [-z] [--missing] [--batch]" +msgstr "git mktree [-z] [--missing] [--batch]" + +#: builtin/mktree.c:150 +msgid "input is NUL terminated" +msgstr "ì ë ¥ì´ NULë¡ ëë©ëë¤" + +#: builtin/mktree.c:151 builtin/write-tree.c:24 +msgid "allow missing objects" +msgstr "ìë ì¤ë¸ì í¸ë¥¼ íì©í©ëë¤" + +#: builtin/mktree.c:152 +msgid "allow creation of more than one tree" +msgstr "ì¬ë¬ê° í¸ë¦¬ ë§ë¤ê¸°ë¥¼ íì©í©ëë¤" + +#: builtin/mv.c:15 +msgid "git mv [<options>] <source>... <destination>" +msgstr "git mv [<ìµì >] <ì본>... <ëì>" + +#: builtin/mv.c:69 +#, c-format +msgid "Directory %s is in index and no submodule?" +msgstr "%s ëë í°ë¦¬ê° ì¸ë±ì¤ì ìê³ íì 모ëì´ ììµëë¤?" + +#: builtin/mv.c:71 +msgid "Please stage your changes to .gitmodules or stash them to proceed" +msgstr "ê³ìíë ¤ë©´ .gitmodulesì ë³ê²½ ì¬íì ì¤í ì´ì§ì ë£ê±°ë stash íììì¤" + +#: builtin/mv.c:89 +#, c-format +msgid "%.*s is in index" +msgstr "%.*sì´(ê°) ì¸ë±ì¤ì ììµëë¤" + +#: builtin/mv.c:111 +msgid "force move/rename even if target exists" +msgstr "ëìì´ ì´ë¯¸ ìì´ë ê°ì ë¡ ì®ê¸°ê¸°/ì´ë¦ ë°ê¾¸ê¸°ë¥¼ í©ëë¤" + +#: builtin/mv.c:112 +msgid "skip move/rename errors" +msgstr "ì®ê¸°ê¸°/ì´ë¦ ë°ê¾¸ê¸° ì¤ë¥ë¥¼ ê±´ë ëëë¤" + +#: builtin/mv.c:151 +#, c-format +msgid "destination '%s' is not a directory" +msgstr "ëìì´ ('%s') ëë í°ë¦¬ê° ìëëë¤" + +#: builtin/mv.c:162 +#, c-format +msgid "Checking rename of '%s' to '%s'\n" +msgstr "'%s'ì(를) '%s'(ì¼)ë¡ ì´ë¦ ë°ê¾¸ê¸°í©ëë¤\n" + +#: builtin/mv.c:166 +msgid "bad source" +msgstr "ì못ë ì본" + +#: builtin/mv.c:169 +msgid "can not move directory into itself" +msgstr "ëë í°ë¦¬ë¥¼ ì기 ìì ì¼ë¡ ì®ê¸¸ ì ììµëë¤" + +#: builtin/mv.c:172 +msgid "cannot move directory over file" +msgstr "ëë í°ë¦¬ë¥¼ íì¼ë¡ ì®ê¸¸ ì ììµëë¤" + +#: builtin/mv.c:181 +msgid "source directory is empty" +msgstr "ì본 ëë í°ë¦¬ê° ë¹ì´ ììµëë¤" + +#: builtin/mv.c:206 +msgid "not under version control" +msgstr "ë²ì 컨í¸ë¡¤ ì¤ì´ ìëëë¤" + +#: builtin/mv.c:209 +msgid "destination exists" +msgstr "ëìì´ ììµëë¤" + +#: builtin/mv.c:217 +#, c-format +msgid "overwriting '%s'" +msgstr "'%s' ë®ì´ì°ê¸°" + +#: builtin/mv.c:220 +msgid "Cannot overwrite" +msgstr "ë®ì´ì¸ ì ììµëë¤" + +#: builtin/mv.c:223 +msgid "multiple sources for the same target" +msgstr "ëì¼í ëìì ëí´ ì¬ë¬ ê° ì본" + +#: builtin/mv.c:225 +msgid "destination directory does not exist" +msgstr "ëì ëë í°ë¦¬ê° ììµëë¤" + +#: builtin/mv.c:232 +#, c-format +msgid "%s, source=%s, destination=%s" +msgstr "%s, ì본=%s, ëì=%s" + +#: builtin/mv.c:253 +#, c-format +msgid "Renaming %s to %s\n" +msgstr "ì´ë¦ ë°ê¾¸ê¸°, '%s'ìì '%s'(ì¼)ë¡\n" + +#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365 +#, c-format +msgid "renaming '%s' failed" +msgstr "'%s'ì ì´ë¦ ë°ê¾¸ê¸°ê° ì¤í¨íìµëë¤" + +#: builtin/name-rev.c:251 +msgid "git name-rev [<options>] <commit>..." +msgstr "git name-rev [<ìµì >] <커ë°>..." + +#: builtin/name-rev.c:252 +msgid "git name-rev [<options>] --all" +msgstr "git name-rev [<ìµì >] --all" + +#: builtin/name-rev.c:253 +msgid "git name-rev [<options>] --stdin" +msgstr "git name-rev [<ìµì >] --stdin" + +#: builtin/name-rev.c:305 +msgid "print only names (no SHA-1)" +msgstr "ì´ë¦ë§ íì (SHA-1 ìì´)" + +#: builtin/name-rev.c:306 +msgid "only use tags to name the commits" +msgstr "커ë°ì ì§ì í ë íê·¸ë§ ì¬ì©í©ëë¤" + +#: builtin/name-rev.c:308 +msgid "only use refs matching <pattern>" +msgstr "<í¨í´>ê³¼ ì¼ì¹íë ë í¼ë°ì¤ë§ ì¬ì©í©ëë¤" + +#: builtin/name-rev.c:310 +msgid "list all commits reachable from all refs" +msgstr "모ë ë í¼ë°ì¤ìì ì ê·¼ ê°ë¥í 모ë ì»¤ë° ëª©ë¡ì íìí©ëë¤" + +#: builtin/name-rev.c:311 +msgid "read from stdin" +msgstr "íì¤ì ë ¥ìì ì½ìµëë¤" + +#: builtin/name-rev.c:312 +msgid "allow to print `undefined` names (default)" +msgstr "`ì ìëì§ ìì' ì´ë¦ íì를 íì©í©ëë¤ (기본ê°)" + +#: builtin/name-rev.c:318 +msgid "dereference tags in the input (internal use)" +msgstr "ì ë ¥ì íê·¸ ë í¼ë°ì¤ë¥¼ ë°ë¼ê°ëë¤ (ë´ë¶ ì¬ì©)" + +#: builtin/notes.c:25 +msgid "git notes [--ref <notes-ref>] [list [<object>]]" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] [list [<ì¤ë¸ì í¸>]]" + +#: builtin/notes.c:26 +msgid "" +"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> " +"| (-c | -C) <object>] [<object>]" +msgstr "" +"git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <ë©ìì§> | -F <í" +"ì¼> | (-c | -C) <ì¤ë¸ì í¸>] [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:27 +msgid "git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] copy [-f] <ì본-ì¤ë¸ì í¸> <ëì-ì¤ë¸ì í¸>" + +#: builtin/notes.c:28 +msgid "" +"git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | " +"(-c | -C) <object>] [<object>]" +msgstr "" +"git notes [--ref <쪽ì§-ë í¼ë°ì¤>] append [--allow-empty] [-m <ë©ìì§> | -F <" +"íì¼> | (-c | -C) <ì¤ë¸ì í¸>] [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:29 +msgid "git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]" +msgstr "git notes [--ref <쪽ì§-ë í¼ë°ì¤>] edit [--allow-empty] [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:30 +msgid "git notes [--ref <notes-ref>] show [<object>]" +msgstr "git notes [--ref <notes-ref>] show [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:31 +msgid "" +"git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] merge [-v | -q] [-s <ì ëµ>] <ë ¸í¸-ë í¼ë°ì¤>" + +#: builtin/notes.c:32 +msgid "git notes merge --commit [-v | -q]" +msgstr "git notes merge --commit [-v | -q]" + +#: builtin/notes.c:33 +msgid "git notes merge --abort [-v | -q]" +msgstr "git notes merge --abort [-v | -q]" + +#: builtin/notes.c:34 +msgid "git notes [--ref <notes-ref>] remove [<object>...]" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] remove [<ì¤ë¸ì í¸>...]" + +#: builtin/notes.c:35 +msgid "git notes [--ref <notes-ref>] prune [-n | -v]" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] prune [-n | -v]" + +#: builtin/notes.c:36 +msgid "git notes [--ref <notes-ref>] get-ref" +msgstr "git notes [--ref <ë ¸í¸-ë í¼ë°ì¤>] get-ref" + +#: builtin/notes.c:41 +msgid "git notes [list [<object>]]" +msgstr "git notes [list [<ì¤ë¸ì í¸>]]" + +#: builtin/notes.c:46 +msgid "git notes add [<options>] [<object>]" +msgstr "git notes add [<ìµì >] [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:51 +msgid "git notes copy [<options>] <from-object> <to-object>" +msgstr "git notes copy [<ìµì >] <ì본-ì¤ë¸ì í¸> <ëì-ì¤ë¸ì í¸>" + +#: builtin/notes.c:52 +msgid "git notes copy --stdin [<from-object> <to-object>]..." +msgstr "git notes copy --stdin [<ì본-ì¤ë¸ì í¸> <ëì-ì¤ë¸ì í¸>]..." + +#: builtin/notes.c:57 +msgid "git notes append [<options>] [<object>]" +msgstr "git notes append [<ìµì >] [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:62 +msgid "git notes edit [<object>]" +msgstr "git notes edit [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:67 +msgid "git notes show [<object>]" +msgstr "git notes show [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:72 +msgid "git notes merge [<options>] <notes-ref>" +msgstr "git notes merge [<ìµì >] <쪽ì§-ë í¼ë°ì¤>" + +#: builtin/notes.c:73 +msgid "git notes merge --commit [<options>]" +msgstr "git notes merge --commit [<ìµì >]" + +#: builtin/notes.c:74 +msgid "git notes merge --abort [<options>]" +msgstr "git notes merge --abort [<ìµì >]" + +#: builtin/notes.c:79 +msgid "git notes remove [<object>]" +msgstr "git notes remove [<ì¤ë¸ì í¸>]" + +#: builtin/notes.c:84 +msgid "git notes prune [<options>]" +msgstr "git notes prune [<ìµì >]" + +#: builtin/notes.c:89 +msgid "git notes get-ref" +msgstr "git notes get-ref" + +#: builtin/notes.c:147 +#, c-format +msgid "unable to start 'show' for object '%s'" +msgstr "'%s' ì¤ë¸ì í¸ì ëí´ 'show'를 ììí ì ììµëë¤" + +#: builtin/notes.c:151 +msgid "could not read 'show' output" +msgstr "'show' ì¶ë ¥ì ì½ì ì ììµëë¤" + +#: builtin/notes.c:159 +#, c-format +msgid "failed to finish 'show' for object '%s'" +msgstr "ì¤ë¸ì í¸ '%s'ì ëí´ 'show'를 ë§ì¹ëë° ì¤í¨íìµëë¤" + +#: builtin/notes.c:174 builtin/tag.c:248 +#, c-format +msgid "could not create file '%s'" +msgstr "'%s' íì¼ì ë§ë¤ ì ììµëë¤" + +#: builtin/notes.c:193 +msgid "Please supply the note contents using either -m or -F option" +msgstr "ë ¸í¸ ë´ì©ì -m ëë -F ìµì ì¼ë¡ ì ë ¥íììì¤" + +#: builtin/notes.c:202 +msgid "unable to write note object" +msgstr "ë ¸í¸ ì¤ë¸ì í¸ë¥¼ ì¸ ì ììµëë¤" + +#: builtin/notes.c:204 +#, c-format +msgid "The note contents have been left in %s" +msgstr "ë ¸í¸ ë´ì©ì %sì ë¨ìµëë¤" + +#: builtin/notes.c:232 builtin/tag.c:440 +#, c-format +msgid "cannot read '%s'" +msgstr "'%s'ì(를) ì½ì ì ììµëë¤" + +#: builtin/notes.c:234 builtin/tag.c:443 +#, c-format +msgid "could not open or read '%s'" +msgstr "'%s'ì(를) ì´ê±°ë ì½ì ì ììµëë¤" + +#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306 +#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507 +#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653 +#: builtin/notes.c:877 builtin/tag.c:456 +#, c-format +msgid "Failed to resolve '%s' as a valid ref." +msgstr "'%s'ì(를) ì¬ë°ë¥¸ ë í¼ë°ì¤ë¡ ììë´ëë° ì¤í¨íìµëë¤." + +#: builtin/notes.c:256 +#, c-format +msgid "Failed to read object '%s'." +msgstr "'%s' ì¤ë¸ì í¸ ì½ê¸°ì ì¤í¨íìµëë¤." + +#: builtin/notes.c:260 +#, c-format +msgid "Cannot read note data from non-blob object '%s'." +msgstr "ë¸ë¡ì´ ìë '%s' ì¤ë¸ì í¸ì ëí´ ë ¸í¸ ë°ì´í°ë¥¼ ì½ì ì ììµëë¤." + +#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490 +#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646 +#: builtin/notes.c:942 +msgid "too many parameters" +msgstr "íë¼ë¯¸í°ê° ë무 ë§ìµëë¤" + +#: builtin/notes.c:372 builtin/notes.c:659 +#, c-format +msgid "No note found for object %s." +msgstr "%s ì¤ë¸ì í¸ì ëí´ ë ¸í¸ê° ììµëë¤." + +#: builtin/notes.c:393 builtin/notes.c:556 +msgid "note contents as a string" +msgstr "문ìì´ë¡ ë ¸í¸ ë´ì©" + +#: builtin/notes.c:396 builtin/notes.c:559 +msgid "note contents in a file" +msgstr "íì¼ ìì ë ¸í¸ ë´ì©" + +#: builtin/notes.c:399 builtin/notes.c:562 +msgid "reuse and edit specified note object" +msgstr "ì§ì í ë ¸í¸ ì¤ë¸ì í¸ë¥¼ ì¬ì¬ì©íê³ í¸ì§í©ëë¤" + +#: builtin/notes.c:402 builtin/notes.c:565 +msgid "reuse specified note object" +msgstr "ì§ì í ë ¸í¸ ì¤ë¸ì í¸ë¥¼ ì¬ì¬ì©í©ëë¤" + +#: builtin/notes.c:405 builtin/notes.c:568 +msgid "allow storing empty note" +msgstr "ë¹ ë ¸í¸ ì ì¥ì íì©í©ëë¤" + +#: builtin/notes.c:406 builtin/notes.c:477 +msgid "replace existing notes" +msgstr "기존 ë ¸í¸ë¥¼ ë°ê¿ëë¤" + +#: builtin/notes.c:431 +#, c-format +msgid "" +"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "ë ¸í¸ë¥¼ ì¶ê°í ì ììµëë¤. %s ì¤ë¸ì í¸ì ëí 기존 ë ¸í¸ê° ììµëë¤. 기존 ë ¸í¸ë¥¼ ë®ì´ì°ë ¤ë©´ '-f' ìµì ì ì¬ì©íììì¤" + +#: builtin/notes.c:446 builtin/notes.c:525 +#, c-format +msgid "Overwriting existing notes for object %s\n" +msgstr "%s ì¤ë¸ì í¸ì ëí 기존 ë ¸í¸ë¥¼ ë®ì´ìëë¤\n" + +#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882 +#, c-format +msgid "Removing note for object %s\n" +msgstr "%s ì¤ë¸ì í¸ì ëí ë ¸í¸ë¥¼ ì ê±°í©ëë¤\n" + +#: builtin/notes.c:478 +msgid "read objects from stdin" +msgstr "íì¤ ì ë ¥ìì ì¤ë¸ì í¸ë¥¼ ì½ìµëë¤" + +#: builtin/notes.c:480 +msgid "load rewriting config for <command> (implies --stdin)" +msgstr "<ëª ë ¹>ì ëí ë¤ìì°ê¸° ì¤ì ì ì½ì´ë¤ì ëë¤ (--stdin ìµì í¬í¨)" + +#: builtin/notes.c:498 +msgid "too few parameters" +msgstr "íë¼ë¯¸í°ê° ë무 ì ìµëë¤" + +#: builtin/notes.c:519 +#, c-format +msgid "" +"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "ë ¸í¸ë¥¼ ë³µì¬í ì ììµëë¤. %s ì¤ë¸ì í¸ì ëí 기존 ë ¸í¸ê° ììµëë¤. 기존 ë ¸í¸ë¥¼ ë®ì´ì°ë ¤ë©´ '-f' ìµì ì ì¬ì©íììì¤" + +#: builtin/notes.c:531 +#, c-format +msgid "Missing notes on source object %s. Cannot copy." +msgstr "ì본 %s ì¤ë¸ì í¸ì ëí ë ¸í¸ê° ììµëë¤. ë³µì¬í ì ììµëë¤." + +#: builtin/notes.c:583 +#, c-format +msgid "" +"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" +"Please use 'git notes add -f -m/-F/-c/-C' instead.\n" +msgstr "" +"-m/-F/-c/-C ìµì ì 'edit' íì ëª ë ¹ì ëí´ ì¬ì©ì ê¶íì§ ììµëë¤.\n" +"ëì ì 'git notes add -f -m/-F/-c/-C' ëª ë ¹ì ì¬ì©íììì¤.\n" + +#: builtin/notes.c:764 +msgid "General options" +msgstr "ì¼ë° ìµì " + +#: builtin/notes.c:766 +msgid "Merge options" +msgstr "ë³í© ìµì " + +#: builtin/notes.c:768 +msgid "" +"resolve notes conflicts using the given strategy (manual/ours/theirs/union/" +"cat_sort_uniq)" +msgstr "주ì´ì§ ì ëµì ì¬ì©í´ ë ¸í¸ ì¶©ëì í´ê²°í©ëë¤ (manual/ours/theirs/union/cat_sort_uniq)" + +#: builtin/notes.c:770 +msgid "Committing unmerged notes" +msgstr "ë³í©íì§ ìì ë ¸í¸ ì»¤ë°" + +#: builtin/notes.c:772 +msgid "finalize notes merge by committing unmerged notes" +msgstr "ë³í©íì§ ìì ë ¸í¸ë¥¼ 커ë°í´ ë ¸í¸ ë³í©ì ë§ì¹©ëë¤" + +#: builtin/notes.c:774 +msgid "Aborting notes merge resolution" +msgstr "ë ¸í¸ ë³í© í´ê²° ì¤ì§" + +#: builtin/notes.c:776 +msgid "abort notes merge" +msgstr "ë ¸í¸ ë³í©ì ì¤ì§í©ëë¤" + +#: builtin/notes.c:853 +#, c-format +msgid "A notes merge into %s is already in-progress at %s" +msgstr "%s ìì¹ë¡ ë ¸í¸ ë³í©ì´ ì´ë¯¸ %sìì ì§íì¤ì ëë¤" + +#: builtin/notes.c:880 +#, c-format +msgid "Object %s has no note\n" +msgstr "%s ì¤ë¸ì í¸ì ë ¸í¸ê° ììµëë¤\n" + +#: builtin/notes.c:892 +msgid "attempt to remove non-existent note is not an error" +msgstr "ìë ë ¸í¸ë¥¼ ì ê±°íë ¤ë ìë를 ì¤ë¥ê° ìë ê²ì¼ë¡ ì·¨ê¸í©ëë¤" + +#: builtin/notes.c:895 +msgid "read object names from the standard input" +msgstr "íì¤ ì ë ¥ìì ì¤ë¸ì í¸ ì´ë¦ì ì½ìµëë¤" + +#: builtin/notes.c:976 +msgid "notes-ref" +msgstr "ë ¸í¸-ë í¼ë°ì¤" + +#: builtin/notes.c:977 +msgid "use notes from <notes-ref>" +msgstr "<ë ¸í¸-ë í¼ë°ì¤>ìì ë ¸í¸ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/notes.c:1012 builtin/remote.c:1647 +#, c-format +msgid "Unknown subcommand: %s" +msgstr "ì ì ìë íì ëª ë ¹: %s" + +#: builtin/pack-objects.c:28 +msgid "" +"git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]" +msgstr "" +"git pack-objects --stdout [<ìµì >...] [< <ë í¼ë°ì¤ëª©ë¡> | < <ì¤ë¸ì í¸ëª©ë¡>]" + +#: builtin/pack-objects.c:29 +msgid "" +"git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]" +msgstr "" +"git pack-objects [<ìµì >...] <ë² ì´ì¤ì´ë¦> [< <ë í¼ë°ì¤ëª©ë¡> | < <ì¤ë¸ì í¸ëª©ë¡" +">]" + +#: builtin/pack-objects.c:175 builtin/pack-objects.c:178 +#, c-format +msgid "deflate error (%d)" +msgstr "deflate ì¤ë¥ (%d)" + +#: builtin/pack-objects.c:771 +msgid "Writing objects" +msgstr "ì¤ë¸ì í¸ ì°ë ì¤" + +#: builtin/pack-objects.c:1011 +msgid "disabling bitmap writing, as some objects are not being packed" +msgstr "묶ìì ë¤ì´ìì§ ìì ì¤ë¸ì í¸ê° ìì¼ë¯ë¡, ë¹í¸ë§µ ì°ê¸°ë¥¼ íì§ ììµëë¤" + +#: builtin/pack-objects.c:2171 +msgid "Compressing objects" +msgstr "ì¤ë¸ì í¸ ìì¶íë ì¤" + +#: builtin/pack-objects.c:2568 +#, c-format +msgid "unsupported index version %s" +msgstr "ì§ìíì§ ìë ì¸ë±ì¤ ë²ì %s" + +#: builtin/pack-objects.c:2572 +#, c-format +msgid "bad index version '%s'" +msgstr "ì못ë ì¸ë±ì¤ ë²ì '%s'" + +#: builtin/pack-objects.c:2602 +msgid "do not show progress meter" +msgstr "ì§íë¥ ì íìíì§ ììµëë¤" + +#: builtin/pack-objects.c:2604 +msgid "show progress meter" +msgstr "ì§íë¥ ì íìí©ëë¤" + +#: builtin/pack-objects.c:2606 +msgid "show progress meter during object writing phase" +msgstr "ì¤ë¸ì í¸ ì°ê¸° ë¨ê³ìì ì§íë¥ ì íìí©ëë¤" + +#: builtin/pack-objects.c:2609 +msgid "similar to --all-progress when progress meter is shown" +msgstr "ì§íë¥ ì´ íìë ë --all-progressì ë¹ì·í©ëë¤" + +#: builtin/pack-objects.c:2610 +msgid "version[,offset]" +msgstr "ë²ì [,ì¤íì ]" + +#: builtin/pack-objects.c:2611 +msgid "write the pack index file in the specified idx format version" +msgstr "ì§ì í ë²ì ì ì¸ë±ì¤ íìì ë°ë¼ 묶ì ì¸ë±ì¤ íì¼ì ìëë¤" + +#: builtin/pack-objects.c:2614 +msgid "maximum size of each output pack file" +msgstr "ì¶ë ¥ 묶ì íì¼ì ìµë í¬ê¸°" + +#: builtin/pack-objects.c:2616 +msgid "ignore borrowed objects from alternate object store" +msgstr "ë³´ì¡° ì¤ë¸ì í¸ ì ì¥ììì ë¹ë ¤ì¨ ì¤ë¸ì í¸ë¥¼ 무ìí©ëë¤" + +#: builtin/pack-objects.c:2618 +msgid "ignore packed objects" +msgstr "묶ì ì¤ë¸ì í¸ë¥¼ 무ìí©ëë¤" + +#: builtin/pack-objects.c:2620 +msgid "limit pack window by objects" +msgstr "묶ì ìëì°ë¥¼ ì¤ë¸ì í¸ ë¨ìë¡ ì íí©ëë¤" + +#: builtin/pack-objects.c:2622 +msgid "limit pack window by memory in addition to object limit" +msgstr "묶ì ìëì°ë¥¼ ì¤ë¸ì í¸ ë¨ìì ì¶ê°ë¡ ë©ëª¨ë¦¬ ë¨ìë¡ ì íí©ëë¤" + +#: builtin/pack-objects.c:2624 +msgid "maximum length of delta chain allowed in the resulting pack" +msgstr "결과물 묶ììì íì©ëë ìµë 길ì´ì ë¸í ì²´ì¸" + +#: builtin/pack-objects.c:2626 +msgid "reuse existing deltas" +msgstr "기존 ë¸í를 ì¬ì¬ì©í©ëë¤" + +#: builtin/pack-objects.c:2628 +msgid "reuse existing objects" +msgstr "기존 ì¤ë¸ì í¸ë¥¼ ì¬ì¬ì©í©ëë¤" + +#: builtin/pack-objects.c:2630 +msgid "use OFS_DELTA objects" +msgstr "OFS_DELTA ì¤ë¸ì í¸ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/pack-objects.c:2632 +msgid "use threads when searching for best delta matches" +msgstr "ìµìì ë¸í ì¼ì¹ë¥¼ ê²ìíëë° ì¤ë ë를 ì¬ì©í©ëë¤" + +#: builtin/pack-objects.c:2634 +msgid "do not create an empty pack output" +msgstr "ë¹ ë¬¶ì ì¶ë ¥ì ë§ë¤ì§ ììµëë¤" + +#: builtin/pack-objects.c:2636 +msgid "read revision arguments from standard input" +msgstr "íì¤ ì ë ¥ìì 리ë¹ì ì¸ì를 ì½ìµëë¤" + +#: builtin/pack-objects.c:2638 +msgid "limit the objects to those that are not yet packed" +msgstr "ë¬¶ì§ ìë ì¤ë¸ì í¸ ì를 ì íí©ëë¤" + +#: builtin/pack-objects.c:2641 +msgid "include objects reachable from any reference" +msgstr "모ë ë í¼ë°ì¤ìì ì ê·¼ ê°ë¥í ì¤ë¸ì í¸ë¥¼ í¬í¨í©ëë¤" + +#: builtin/pack-objects.c:2644 +msgid "include objects referred by reflog entries" +msgstr "reflog í목ìì ë í¼ë°ì¤í ì ìë ì¤ë¸ì í¸ë¥¼ í¬í¨í©ëë¤" + +#: builtin/pack-objects.c:2647 +msgid "include objects referred to by the index" +msgstr "ì¸ë±ì¤ìì< ë í¼ë°ì¤íë ì¤ë¸ì í¸ë¥¼ í¬í¨í©ëë¤" + +#: builtin/pack-objects.c:2650 +msgid "output pack to stdout" +msgstr "묶ìì íì¤ ì¶ë ¥ì¼ë¡ ì¶ë ¥í©ëë¤" + +#: builtin/pack-objects.c:2652 +msgid "include tag objects that refer to objects to be packed" +msgstr "묶ìì ë¤ì´ê° ì¤ë¸ì í¸ë¥¼ ë í¼ë°ì¤íë íê·¸ ì¤ë¸ì í¸ë¥¼ í¬í¨í©ëë¤" + +#: builtin/pack-objects.c:2654 +msgid "keep unreachable objects" +msgstr "ì ê·¼ ë¶ê°ë¥ ì¤ë¸ì í¸ë¥¼ ë³´ì¡´í©ëë¤" + +#: builtin/pack-objects.c:2655 parse-options.h:142 +msgid "time" +msgstr "ìê°" + +#: builtin/pack-objects.c:2656 +msgid "unpack unreachable objects newer than <time>" +msgstr "<ìê°>ë³´ë¤ ìë¡ì´ ì ê·¼ ë¶ê°ë¥ ì¤ë¸ì í¸ì 묶ìì íëë¤" + +#: builtin/pack-objects.c:2659 +msgid "create thin packs" +msgstr "ìì 묶ìì ë§ëëë¤" + +#: builtin/pack-objects.c:2661 +msgid "create packs suitable for shallow fetches" +msgstr "ìì ê°ì ¸ì¤ê¸°ì ì í©í 묶ìì ë§ëëë¤" + +#: builtin/pack-objects.c:2663 +msgid "ignore packs that have companion .keep file" +msgstr "í´ë¹íë .keep íì¼ì´ ìë 묶ìì 무ìí©ëë¤" + +#: builtin/pack-objects.c:2665 +msgid "pack compression level" +msgstr "묶ì ìì¶ ë¨ê³" + +# FIXME: graft? +#: builtin/pack-objects.c:2667 +msgid "do not hide commits by grafts" +msgstr "ë¶ì´ ìë 커ë°ì ì¨ê¸°ì§ ììµëë¤" + +#: builtin/pack-objects.c:2669 +msgid "use a bitmap index if available to speed up counting objects" +msgstr "ê°ë¥íë©´ ë¹í¸ë§µ ì¸ë±ì¤ë¥¼ ì¬ì©í´ ì¤ë¸ì í¸ ì¸ê¸° ìë를 ëì ëë¤" + +#: builtin/pack-objects.c:2671 +msgid "write a bitmap index together with the pack index" +msgstr "묶ì ì¸ë±ì¤ì ê°ì´ ë¹í¸ë§µ ì¸ë±ì¤ë¥¼ ìëë¤" + +#: builtin/pack-objects.c:2762 +msgid "Counting objects" +msgstr "ì¤ë¸ì í¸ ê°ì ì¸ë ì¤" + +#: builtin/pack-refs.c:6 +msgid "git pack-refs [<options>]" +msgstr "git pack-refs [<ìµì >]" + +#: builtin/pack-refs.c:14 +msgid "pack everything" +msgstr "모ë 묶ìµëë¤" + +#: builtin/pack-refs.c:15 +msgid "prune loose refs (default)" +msgstr "ëì¨í ë í¼ë°ì¤ë¥¼ ìë¼ë ëë¤ (기본ê°)" + +#: builtin/prune-packed.c:7 +msgid "git prune-packed [-n | --dry-run] [-q | --quiet]" +msgstr "git prune-packed [-n | --dry-run] [-q | --quiet]" + +#: builtin/prune-packed.c:40 +msgid "Removing duplicate objects" +msgstr "ì¤ë³µë ì¤ë¸ì í¸ ì ê±°" + +#: builtin/prune.c:11 +msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]" +msgstr "git prune [-n] [-v] [--expire <ìê°>] [--] [<í¤ë>...]" + +#: builtin/prune.c:105 builtin/worktree.c:124 +msgid "do not remove, show only" +msgstr "ì ê±°íì§ ìê³ , ë³´ì¬ì£¼ê¸°ë§ í©ëë¤" + +#: builtin/prune.c:106 builtin/worktree.c:125 +msgid "report pruned objects" +msgstr "ìë¼ë¸ ì¤ë¸ì í¸ë¥¼ ì립ëë¤" + +#: builtin/prune.c:109 builtin/worktree.c:127 +msgid "expire objects older than <time>" +msgstr "<ìê°>ë³´ë¤ ì¤ë ë ì¤ë¸ì í¸ê° ë§ë£ë©ëë¤" + +#: builtin/prune.c:123 +msgid "cannot prune in a precious-objects repo" +msgstr "precious-objects ì ì¥ììì ìë¼ë¼ ì ììµëë¤" + +#: builtin/pull.c:69 +msgid "git pull [<options>] [<repository> [<refspec>...]]" +msgstr "git pull [<ìµì >] [<ì ì¥ì> [<ë í¼ë°ì¤ëª ì¸>...]]" + +#: builtin/pull.c:113 +msgid "Options related to merging" +msgstr "ë³í© ê´ë ¨ ìµì " + +#: builtin/pull.c:116 +msgid "incorporate changes by rebasing rather than merging" +msgstr "ë³ê²½ ì¬íì ì ì©í ë ë³í©íë ëì ë¦¬ë² ì´ì¤í©ëë¤" + +#: builtin/pull.c:140 builtin/revert.c:105 +msgid "allow fast-forward" +msgstr "ì ë°©í¥ ì§íì íì©í©ëë¤" + +#: builtin/pull.c:146 +msgid "verify that the named commit has a valid GPG signature" +msgstr "ì§ì í 커ë°ì ì¬ë°ë¥¸ GPG ìëª ì´ ìëì§ ê²ì¦í©ëë¤" + +#: builtin/pull.c:160 +msgid "Options related to fetching" +msgstr "ê°ì ¸ì¤ê¸° ê´ë ¨ ìµì " + +#: builtin/pull.c:268 +#, c-format +msgid "Invalid value for pull.ff: %s" +msgstr "pull.ffì ëí´ ì못ë ê°: %s" + +#: builtin/pull.c:352 +msgid "Cannot pull with rebase: You have unstaged changes." +msgstr "ë¦¬ë² ì´ì¤ë¡ íì í ì ììµëë¤: ì¤í ì´ì§íì§ ìì ë³ê²½ ì¬íì´ ììµëë¤." + +#: builtin/pull.c:358 +msgid "Additionally, your index contains uncommitted changes." +msgstr "ì¶ê°ë¡, ì¸ë±ì¤ì 커ë°íì§ ìì ë³ê²½ ì¬íì´ ììµëë¤." + +#: builtin/pull.c:360 +msgid "Cannot pull with rebase: Your index contains uncommitted changes." +msgstr "ë¦¬ë² ì´ì¤ë¡ íì í ì ììµëë¤: ì¸ë±ì¤ì 커ë°íì§ ìì ë³ê²½ ì¬íì´ ììµëë¤." + +#: builtin/pull.c:436 +msgid "" +"There is no candidate for rebasing against among the refs that you just " +"fetched." +msgstr "ê°ì ¸ì¨ ë í¼ë°ì¤ ì¤ì ë¦¬ë² ì´ì¤í ëì íë³´ê° ììµëë¤." + +#: builtin/pull.c:438 +msgid "" +"There are no candidates for merging among the refs that you just fetched." +msgstr "ê°ì ¸ì¨ ë í¼ë°ì¤ ì¤ì ë³í©í ëì íë³´ê° ììµëë¤." + +#: builtin/pull.c:439 +msgid "" +"Generally this means that you provided a wildcard refspec which had no\n" +"matches on the remote end." +msgstr "" +"ë³´íµ ì´ë° ê²½ì°ë ë¦¬ëª¨í¸ ìª½ìë ìë ìì¼ëì¹´ë ë í¼ë°ì¤ëª ì¸ê°\n" +"주ì´ì¡ì ë ì¼ì´ë©ëë¤." + +#: builtin/pull.c:442 +#, c-format +msgid "" +"You asked to pull from the remote '%s', but did not specify\n" +"a branch. Because this is not the default configured remote\n" +"for your current branch, you must specify a branch on the command line." +msgstr "" +"ë¦¬ëª¨í¸ '%s'ìì íì ìì²íì§ë§, ë¸ëì¹ë¥¼ ì§ì íì§ ìììµëë¤.\n" +"ì´ ë¦¬ëª¨í¸ë íì¬ ë¸ëì¹ì ëí´ ê¸°ë³¸ì¼ë¡ ì¤ì ë 리모í¸ê°\n" +"ìë기 ë문ì, ëª ë ¹íìì ë¸ëì¹ë¥¼ ì§ì í´ì¼ í©ëë¤." + +#: builtin/pull.c:447 +msgid "You are not currently on a branch." +msgstr "íì¬ ì´ë¤ ë¸ëì¹ ììë ìì§ ììµëë¤." + +#: builtin/pull.c:449 builtin/pull.c:464 +msgid "Please specify which branch you want to rebase against." +msgstr "ì´ë¤ ë¸ëì¹ë¥¼ ëìì¼ë¡ ë¦¬ë² ì´ì¤í ì§ ì§ì íììì¤." + +#: builtin/pull.c:451 builtin/pull.c:466 +msgid "Please specify which branch you want to merge with." +msgstr "ì´ë¤ ë¸ëì¹ë¥¼ ëìì¼ë¡ ë³í©í ì§ ì§ì íììì¤." + +#: builtin/pull.c:452 builtin/pull.c:467 +msgid "See git-pull(1) for details." +msgstr "ìì¸í ì ë³´ë git-pull(1) íì´ì§ë¥¼ ì°¸ê³ íììì¤." + +#: builtin/pull.c:462 +msgid "There is no tracking information for the current branch." +msgstr "íì¬ ë¸ëì¹ì ì¶ì ì ë³´ê° ììµëë¤." + +#: builtin/pull.c:471 +#, c-format +msgid "" +"If you wish to set tracking information for this branch you can do so with:\n" +"\n" +" git branch --set-upstream-to=%s/<branch> %s\n" +msgstr "" +"ì´ ë¸ëì¹ì ëí ì¶ì ì 보를 ì¤ì íë ¤ë©´ ë¤ìê³¼ ê°ì´ í ì ììµëë¤:\n" +"\n" +" git branch --set-upstream-to=%s/<ë¸ëì¹> %s\n" + +#: builtin/pull.c:476 +#, c-format +msgid "" +"Your configuration specifies to merge with the ref '%s'\n" +"from the remote, but no such ref was fetched." +msgstr "" +"ì¤ì ìì 리모í¸ì '%s' ë í¼ë°ì¤ì ë³í©íëë¡ ì§ì íì§ë§,\n" +"ê·¸ë° ë í¼ë°ì¤ë¥¼ ê°ì ¸ì¤ì§ ìììµëë¤." + +#: builtin/pull.c:830 +msgid "Updating an unborn branch with changes added to the index." +msgstr "ë§ë¤ì´ì§ì§ ìì ë¸ëì¹ë¥¼ ì¸ë±ì¤ì ì¶ê°ë ë³ê²½ ì¬íì¼ë¡ ì ë°ì´í¸í©ëë¤." + +#: builtin/pull.c:859 +#, c-format +msgid "" +"fetch updated the current branch head.\n" +"fast-forwarding your working tree from\n" +"commit %s." +msgstr "" +"íì¬ ë¸ëì¹ í¤ë를 ì ë°ì´í¸íìµëë¤.\n" +"ìì í´ë를 %s 커ë°ìì ì ë°©í¥\n" +"ì§íí©ëë¤." + +#: builtin/pull.c:864 +#, c-format +msgid "" +"Cannot fast-forward your working tree.\n" +"After making sure that you saved anything precious from\n" +"$ git diff %s\n" +"output, run\n" +"$ git reset --hard\n" +"to recover." +msgstr "" +"ìì í´ë를 ì ë°©í¥ ì§íí ì ììµëë¤.\n" +"ë¤ì ëª ë ¹ ì¶ë ¥ìì ì¤ìí ì¬íì ì ì¥í ë¤ì,\n" +"$ git diff %s\n" +"ë¤ìì ì¤ííë©´\n" +"$ git reset --hard\n" +"복구ë©ëë¤." + +#: builtin/pull.c:879 +msgid "Cannot merge multiple branches into empty head." +msgstr "ì¬ë¬ ë¸ëì¹ë¥¼ ë¹ í¤ëë¡ ë³í©í ì ììµëë¤." + +#: builtin/pull.c:883 +msgid "Cannot rebase onto multiple branches." +msgstr "ì¬ë¬ ë¸ëì¹ë¡ ë¦¬ë² ì´ì¤í ì ììµëë¤." + +#: builtin/push.c:16 +msgid "git push [<options>] [<repository> [<refspec>...]]" +msgstr "git push [<ìµì >] [<ì ì¥ì> [<ë í¼ë°ì¤ëª ì¸>...]]" + +#: builtin/push.c:88 +msgid "tag shorthand without <tag>" +msgstr "<íê·¸> ìì´ íê·¸ ì¤ì" + +#: builtin/push.c:98 +msgid "--delete only accepts plain target ref names" +msgstr "--delete ìµì ì ì¼ë° ëì ë í¼ë°ì¤ ì´ë¦ë§ ë°ìµëë¤" + +#: builtin/push.c:142 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "\nì´ë í 쪽 ìµì ë§ ê³ì ì ííë ¤ë©´, 'git help config'ìì push.default를 ì°¸ê³ íììì¤." + +#: builtin/push.c:145 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" +"íì¬ ë¸ëì¹ì ì ì¤í¸ë¦¼ ë¸ëì¹ê° íì¬ ë¸ëì¹ì ì´ë¦ê³¼\n" +"ê°ì§ ììµëë¤. 리모í¸ì ì ì¤í¸ë¦¼ ë¸ëì¹ë¡ í¸ìíë ¤ë©´\n" +"ë¤ìê³¼ ê°ì´ íììì¤.\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"리모í¸ì ê°ì ì´ë¦ì¼ë¡ í¸ìíë ¤ë©´ ë¤ìê³¼ ê°ì´ íììì¤.\n" +"\n" +" git push %s %s\n" +"%s" + +#: builtin/push.c:160 +#, c-format +msgid "" +"You are not currently on a branch.\n" +"To push the history leading to the current (detached HEAD)\n" +"state now, use\n" +"\n" +" git push %s HEAD:<name-of-remote-branch>\n" +msgstr "" +"íì¬ ì´ë¤ ë¸ëì¹ ììë ìì§ ììµëë¤.\n" +"ì§ê¸ íì¬ (HEAD ë¶ë¦¬) ìíê¹ì§ì ì»¤ë° ë´ìì í¸ìíë ¤ë©´\n" +"ë¤ìê³¼ ê°ì´ íììì¤.\n" +"\n" +" git push %s HEAD:<name-of-remote-branch>\n" + +#: builtin/push.c:174 +#, c-format +msgid "" +"The current branch %s has no upstream branch.\n" +"To push the current branch and set the remote as upstream, use\n" +"\n" +" git push --set-upstream %s %s\n" +msgstr "" +"íì¬ ë¸ëì¹ %sì ì ì¤í¸ë¦¼ ë¸ëì¹ê° ììµëë¤.\n" +"íì¬ ë¸ëì¹ë¥¼ í¸ìíê³ í´ë¹ 리모í¸ë¥¼ ì ì¤í¸ë¦¼ì¼ë¡ ì§ì íë ¤ë©´\n" +"ë¤ìê³¼ ê°ì´ íììì¤.\n" +"\n" +" git push --set-upstream %s %s\n" + +#: builtin/push.c:182 +#, c-format +msgid "The current branch %s has multiple upstream branches, refusing to push." +msgstr "íì¬ ë¸ëì¹ %sì ì¬ë¬ ì ì¤í¸ë¦¼ ë¸ëì¹ê° ììµëë¤. í¸ì를 ê±°ì í©ëë¤." + +#: builtin/push.c:185 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" +"'%s' 리모í¸ë¡ í¸ìíë ì¤ì ëë¤. íì§ë§ ì´ ë¦¬ëª¨í¸ë íì¬\n" +"'%s' ë¸ëì¹ì ì ì¤í¸ë¦¼ì´ ìëëë¤. ì´ë¤ ë¦¬ëª¨í¸ ë¸ëì¹ì 무ìì\n" +"í¸ìí ì§ ì¤ì íì§ ìììµëë¤." + +#: builtin/push.c:208 +msgid "" +"push.default is unset; its implicit value has changed in\n" +"Git 2.0 from 'matching' to 'simple'. To squelch this message\n" +"and maintain the traditional behavior, use:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"To squelch this message and adopt the new behavior now, use:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"When push.default is set to 'matching', git will push local branches\n" +"to the remote branches that already exist with the same name.\n" +"\n" +"Since Git 2.0, Git defaults to the more conservative 'simple'\n" +"behavior, which only pushes the current branch to the corresponding\n" +"remote branch that 'git pull' uses to update the current branch.\n" +"\n" +"See 'git help config' and search for 'push.default' for further " +"information.\n" +"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n" +"'current' instead of 'simple' if you sometimes use older versions of Git)" +msgstr "" +"push.default를 ì¤ì íì§ ìììµëë¤. 묵ìì ê°ì ê¹ 2.0ìì\n" +"'matching'ìì 'simple'ë¡ ë°ëììµëë¤. ì´ ë©ìì§ë¥¼ íìíì§\n" +"ìê³ ê³¼ê±°ì ëìì ì ì§íë ¤ë©´ ë¤ìê³¼ ê°ì´ íììì¤:\n" +"\n" +" git config --global push.default matching\n" +"\n" +"ì´ ë©ìì§ë¥¼ íìíì§ ìê³ ì ëìì ë°ìë¤ì´ë ¤ë©´ ë¤ìê³¼ ê°ì´\n" +"íììì¤:\n" +"\n" +" git config --global push.default simple\n" +"\n" +"push.defaultê° 'matching'ì¼ë¡ ì¤ì ëë©´, ë¡ì»¬ ë¸ëì¹ë¥¼ ì´ë¯¸ ê°ì ì´ë¦ì´\n" +"ìë ë¦¬ëª¨í¸ ë¸ëì¹ë¡ í¸ìí©ëë¤.\n" +"\n" +"ê¹ 2.0ë¶í° ë ë³´ìì ì¸ 'simple' ëìì´ ê¸°ë³¸ê°ì ëë¤. ì¬ê¸°ìë íì¬\n" +"ë¸ëì¹ë¥¼ 'git pull'ìì íì¬ ë¸ëì¹ë¥¼ ì ë°ì´í¸í ë ì¬ì©íë í´ë¹\n" +"ë¦¬ëª¨í¸ ë¸ëì¹ë¡ í¸ìí©ëë¤.\n" +"\n" +"ë ìì¸í ì ë³´ë 'git help config'ìì 'push.default' ì¤ëª ì ë³´ììì¤.\n" +"('simple' 모ëë ê¹ 1.7.11ì ì¶ê°ëììµëë¤. 과거 ë²ì ì ê¹ì ì¬ì©íê²\n" +"ëë©´ ë¹ì·í 'current' 모ë를 ì¬ì©íììì¤.)" + +#: builtin/push.c:275 +msgid "" +"You didn't specify any refspecs to push, and push.default is \"nothing\"." +msgstr "í¸ìí ë í¼ë°ì¤ëª ì¸ë¥¼ ì§ì íì§ ììê³ , push.default ê°ì´ 'nothing'ì ëë¤." + +#: builtin/push.c:282 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Integrate the remote changes (e.g.\n" +"'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"íì¬ ë¸ëì¹ì ëì´ ë¦¬ëª¨í¸ ë¸ëì¹ë³´ë¤ ë¤ì ìì¼ë¯ë¡ ì ë°ì´í¸ê°\n" +"ê±°ë¶ëììµëë¤. í¸ìí기 ì ì ('git pull ...' ë± ëª ë ¹ì¼ë¡) 리모í¸\n" +"ë³ê²½ ì¬íì í¬í¨íììì¤.\n" +"ìì¸í ì ë³´ë 'git push --help'ì \"Note about fast-forwards' ë¶ë¶ì\n" +"ì°¸ê³ íììì¤." + +#: builtin/push.c:288 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and integrate the remote changes\n" +"(e.g. 'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"íì¬ ë¸ëì¹ì ëì´ ë¦¬ëª¨í¸ ë¸ëì¹ë³´ë¤ ë¤ì ìì¼ë¯ë¡ ì ë°ì´í¸ê°\n" +"ê±°ë¶ëììµëë¤. ì´ ë¸ëì¹ë¥¼ ì²´í¬ììíê³ í¸ìí기 ì ì\n" +"('git pull ...' ë± ëª ë ¹ì¼ë¡) ë¦¬ëª¨í¸ ë³ê²½ ì¬íì í¬í¨íììì¤.\n" +"ìì¸í ì ë³´ë 'git push --help'ì \"Note about fast-forwards' ë¶ë¶ì\n" +"ì°¸ê³ íììì¤." + +#: builtin/push.c:294 +msgid "" +"Updates were rejected because the remote contains work that you do\n" +"not have locally. This is usually caused by another repository pushing\n" +"to the same ref. You may want to first integrate the remote changes\n" +"(e.g., 'git pull ...') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"리모í¸ì ë¡ì»¬ì ìë ì¬íì´ ë¤ì´ ìì¼ë¯ë¡ ì ë°ì´í¸ê°\n" +"ê±°ë¶ëììµëë¤. ì´ ìí©ì ë³´íµ ë ë¤ë¥¸ ì ì¥ììì ê°ì\n" +"ì ì¥ìë¡ í¸ìí ë ë°ìí©ëë¤. í¸ìí기 ì ì\n" +"('git pull ...' ë± ëª ë ¹ì¼ë¡) ë¦¬ëª¨í¸ ë³ê²½ ì¬íì 먼ì \n" +"í¬í¨í´ì¼ í©ëë¤.\n" +"ìì¸í ì ë³´ë 'git push --help'ì \"Note about fast-forwards' ë¶ë¶ì\n" +"ì°¸ê³ íììì¤." + +#: builtin/push.c:301 +msgid "Updates were rejected because the tag already exists in the remote." +msgstr "리모í¸ì íê·¸ê° ì´ë¯¸ ì기 ë문ì ì ë°ì´í¸ê° ê±°ë¶ëììµëë¤." + +#: builtin/push.c:304 +msgid "" +"You cannot update a remote ref that points at a non-commit object,\n" +"or update a remote ref to make it point at a non-commit object,\n" +"without using the '--force' option.\n" +msgstr "" +"'--force' ìµì ì´ ìì´ ì»¤ë°ì´ ìë ì¤ë¸ì í¸ë¥¼ ê°ë¦¬í¤ë 리모í¸\n" +"ë í¼ë°ì¤ë¥¼ ì ë°ì´í¸íê±°ë, 커ë°ì´ ìë ì¤ë¸ì í¸ë¥¼ ê°ë¦¬í¤ëë¡\n" +"ì ë°ì´í¸í ì ììµëë¤.\n" + +#: builtin/push.c:363 +#, c-format +msgid "Pushing to %s\n" +msgstr "ë¤ìì í¸ì: %s\n" + +#: builtin/push.c:367 +#, c-format +msgid "failed to push some refs to '%s'" +msgstr "ë í¼ë°ì¤ë¥¼ '%s'ì í¸ìíëë° ì¤í¨íìµëë¤" + +#: builtin/push.c:397 +#, c-format +msgid "bad repository '%s'" +msgstr "ì못ë ì ì¥ì '%s'" + +#: builtin/push.c:398 +msgid "" +"No configured push destination.\n" +"Either specify the URL from the command-line or configure a remote " +"repository using\n" +"\n" +" git remote add <name> <url>\n" +"\n" +"and then push using the remote name\n" +"\n" +" git push <name>\n" +msgstr "" +"í¸ì ëìì ì¤ì íì§ ìììµëë¤.\n" +"ëª ë ¹í´ìì URLì ì§ì íê±°ë ë¤ìì ì¬ì©í´ ë¦¬ëª¨í¸ ì ì¥ì를 ì¤ì íììì¤\n" +"\n" +" git remote add <ì´ë¦> <URL>\n" +"\n" +"ê·¸ë¦¬ê³ ì´ ë¦¬ëª¨í¸ ì´ë¦ì ì¬ì©í´ í¸ìíììì¤\n" +"\n" +" git push <name>\n" + +#: builtin/push.c:413 +msgid "--all and --tags are incompatible" +msgstr "--all ë° --tags ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/push.c:414 +msgid "--all can't be combined with refspecs" +msgstr "--all ìµì ì ë í¼ë°ì¤ëª ì¸ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/push.c:419 +msgid "--mirror and --tags are incompatible" +msgstr "--mirror ë° --tags ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/push.c:420 +msgid "--mirror can't be combined with refspecs" +msgstr "--mirror ìµì ì ë í¼ë°ì¤ëª ì¸ì ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/push.c:425 +msgid "--all and --mirror are incompatible" +msgstr "--all ë° --mirror ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/push.c:537 +msgid "repository" +msgstr "ì ì¥ì" + +#: builtin/push.c:538 builtin/send-pack.c:161 +msgid "push all refs" +msgstr "모ë ë í¼ë°ì¤ í¸ìí기" + +#: builtin/push.c:539 builtin/send-pack.c:163 +msgid "mirror all refs" +msgstr "모ë ë í¼ë°ì¤ 미ë¬" + +#: builtin/push.c:541 +msgid "delete refs" +msgstr "ë í¼ë°ì¤ ìì " + +#: builtin/push.c:542 +msgid "push tags (can't be used with --all or --mirror)" +msgstr "íê·¸ í¸ìí기 (--all ëë --mirror ìµì ê³¼ ê°ì´ ì¸ ì ìì)" + +#: builtin/push.c:545 builtin/send-pack.c:164 +msgid "force updates" +msgstr "ê°ì ë¡ ì ë°ì´í¸" + +#: builtin/push.c:547 builtin/send-pack.c:175 +msgid "refname>:<expect" +msgstr "ë í¼ë°ì¤ì´ë¦>:<ìì" + +#: builtin/push.c:548 builtin/send-pack.c:176 +msgid "require old value of ref to be at this value" +msgstr "ë í¼ë°ì¤ì 과거 ê°ì´ ì´ ê°ì´ì´ì¼ í©ëë¤" + +#: builtin/push.c:550 +msgid "check|on-demand|no" +msgstr "check|on-demand|no" + +#: builtin/push.c:551 +msgid "control recursive pushing of submodules" +msgstr "ì¬ê·ì íì 모ë í¸ì ë°©ìì ì¤ì í©ëë¤" + +#: builtin/push.c:553 builtin/send-pack.c:169 +msgid "use thin pack" +msgstr "ìì 묶ìì ì¬ì©í©ëë¤" + +#: builtin/push.c:554 builtin/push.c:555 builtin/send-pack.c:158 +#: builtin/send-pack.c:159 +msgid "receive pack program" +msgstr "receive pack íë¡ê·¸ë¨" + +#: builtin/push.c:556 +msgid "set upstream for git pull/status" +msgstr "git pull/statusì ëí ì ì¤í¸ë¦¼ì ì¤ì í©ëë¤" + +#: builtin/push.c:559 +msgid "prune locally removed refs" +msgstr "ë¡ì»¬ìì ì ê±°í ë í¼ë°ì¤ë¥¼ ìë¼ë ëë¤" + +#: builtin/push.c:561 +msgid "bypass pre-push hook" +msgstr "í¸ì ì íí¬ë¥¼ ê±´ëëëë¤" + +#: builtin/push.c:562 +msgid "push missing but relevant tags" +msgstr "ë¹ ì¡ì§ë§ ê´ë ¨ë í그를 í¸ìí©ëë¤" + +#: builtin/push.c:565 builtin/send-pack.c:166 +msgid "GPG sign the push" +msgstr "í¸ìì GPG ìëª " + +#: builtin/push.c:567 builtin/send-pack.c:170 +msgid "request atomic transaction on remote side" +msgstr "ë¦¬ëª¨í¸ ìª½ì ìì í¸ëìì ì ìì²í©ëë¤" + +#: builtin/push.c:577 +msgid "--delete is incompatible with --all, --mirror and --tags" +msgstr "--delete ìµì ì --all, --mirror, --tags ìµì ê³¼ í¸íëì§ ììµëë¤" + +#: builtin/push.c:579 +msgid "--delete doesn't make sense without any refs" +msgstr "--delete ìµì ì ë í¼ë°ì¤ ìì´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/read-tree.c:37 +msgid "" +"git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) " +"[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--" +"index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])" +msgstr "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<ì ëì´>) [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<íì¼>] (--empty | <í¸ë¦¬-ë°ì> [<í¸ë¦¬-ë°ì2> [<í¸ë¦¬-ë°ì3>]])" + +#: builtin/read-tree.c:110 +msgid "write resulting index to <file>" +msgstr "ê²°ê³¼ ì¸ë±ì¤ë¥¼ <íì¼>ì ìëë¤" + +#: builtin/read-tree.c:113 +msgid "only empty the index" +msgstr "ì¸ë±ì¤ë¥¼ ë¹ì°ê¸°ë§ í©ëë¤" + +#: builtin/read-tree.c:115 +msgid "Merging" +msgstr "ë³í©í기" + +#: builtin/read-tree.c:117 +msgid "perform a merge in addition to a read" +msgstr "ì½ì ë¤ì ë³í©ì ìíí©ëë¤" + +#: builtin/read-tree.c:119 +msgid "3-way merge if no file level merging required" +msgstr "íì¼ ë¨ì ë³í©ì´ íìíì§ ìì¼ë©´ 3-ë°©í¥ ë³í©ì í©ëë¤" + +#: builtin/read-tree.c:121 +msgid "3-way merge in presence of adds and removes" +msgstr "ì¶ê°ì ì ê±°ê° ìì ë 3-ë°©í¥ ë³í©ì í©ëë¤" + +#: builtin/read-tree.c:123 +msgid "same as -m, but discard unmerged entries" +msgstr "-mê³¼ ëì¼íì§ë§, ë³í©ëì§ ìì í목ì ë²ë¦½ëë¤" + +#: builtin/read-tree.c:124 +msgid "<subdirectory>/" +msgstr "<íìëë í°ë¦¬>/" + +#: builtin/read-tree.c:125 +msgid "read the tree into the index under <subdirectory>/" +msgstr "í¸ë¦¬ë¥¼ <íìëë í°ë¦¬>/ ìë ì¸ë±ì¤ë¡ ì½ìµëë¤" + +#: builtin/read-tree.c:128 +msgid "update working tree with merge result" +msgstr "ìì í´ë를 ë³í© ê²°ê³¼ë¡ ì ë°ì´í¸í©ëë¤" + +#: builtin/read-tree.c:130 +msgid "gitignore" +msgstr "gitignore" + +#: builtin/read-tree.c:131 +msgid "allow explicitly ignored files to be overwritten" +msgstr "무ìíë íì¼ì ë®ì´ì°ëë¡ ëª ìì ì¼ë¡ íì©í©ëë¤" + +#: builtin/read-tree.c:134 +msgid "don't check the working tree after merging" +msgstr "ë³í© íì ìì í´ë를 íì¸íì§ ììµëë¤" + +#: builtin/read-tree.c:135 +msgid "don't update the index or the work tree" +msgstr "ì¸ë±ì¤ë ìì í´ë를 ì ë°ì´í¸íì§ ììµëë¤" + +#: builtin/read-tree.c:137 +msgid "skip applying sparse checkout filter" +msgstr "ë문 ì²´í¬ìì íí° ì ì©ì ê±´ëëëë¤" + +#: builtin/read-tree.c:139 +msgid "debug unpack-trees" +msgstr "unpack-trees ëë²ê¹ " + +#: builtin/reflog.c:428 +#, c-format +msgid "'%s' for '%s' is not a valid timestamp" +msgstr "'%s' ê°ì´ '%s'ì ëí´ ì¬ë°ë¥¸ ìê° ê°ì´ ìëëë¤" + +#: builtin/reflog.c:545 builtin/reflog.c:550 +#, c-format +msgid "'%s' is not a valid timestamp" +msgstr "'%s'ì(ë) ì¬ë°ë¥¸ ìê° ê°ì´ ìëëë¤" + +#: builtin/remote.c:12 +msgid "git remote [-v | --verbose]" +msgstr "git remote [-v | --verbose]" + +#: builtin/remote.c:13 +msgid "" +"git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--" +"mirror=<fetch|push>] <name> <url>" +msgstr "" +"git remote add [-t <ë¸ëì¹>] [-m <master>] [-f] [--tags | --no-tags] [--" +"mirror=<fetch|push>] <ì´ë¦> <url>" + +#: builtin/remote.c:14 builtin/remote.c:34 +msgid "git remote rename <old> <new>" +msgstr "git remote rename <ìì´ë¦> <ìì´ë¦>" + +#: builtin/remote.c:15 builtin/remote.c:39 +msgid "git remote remove <name>" +msgstr "git remote remove <ì´ë¦>" + +#: builtin/remote.c:16 builtin/remote.c:44 +msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)" +msgstr "git remote set-head <ì´ë¦> (-a | --auto | -d | --delete | <ë¸ëì¹>)" + +#: builtin/remote.c:17 +msgid "git remote [-v | --verbose] show [-n] <name>" +msgstr "git remote [-v | --verbose] show [-n] <ì´ë¦>" + +#: builtin/remote.c:18 +msgid "git remote prune [-n | --dry-run] <name>" +msgstr "git remote prune [-n | --dry-run] <ì´ë¦>" + +#: builtin/remote.c:19 +msgid "" +"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]" +msgstr "" +"git remote [-v | --verbose] update [-p | --prune] [(<그룹> | <리모í¸>)...]" + +#: builtin/remote.c:20 +msgid "git remote set-branches [--add] <name> <branch>..." +msgstr "git remote set-branches [--add] <ì´ë¦> <ë¸ëì¹>..." + +#: builtin/remote.c:21 builtin/remote.c:70 +msgid "git remote get-url [--push] [--all] <name>" +msgstr "git remote get-url [--push] [--all] <ì´ë¦>" + +#: builtin/remote.c:22 builtin/remote.c:75 +msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]" +msgstr "git remote set-url [--push] <ì´ë¦> <ìurl> [<ìurl>]" + +#: builtin/remote.c:23 builtin/remote.c:76 +msgid "git remote set-url --add <name> <newurl>" +msgstr "git remote set-url --add <ì´ë¦> <ìurl>" + +#: builtin/remote.c:24 builtin/remote.c:77 +msgid "git remote set-url --delete <name> <url>" +msgstr "git remote set-url --delete <ì´ë¦> <url>" + +#: builtin/remote.c:29 +msgid "git remote add [<options>] <name> <url>" +msgstr "git remote add [<ìµì >] <ì´ë¦> <url>" + +#: builtin/remote.c:49 +msgid "git remote set-branches <name> <branch>..." +msgstr "git remote set-branches <ì´ë¦> <ë¸ëì¹>..." + +#: builtin/remote.c:50 +msgid "git remote set-branches --add <name> <branch>..." +msgstr "git remote set-branches --add <ì´ë¦> <ë¸ëì¹>..." + +#: builtin/remote.c:55 +msgid "git remote show [<options>] <name>" +msgstr "git remote show [<ìµì >] <ì´ë¦>" + +#: builtin/remote.c:60 +msgid "git remote prune [<options>] <name>" +msgstr "git remote prune [<ìµì >] <ì´ë¦>" + +#: builtin/remote.c:65 +msgid "git remote update [<options>] [<group> | <remote>]..." +msgstr "git remote update [<ìµì >] [<그룹> | <리모í¸>]..." + +#: builtin/remote.c:94 +#, c-format +msgid "Updating %s" +msgstr "%s ì ë°ì´í¸ ì¤" + +#: builtin/remote.c:126 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"--mirrorë ìííë¯ë¡ ì¬ì©ì ê¶íì§ ììµëë¤. ëì ì\n" +"\t --mirror=fetch ëë --mirror=push를 ì¬ì©íììì¤" + +#: builtin/remote.c:143 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "ì ì ìë --mirror ìµì ì¸ì: %s" + +#: builtin/remote.c:159 +msgid "fetch the remote branches" +msgstr "ë¦¬ëª¨í¸ ë¸ëì¹ë¥¼ ê°ì ¸ìµëë¤" + +#: builtin/remote.c:161 +msgid "import all tags and associated objects when fetching" +msgstr "ê°ì ¸ì¬ ë 모ë íê·¸ì ê´ë ¨ ì¤ë¸ì í¸ë¥¼ ê°ì ¸ìµëë¤" + +#: builtin/remote.c:164 +msgid "or do not fetch any tag at all (--no-tags)" +msgstr "ìëë©´ ì무 íê·¸ë ê°ì ¸ì¤ì§ ììµëë¤ (--no-tags)" + +#: builtin/remote.c:166 +msgid "branch(es) to track" +msgstr "ì¶ì í ë¸ëì¹" + +#: builtin/remote.c:167 +msgid "master branch" +msgstr "ë§ì¤í° ë¸ëì¹" + +#: builtin/remote.c:168 +msgid "push|fetch" +msgstr "push|fetch" + +#: builtin/remote.c:169 +msgid "set up remote as a mirror to push to or fetch from" +msgstr "리모í¸ë¥¼ í¸ì ëë ê°ì ¸ì¬ ë ì¬ì©í 미ë¬ë¡ ì¤ì í©ëë¤" + +#: builtin/remote.c:181 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "--mirror ìµì ê³¼ ê°ì´ ë§ì¤í° ë¸ëì¹ë¥¼ ì§ì íë©´ ìë¤ê° ë§ì§ ììµëë¤" + +#: builtin/remote.c:183 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "ë§ì¤í° ë¸ëì¹ë¥¼ ì§ì ì fetch 미ë¬ììë§ ìë¤ê° ë§ìµëë¤" + +#: builtin/remote.c:193 builtin/remote.c:643 +#, c-format +msgid "remote %s already exists." +msgstr "%s 리모í¸ê° ì´ë¯¸ ììµëë¤." + +#: builtin/remote.c:197 builtin/remote.c:647 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "'%s'ì(ë) ì¬ë°ë¥¸ ë¦¬ëª¨í¸ ì´ë¦ì´ ìëëë¤" + +#: builtin/remote.c:241 +#, c-format +msgid "Could not setup master '%s'" +msgstr "ë§ì¤í° '%s'ì(를) ì¤ì í ì ììµëë¤" + +#: builtin/remote.c:341 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "%s ë í¼ë°ì¤ëª ì¸ì ëí ê°ì ¸ì¤ê¸° 맵ì ì»ì ì ììµëë¤" + +#: builtin/remote.c:442 builtin/remote.c:450 +msgid "(matching)" +msgstr "(ì¼ì¹)" + +#: builtin/remote.c:454 +msgid "(delete)" +msgstr "(ìì )" + +#: builtin/remote.c:594 builtin/remote.c:600 builtin/remote.c:606 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "'%s'ì(를) '%s'ì ì¶ê°í ì ììµëë¤" + +#: builtin/remote.c:636 builtin/remote.c:775 builtin/remote.c:875 +#, c-format +msgid "No such remote: %s" +msgstr "ê·¸ë° ë¦¬ëª¨í¸ê° ììµëë¤: %s" + +#: builtin/remote.c:653 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "ì¤ì ì¹ì ì '%s'ìì '%s'(ì¼)ë¡ ë°ê¿ ì ììµëë¤" + +#: builtin/remote.c:659 builtin/remote.c:827 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "ì¤ì ì¹ì '%s'ì(를) ì ê±°í ì ììµëë¤" + +#: builtin/remote.c:674 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" +"기본ê°ì´ ìë ê°ì ¸ì¤ê¸° ë í¼ë°ì¤ëª ì¸ë¥¼ ì ë°ì´í¸íì§ ììµëë¤\n" +"\t%s\n" +"\tíìíë©´ ì¤ì ì ìëì¼ë¡ ì ë°ì´í¸íììì¤." + +#: builtin/remote.c:680 +#, c-format +msgid "Could not append '%s'" +msgstr "'%s'ì ë§ë¶ì¼ ì ììµëë¤" + +#: builtin/remote.c:691 +#, c-format +msgid "Could not set '%s'" +msgstr "'%s'ì(를) ì¤ì í ì ììµëë¤" + +#: builtin/remote.c:713 +#, c-format +msgid "deleting '%s' failed" +msgstr "'%s' ìì ê° ì¤í¨íìµëë¤" + +#: builtin/remote.c:747 +#, c-format +msgid "creating '%s' failed" +msgstr "'%s' ë§ë¤ê¸°ê° ì¤í¨íìµëë¤" + +#: builtin/remote.c:813 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +"ì림: ë í¼ë°ì¤/리모í¸/ ê³ì¸µ 구조 ë°ì ìë ì¼ë¶ ë¸ëì¹ê° ì ê±°ëì§ ìììµëë¤.\n" +"ìì íë ¤ë©´ ë¤ìì ì¬ì©íììì¤:" + +#: builtin/remote.c:928 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr " ì í목 (ë¤ì ê°ì ¸ì¤ê¸°ë remotes/%s ìë ì ì¥ë©ëë¤)" + +#: builtin/remote.c:931 +msgid " tracked" +msgstr " ì¶ì ë¨" + +#: builtin/remote.c:933 +msgid " stale (use 'git remote prune' to remove)" +msgstr " ì¤ëë¨ (ì ê±°íë ¤ë©´ 'git remote prune'ì ì¬ì©íììì¤)" + +#: builtin/remote.c:935 +msgid " ???" +msgstr " ???" + +#: builtin/remote.c:976 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "ì못ë branch.%s.merge ê°. ì¬ë¬ ê° ë¸ëì¹ë¡ ë¦¬ë² ì´ì¤í ì ììµëë¤" + +#: builtin/remote.c:983 +#, c-format +msgid "rebases onto remote %s" +msgstr "ë¦¬ë² ì´ì¤: ë¦¬ëª¨í¸ %s" + +#: builtin/remote.c:986 +#, c-format +msgid " merges with remote %s" +msgstr " ë³í©: ë¦¬ëª¨í¸ %s" + +#: builtin/remote.c:987 +msgid " and with remote" +msgstr " ê·¸ë¦¬ê³ ë¦¬ëª¨í¸" + +#: builtin/remote.c:989 +#, c-format +msgid "merges with remote %s" +msgstr "ë³í©: ë¦¬ëª¨í¸ %s" + +#: builtin/remote.c:990 +msgid " and with remote" +msgstr " ê·¸ë¦¬ê³ ë¦¬ëª¨í¸" + +#: builtin/remote.c:1036 +msgid "create" +msgstr "ë§ë¤ê¸°" + +#: builtin/remote.c:1039 +msgid "delete" +msgstr "ìì " + +#: builtin/remote.c:1043 +msgid "up to date" +msgstr "ìµì ìí" + +#: builtin/remote.c:1046 +msgid "fast-forwardable" +msgstr "ì ë°©í¥ ì§í ê°ë¥" + +#: builtin/remote.c:1049 +msgid "local out of date" +msgstr "ë¡ì»¬ì´ ë¤ë¨ì´ì§" + +#: builtin/remote.c:1056 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr " %-*sìì %-*s(ì¼)ë¡ ê°ì (%s)" + +#: builtin/remote.c:1059 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr " %-*sìì %-*s(ì¼)ë¡ í¸ì (%s)" + +#: builtin/remote.c:1063 +#, c-format +msgid " %-*s forces to %s" +msgstr " %-*sìì %s(ì¼)ë¡ ê°ì " + +#: builtin/remote.c:1066 +#, c-format +msgid " %-*s pushes to %s" +msgstr " %-*sìì %s(ì¼)ë¡ í¸ì" + +#: builtin/remote.c:1134 +msgid "do not query remotes" +msgstr "리모í¸ì ì§ìíì§ ììµëë¤" + +#: builtin/remote.c:1161 +#, c-format +msgid "* remote %s" +msgstr "* ë¦¬ëª¨í¸ %s" + +#: builtin/remote.c:1162 +#, c-format +msgid " Fetch URL: %s" +msgstr " ê°ì ¸ì¤ê¸° URL: %s" + +#: builtin/remote.c:1163 builtin/remote.c:1314 +msgid "(no URL)" +msgstr "(URL ìì)" + +#: builtin/remote.c:1172 builtin/remote.c:1174 +#, c-format +msgid " Push URL: %s" +msgstr " í¸ì URL: %s" + +#: builtin/remote.c:1176 builtin/remote.c:1178 builtin/remote.c:1180 +#, c-format +msgid " HEAD branch: %s" +msgstr " HEAD ë¸ëì¹: %s" + +#: builtin/remote.c:1182 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr " HEAD ë¸ëì¹ (ë¦¬ëª¨í¸ HEADë ì 매íê³ , ë¤ì ì¤ íëì¼ ì ììµëë¤):\n" + +#: builtin/remote.c:1194 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " ë¦¬ëª¨í¸ ë¸ëì¹:%s" + +#: builtin/remote.c:1197 builtin/remote.c:1224 +msgid " (status not queried)" +msgstr " (ìí를 ì§ìíì§ ìì)" + +#: builtin/remote.c:1206 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " 'git pull'ì ì¬ì©í ë¡ì»¬ ë¸ëì¹ë¥¼ ì¤ì :" + +#: builtin/remote.c:1214 +msgid " Local refs will be mirrored by 'git push'" +msgstr " ë¡ì»¬ ë í¼ë°ì¤ë¥¼ 'git push'ë¡ ë¯¸ë¬ë§í ìì " + +#: builtin/remote.c:1221 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] " ë¡ì»¬ ë í¼ë°ì¤ë¥¼ 'git push'ë¡ ë¯¸ë¬ë§%s:" + +#: builtin/remote.c:1242 +msgid "set refs/remotes/<name>/HEAD according to remote" +msgstr "ë í¼ë°ì¤/리모í¸/<ì´ë¦>/HEAD ê°ì 리모í¸ì ë§ê² ì¤ì í©ëë¤" + +#: builtin/remote.c:1244 +msgid "delete refs/remotes/<name>/HEAD" +msgstr "ë í¼ë°ì¤/리모í¸/<ì´ë¦>/HEAD ê°ì ìì í©ëë¤" + +#: builtin/remote.c:1259 +msgid "Cannot determine remote HEAD" +msgstr "ë¦¬ëª¨í¸ HEAD를 ê²°ì í ì ììµëë¤" + +#: builtin/remote.c:1261 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "ë¦¬ëª¨í¸ HEAD ë¸ëì¹ê° ì¬ë¬ê°ì ëë¤. ë¤ì ì¤ íë를 ëª ìì ì¼ë¡ ì§ì íììì¤:" + +#: builtin/remote.c:1271 +#, c-format +msgid "Could not delete %s" +msgstr "%sì(를) ìì í ì ììµëë¤" + +#: builtin/remote.c:1279 +#, c-format +msgid "Not a valid ref: %s" +msgstr "ì¬ë°ë¥¸ ë í¼ë°ì¤ê° ìëëë¤: %s" + +#: builtin/remote.c:1281 +#, c-format +msgid "Could not setup %s" +msgstr "%sì(를) ì¤ì í ì ììµëë¤" + +#: builtin/remote.c:1299 +#, c-format +msgid " %s will become dangling!" +msgstr " %sì ì°ê²°ì´ ëì´ì§ëë¤!" + +#: builtin/remote.c:1300 +#, c-format +msgid " %s has become dangling!" +msgstr " %sì ì°ê²°ì´ ëì´ì¡ìµëë¤!" + +#: builtin/remote.c:1310 +#, c-format +msgid "Pruning %s" +msgstr "ìë¼ë: %s" + +#: builtin/remote.c:1311 +#, c-format +msgid "URL: %s" +msgstr "URL: %s" + +#: builtin/remote.c:1327 +#, c-format +msgid " * [would prune] %s" +msgstr " * [ìë¼ë¼ ìì ] %s" + +#: builtin/remote.c:1330 +#, c-format +msgid " * [pruned] %s" +msgstr " * [ìë¼ë] %s" + +#: builtin/remote.c:1375 +msgid "prune remotes after fetching" +msgstr "ê°ì ¸ì¨ íì 리모í¸ë¥¼ ìë¼ë ëë¤" + +#: builtin/remote.c:1441 builtin/remote.c:1498 builtin/remote.c:1566 +#, c-format +msgid "No such remote '%s'" +msgstr "ê·¸ë° ë¦¬ëª¨í¸ê° ììµëë¤ ('%s')" + +#: builtin/remote.c:1461 +msgid "add branch" +msgstr "ë¸ëì¹ë¥¼ ì¶ê°í©ëë¤" + +#: builtin/remote.c:1468 +msgid "no remote specified" +msgstr "리모í¸ë¥¼ ì§ì íì§ ìììµëë¤" + +#: builtin/remote.c:1485 +msgid "query push URLs rather than fetch URLs" +msgstr "ê°ì ¸ì¤ê¸° URLì´ ìëë¼ í¸ì URLì ì§ìí©ëë¤" + +#: builtin/remote.c:1487 +msgid "return all URLs" +msgstr "모ë URLì 리í´í©ëë¤" + +#: builtin/remote.c:1515 +#, c-format +msgid "no URLs configured for remote '%s'" +msgstr "'%s' 리모í¸ì ëí URLì ì¤ì íì§ ìììµëë¤" + +#: builtin/remote.c:1541 +msgid "manipulate push URLs" +msgstr "í¸ì URLì ì§ì í©ëë¤" + +#: builtin/remote.c:1543 +msgid "add URL" +msgstr "URLì ì¶ê°í©ëë¤" + +#: builtin/remote.c:1545 +msgid "delete URLs" +msgstr "URLì ìì í©ëë¤" + +#: builtin/remote.c:1552 +msgid "--add --delete doesn't make sense" +msgstr "--add --delete ìµì ì ëë¤ ì°ë©´ ì ë©ëë¤" + +#: builtin/remote.c:1592 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "ì못ë ì¤ëì URL í¨í´: %s" + +#: builtin/remote.c:1600 +#, c-format +msgid "No such URL found: %s" +msgstr "ê·¸ë° URLì´ ììµëë¤: %s" + +#: builtin/remote.c:1602 +msgid "Will not delete all non-push URLs" +msgstr "í¸ìì©ì´ ìë 모ë URLì ìì íì§ ììµëë¤" + +#: builtin/remote.c:1616 +msgid "be verbose; must be placed before a subcommand" +msgstr "ìì¸í íìí©ëë¤ (íì ëª ë ¹ ìì ìì¼ í©ëë¤)" + +#: builtin/repack.c:17 +msgid "git repack [<options>]" +msgstr "git repack [<ìµì >]" + +#: builtin/repack.c:159 +msgid "pack everything in a single pack" +msgstr "íëì 묶ì ìì 모ë 묶ìµëë¤" + +#: builtin/repack.c:161 +msgid "same as -a, and turn unreachable objects loose" +msgstr "-aì ëì¼íê³ , ì ê·¼ ë¶ê°ë¥ ì¤ë¸ì í¸ë¥¼ ëì¨íê² ë°ê¿ëë¤" + +#: builtin/repack.c:164 +msgid "remove redundant packs, and run git-prune-packed" +msgstr "ì¬ë¶ì 묶ìì ì ê±°íê³ , git-prune-packed를 ì¤íí©ëë¤" + +#: builtin/repack.c:166 +msgid "pass --no-reuse-delta to git-pack-objects" +msgstr "git-pack-objectsì --no-reuse-delta ìµì ì ëê¹ëë¤" + +#: builtin/repack.c:168 +msgid "pass --no-reuse-object to git-pack-objects" +msgstr "git-pack-objectsì --no-reuse-object ìµì ì ëê¹ëë¤" + +#: builtin/repack.c:170 +msgid "do not run git-update-server-info" +msgstr "git-update-server-info를 ì¤ííì§ ììµëë¤" + +#: builtin/repack.c:173 +msgid "pass --local to git-pack-objects" +msgstr "git-pack-objectsì --local ìµì ì ëê¹ëë¤" + +#: builtin/repack.c:175 +msgid "write bitmap index" +msgstr "ë¹í¸ë§µ ì¸ë±ì¤ë¥¼ ìëë¤" + +#: builtin/repack.c:176 +msgid "approxidate" +msgstr "ëëµììê°" + +#: builtin/repack.c:177 +msgid "with -A, do not loosen objects older than this" +msgstr "-Aì ì¶ê°ë¡, ì§ì í ìê°ë³´ë¤ ì¤ëë ì¤ë¸ì í¸ë¥¼ ëì¨íê² ë§ë¤ì§ ììµëë¤" + +#: builtin/repack.c:179 +msgid "size of the window used for delta compression" +msgstr "ë¸í ìì¶ì ì¬ì©í ìëì° í¬ê¸°" + +#: builtin/repack.c:180 builtin/repack.c:184 +msgid "bytes" +msgstr "ë°ì´í¸ì" + +#: builtin/repack.c:181 +msgid "same as the above, but limit memory size instead of entries count" +msgstr "ìì ëì¼íì§ë§, í목 ì ëì ë©ëª¨ë¦¬ í¬ê¸°ë¥¼ ì íí©ëë¤" + +#: builtin/repack.c:183 +msgid "limits the maximum delta depth" +msgstr "ìµë ë¸í ê¹ì´ë¥¼ ì íí©ëë¤" + +#: builtin/repack.c:185 +msgid "maximum size of each packfile" +msgstr "묶ì íì¼ì ìµë í¬ê¸°" + +#: builtin/repack.c:187 +msgid "repack objects in packs marked with .keep" +msgstr ".keepì¼ë¡ íìë 묶ìì ì¤ë¸ì í¸ë¥¼ ë¤ì 묶ìµëë¤" + +#: builtin/repack.c:197 +msgid "cannot delete packs in a precious-objects repo" +msgstr "precious-objects ì ì¥ìì 묶ìì ìì í ì ììµëë¤" + +#: builtin/repack.c:381 +#, c-format +msgid "removing '%s' failed" +msgstr "'%s' ì ê±°ê° ì¤í¨íìµëë¤" + +#: builtin/replace.c:19 +msgid "git replace [-f] <object> <replacement>" +msgstr "git replace [-f] <ì¤ë¸ì í¸> <ëì²´ì´ë¦>" + +#: builtin/replace.c:20 +msgid "git replace [-f] --edit <object>" +msgstr "git replace [-f] --edit <ì¤ë¸ì í¸>" + +#: builtin/replace.c:21 +msgid "git replace [-f] --graft <commit> [<parent>...]" +msgstr "git replace [-f] --graft <커ë°> [<ìì>...]" + +#: builtin/replace.c:22 +msgid "git replace -d <object>..." +msgstr "git replace -d <ì¤ë¸ì í¸>..." + +#: builtin/replace.c:23 +msgid "git replace [--format=<format>] [-l [<pattern>]]" +msgstr "git replace [--format=<íì>] [-l [<í¨í´>]]" + +#: builtin/replace.c:325 builtin/replace.c:363 builtin/replace.c:391 +#, c-format +msgid "Not a valid object name: '%s'" +msgstr "ì¬ë°ë¥¸ ì¤ë¸ì í¸ ì´ë¦ì´ ìëëë¤: '%s'" + +#: builtin/replace.c:355 +#, c-format +msgid "bad mergetag in commit '%s'" +msgstr "ì»¤ë° '%s'ì ì못ë ë³í©íê·¸" + +#: builtin/replace.c:357 +#, c-format +msgid "malformed mergetag in commit '%s'" +msgstr "ì»¤ë° '%s'ì ì못ë íìì ë³í©íê·¸" + +#: builtin/replace.c:368 +#, c-format +msgid "" +"original commit '%s' contains mergetag '%s' that is discarded; use --edit " +"instead of --graft" +msgstr "본ë ì»¤ë° '%s'ì ë²ë ¤ì§ ë³í©íê·¸ '%s'ì´(ê°) ë¤ì´ ììµëë¤. --graft ëì --edit ìµì ì ì¬ì©íììì¤" + +#: builtin/replace.c:401 +#, c-format +msgid "the original commit '%s' has a gpg signature." +msgstr "본ë ì»¤ë° '%s'ì GPG ìëª ì´ ììµëë¤." + +#: builtin/replace.c:402 +msgid "the signature will be removed in the replacement commit!" +msgstr "ëì²´ 커ë°ìì ìëª ì ì ê±°í©ëë¤!" + +#: builtin/replace.c:408 +#, c-format +msgid "could not write replacement commit for: '%s'" +msgstr "ë¤ìì ëí ëì²´ 커ë°ì ì¸ ì ììµëë¤: '%s'" + +#: builtin/replace.c:432 +msgid "list replace refs" +msgstr "ëì²´ ë í¼ë°ì¤ 목ë¡ì íìí©ëë¤" + +#: builtin/replace.c:433 +msgid "delete replace refs" +msgstr "ëì²´ ë í¼ë°ì¤ë¥¼ ìì í©ëë¤" + +#: builtin/replace.c:434 +msgid "edit existing object" +msgstr "íì¬ ì¤ë¸ì í¸ë¥¼ í¸ì§í©ëë¤" + +#: builtin/replace.c:435 +msgid "change a commit's parents" +msgstr "커ë°ì ìì í목ì ë°ê¿ëë¤" + +#: builtin/replace.c:436 +msgid "replace the ref if it exists" +msgstr "ë í¼ë°ì¤ê° ìì¼ë©´ ëì²´í©ëë¤" + +#: builtin/replace.c:437 +msgid "do not pretty-print contents for --edit" +msgstr "--editì ëí ë´ì©ì ììê² íìíì§ ììµëë¤" + +#: builtin/replace.c:438 +msgid "use this format" +msgstr "ì´ íìì ì¬ì©í©ëë¤" + +#: builtin/rerere.c:12 +msgid "git rerere [clear | forget <path>... | status | remaining | diff | gc]" +msgstr "git rerere [clear | forget <ê²½ë¡>... | status | remaining | diff | gc]" + +#: builtin/rerere.c:58 +msgid "register clean resolutions in index" +msgstr "ì¸ë±ì¤ì ê¹ëí í´ê²°ì ë±ë¡í©ëë¤" + +#: builtin/reset.c:26 +msgid "" +"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]" +msgstr "git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<커ë°>]" + +#: builtin/reset.c:27 +msgid "git reset [-q] <tree-ish> [--] <paths>..." +msgstr "git reset [-q] <í¸ë¦¬-ë°ì> [--] <ê²½ë¡>..." + +#: builtin/reset.c:28 +msgid "git reset --patch [<tree-ish>] [--] [<paths>...]" +msgstr "git reset --patch [<í¸ë¦¬-ë°ì>] [--] [<ê²½ë¡>...]" + +#: builtin/reset.c:34 +msgid "mixed" +msgstr "í¼í©" + +#: builtin/reset.c:34 +msgid "soft" +msgstr "ìíí¸" + +#: builtin/reset.c:34 +msgid "hard" +msgstr "íë" + +#: builtin/reset.c:34 +msgid "merge" +msgstr "ë³í©" + +#: builtin/reset.c:34 +msgid "keep" +msgstr "ì ì§" + +#: builtin/reset.c:74 +msgid "You do not have a valid HEAD." +msgstr "ì¬ë°ë¥¸ HEADê° ììµëë¤." + +#: builtin/reset.c:76 +msgid "Failed to find tree of HEAD." +msgstr "HEADì í¸ë¦¬ë¥¼ ì°¾ëë° ì¤í¨íìµëë¤." + +#: builtin/reset.c:82 +#, c-format +msgid "Failed to find tree of %s." +msgstr "%sì í¸ë¦¬ë¥¼ ì°¾ëë° ì¤í¨íìµëë¤." + +#: builtin/reset.c:100 +#, c-format +msgid "HEAD is now at %s" +msgstr "HEADì íì¬ ìì¹ë %sì ëë¤" + +#: builtin/reset.c:183 +#, c-format +msgid "Cannot do a %s reset in the middle of a merge." +msgstr "ë³í© ì¤ì %s 리ì ì í ì ììµëë¤." + +#: builtin/reset.c:276 +msgid "be quiet, only report errors" +msgstr "ê°ëµí íì, ì¤ë¥ë§ íìí©ëë¤" + +#: builtin/reset.c:278 +msgid "reset HEAD and index" +msgstr "HEADì ì¸ë±ì¤ë¥¼ 리ì í©ëë¤" + +#: builtin/reset.c:279 +msgid "reset only HEAD" +msgstr "HEADë§ ë¦¬ì í©ëë¤" + +#: builtin/reset.c:281 builtin/reset.c:283 +msgid "reset HEAD, index and working tree" +msgstr "HEAD, ì¸ë±ì¤, ìì í´ë를 리ì í©ëë¤" + +#: builtin/reset.c:285 +msgid "reset HEAD but keep local changes" +msgstr "HEAD를 리ì íì§ë§ ë¡ì»¬ ë³ê²½ ì¬íì ë¨ê²¨ë¡ëë¤" + +#: builtin/reset.c:288 +msgid "record only the fact that removed paths will be added later" +msgstr "ì ê±°í ê²½ë¡ë¥¼ ëì¤ì ì¶ê°íë¤ë ì¬ì¤ë§ 기ë¡í©ëë¤" + +#: builtin/reset.c:305 +#, c-format +msgid "Failed to resolve '%s' as a valid revision." +msgstr "'%s'ì(를) ì¬ë°ë¥¸ 리ë¹ì ì¼ë¡ ì°¾ëë° ì¤í¨íìµëë¤." + +#: builtin/reset.c:313 +#, c-format +msgid "Failed to resolve '%s' as a valid tree." +msgstr "'%s'ì(를) ì¬ë°ë¥¸ í¸ë¦¬ë¡ ì°¾ëë° ì¤í¨íìµëë¤." + +#: builtin/reset.c:322 +msgid "--patch is incompatible with --{hard,mixed,soft}" +msgstr "--patch ìµì ì --{hard,mixed,soft} ìµì ê³¼ í¸íëì§ ììµëë¤" + +#: builtin/reset.c:331 +msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." +msgstr "--mixed ìµì ì ê²½ë¡ì ê°ì´ ì°ê¸°ë ì ê±°ë ìì ì ëë¤. ëì ì 'git reset -- <ê²½ë¡>'를 ì¬ì©íììì¤." + +#: builtin/reset.c:333 +#, c-format +msgid "Cannot do %s reset with paths." +msgstr "ê²½ë¡ì ê°ì´ %s 리ì ì í ì ììµëë¤." + +#: builtin/reset.c:343 +#, c-format +msgid "%s reset is not allowed in a bare repository" +msgstr "%s 리ì ì ê°ëµí ì ì¥ìììë§ ì¸ ì ììµëë¤" + +#: builtin/reset.c:347 +msgid "-N can only be used with --mixed" +msgstr "-N ìµì ì --mixed ìµì ê³¼ ê°ì´ ì¨ì¼ë§ í©ëë¤" + +#: builtin/reset.c:364 +msgid "Unstaged changes after reset:" +msgstr "리ì ë¤ì ì¤í ì´ì§íì§ ìì ë³ê²½ ì¬í:" + +#: builtin/reset.c:370 +#, c-format +msgid "Could not reset index file to revision '%s'." +msgstr "ì¸ë±ì¤ íì¼ì '%s' 리ë¹ì ì¼ë¡ 리ì í ì ììµëë¤." + +#: builtin/reset.c:374 +msgid "Could not write new index file." +msgstr "ì ì¸ë±ì¤ íì¼ì ì¸ ì ììµëë¤." + +#: builtin/rev-list.c:354 +msgid "rev-list does not support display of notes" +msgstr "rev-listë ë ¸í¸ íì를 ì§ìíì§ ììµëë¤" + +#: builtin/rev-parse.c:358 +msgid "git rev-parse --parseopt [<options>] -- [<args>...]" +msgstr "git rev-parse --parseopt [<ìµì >] -- [<ì¸ì>...]" + +#: builtin/rev-parse.c:363 +msgid "keep the `--` passed as an arg" +msgstr "ì¸ìë¡ ë긴 `--`를 ì ì§í©ëë¤" + +#: builtin/rev-parse.c:365 +msgid "stop parsing after the first non-option argument" +msgstr "첫ë²ì§¸ ìµì ì´ ìë ì¸ì ë¤ì íì±ì ì¤ì§í©ëë¤" + +#: builtin/rev-parse.c:368 +msgid "output in stuck long form" +msgstr "stuck long íìì¼ë¡ ì¶ë ¥í©ëë¤" + +#: builtin/rev-parse.c:499 +msgid "" +"git rev-parse --parseopt [<options>] -- [<args>...]\n" +" or: git rev-parse --sq-quote [<arg>...]\n" +" or: git rev-parse [<options>] [<arg>...]\n" +"\n" +"Run \"git rev-parse --parseopt -h\" for more information on the first usage." +msgstr "" +"git rev-parse --parseopt [<ìµì >] -- [<ì¸ì>...]\n" +" or: git rev-parse --sq-quote [<ì¸ì>...]\n" +" or: git rev-parse [<ìµì >] [<ì¸ì>...]\n" +"\n" +"첫ë²ì§¸ ì¬ì©ë°©ë²ì ëí´ ìì¸í ìê³ ì¶ì¼ë©´, \"git rev-parse --parseopt -h\"를\n" +"ì¤íí´ ë³´ììì¤." + +#: builtin/revert.c:22 +msgid "git revert [<options>] <commit-ish>..." +msgstr "git revert [<ìµì >] <커ë°-ë°ì>..." + +#: builtin/revert.c:23 +msgid "git revert <subcommand>" +msgstr "git revert <íìëª ë ¹>" + +#: builtin/revert.c:28 +msgid "git cherry-pick [<options>] <commit-ish>..." +msgstr "git cherry-pick [<ìµì >] <커ë°-ë°ì>..." + +#: builtin/revert.c:29 +msgid "git cherry-pick <subcommand>" +msgstr "git cherry-pick <íìëª ë ¹>" + +#: builtin/revert.c:71 +#, c-format +msgid "%s: %s cannot be used with %s" +msgstr "%s: %sì(ë) %sì(ê³¼) ê°ì´ ì¸ ì ììµëë¤" + +#: builtin/revert.c:80 +msgid "end revert or cherry-pick sequence" +msgstr "ëë리기 ëë ì»¤ë° ë¹¼ì¤ê¸° ì°ìì ëë ëë¤" + +#: builtin/revert.c:81 +msgid "resume revert or cherry-pick sequence" +msgstr "ëë리기 ëë ì»¤ë° ë¹¼ì¤ê¸° ì°ìì ê³ìí©ëë¤" + +#: builtin/revert.c:82 +msgid "cancel revert or cherry-pick sequence" +msgstr "ëë리기 ëë ì»¤ë° ë¹¼ì¤ê¸° ì°ìì ì·¨ìí©ëë¤" + +#: builtin/revert.c:83 +msgid "don't automatically commit" +msgstr "ìëì¼ë¡ 커ë°íì§ ììµëë¤" + +#: builtin/revert.c:84 +msgid "edit the commit message" +msgstr "ì»¤ë° ë©ìì§ë¥¼ í¸ì§í©ëë¤" + +#: builtin/revert.c:87 +msgid "parent number" +msgstr "ì´ì ì»¤ë° ë²í¸" + +#: builtin/revert.c:89 +msgid "merge strategy" +msgstr "ë³í© ì ëµ" + +#: builtin/revert.c:90 +msgid "option" +msgstr "ìµì " + +#: builtin/revert.c:91 +msgid "option for merge strategy" +msgstr "ë³í© ì ëµ ìµì " + +#: builtin/revert.c:104 +msgid "append commit name" +msgstr "ì»¤ë° ì´ë¦ì ë¤ì ë¶ì ëë¤" + +#: builtin/revert.c:106 +msgid "preserve initially empty commits" +msgstr "ìµì´ ë¹ ì»¤ë°ì ì ì§í©ëë¤" + +#: builtin/revert.c:107 +msgid "allow commits with empty messages" +msgstr "ë¹ ë©ìì§ë¡ 커ë°ì íì©í©ëë¤" + +#: builtin/revert.c:108 +msgid "keep redundant, empty commits" +msgstr "ì¬ë¶ì ë¹ ì»¤ë°ì ì ì§í©ëë¤" + +#: builtin/revert.c:112 +msgid "program error" +msgstr "íë¡ê·¸ë¨ ì¤ë¥" + +#: builtin/revert.c:197 +msgid "revert failed" +msgstr "ëë리기 ì¤í¨" + +#: builtin/revert.c:212 +msgid "cherry-pick failed" +msgstr "cherry-pick ì¤í¨" + +#: builtin/rm.c:17 +msgid "git rm [<options>] [--] <file>..." +msgstr "git rm [<ìµì >] [--] <íì¼>..." + +#: builtin/rm.c:65 +msgid "" +"the following submodule (or one of its nested submodules)\n" +"uses a .git directory:" +msgid_plural "" +"the following submodules (or one of their nested submodules)\n" +"use a .git directory:" +msgstr[0] "" +"ë¤ì íì 모ëì´ (ëë ê·¸ ë´ë¶ íì 모ëì´) .git\n" +"ëë í°ë¦¬ë¥¼ ì¬ì©í©ëë¤:" + +#: builtin/rm.c:71 +msgid "" +"\n" +"(use 'rm -rf' if you really want to remove it including all of its history)" +msgstr "\n(ì ë§ë¡ ê·¸ ì»¤ë° ë´ìê¹ì§ í¬í¨í´ ì ê±°íë ¤ë©´ 'rm -rf'를 ì¬ì©íììì¤)" + +#: builtin/rm.c:230 +msgid "" +"the following file has staged content different from both the\n" +"file and the HEAD:" +msgid_plural "" +"the following files have staged content different from both the\n" +"file and the HEAD:" +msgstr[0] "" +"ë¤ì íì¼ì íì¼ê³¼ HEAD 모ë ë¤ë¥¸ ì¤í ì´ì§í ë´ì©ì´\n" +"ììµëë¤:" + +#: builtin/rm.c:235 +msgid "" +"\n" +"(use -f to force removal)" +msgstr "" +"\n" +"(ê°ì ë¡ ì ê±°íë ¤ë©´ -f ìµì ì ì¬ì©íììì¤)" + +#: builtin/rm.c:239 +msgid "the following file has changes staged in the index:" +msgid_plural "the following files have changes staged in the index:" +msgstr[0] "ë¤ì íì¼ì´ ì¸ë±ì¤ì ì¤í ì´ì§í ë³ê²½ ì¬íì´ ììµëë¤:" + +#: builtin/rm.c:243 builtin/rm.c:254 +msgid "" +"\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "\n(íì¼ì ì ì§íë ¤ë©´ --cached ìµì , ê°ì ë¡ ì ê±°íë ¤ë©´ -f ìµì ì ì¬ì©íììì¤)" + +#: builtin/rm.c:251 +msgid "the following file has local modifications:" +msgid_plural "the following files have local modifications:" +msgstr[0] "ë¤ì íì¼ì ë¡ì»¬ ìì ì¬íì´ ììµëë¤:" + +#: builtin/rm.c:269 +msgid "do not list removed files" +msgstr "ì ê±°í íì¼ ëª©ë¡ì íìíì§ ììµëë¤" + +#: builtin/rm.c:270 +msgid "only remove from the index" +msgstr "ì¸ë±ì¤ììë§ ì ê±°í©ëë¤" + +#: builtin/rm.c:271 +msgid "override the up-to-date check" +msgstr "ìµì ë²ì íì¸ì íì§ ììµëë¤" + +#: builtin/rm.c:272 +msgid "allow recursive removal" +msgstr "ì¬ê·ì ì 거를 íì©í©ëë¤" + +#: builtin/rm.c:274 +msgid "exit with a zero status even if nothing matched" +msgstr "ì무 ê²ë ì¼ì¹íì§ ìì¼ë©´ ìí 0ë²ì¼ë¡ ëë©ëë¤" + +#: builtin/rm.c:317 +msgid "Please, stage your changes to .gitmodules or stash them to proceed" +msgstr "ê³ìíë ¤ë©´ .gitmodulesì ë³ê²½ ì¬íì ì¤í ì´ì§íê±°ë stashíììì¤" + +#: builtin/rm.c:335 +#, c-format +msgid "not removing '%s' recursively without -r" +msgstr "-r ìµì ì´ ìì¼ë©´ ì¬ê·ì ì¼ë¡ '%s'ì(를) ì ê±°íì§ ììµëë¤" + +#: builtin/rm.c:374 +#, c-format +msgid "git rm: unable to remove %s" +msgstr "git rm: %sì(를) ì ê±°í ì ììµëë¤" + +#: builtin/send-pack.c:18 +msgid "" +"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-" +"receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> " +"[<ref>...]\n" +" --all and explicit <ref> specification are mutually exclusive." +msgstr "" +"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<í¸ì¤í¸>:]<ëë í°ë¦¬> [<ë í¼ë°ì¤>...]\n" +" --all ìµì ê³¼ ëª ìì ì¸ <ë í¼ë°ì¤> ëª ì¸ ì¤ íëë§ ì¬ì©í ì ììµëë¤." + +#: builtin/send-pack.c:160 +msgid "remote name" +msgstr "ë¦¬ëª¨í¸ ì´ë¦" + +#: builtin/send-pack.c:171 +msgid "use stateless RPC protocol" +msgstr "ìí ìë RPC íë¡í ì½ì ì¬ì©í©ëë¤" + +#: builtin/send-pack.c:172 +msgid "read refs from stdin" +msgstr "íì¤ ì ë ¥ìì ë í¼ë°ì¤ë¥¼ ì½ìµëë¤" + +#: builtin/send-pack.c:173 +msgid "print status from remote helper" +msgstr "ë¦¬ëª¨í¸ ëì íë¡ê·¸ë¨ì ìí를 íìí©ëë¤" + +#: builtin/shortlog.c:13 +msgid "git shortlog [<options>] [<revision-range>] [[--] [<path>...]]" +msgstr "git shortlog [<ìµì >] [<리ë¹ì -ë²ì>] [[--] [<ê²½ë¡>...]]" + +#: builtin/shortlog.c:131 +#, c-format +msgid "Missing author: %s" +msgstr "ìì±ì ì ë³´ê° ììµëë¤: %s" + +#: builtin/shortlog.c:230 +msgid "sort output according to the number of commits per author" +msgstr "ìì±ìë³ ì»¤ë° ìì ë°ë¼ ì ë ¬í©ëë¤" + +#: builtin/shortlog.c:232 +msgid "Suppress commit descriptions, only provides commit count" +msgstr "ì»¤ë° ì¤ëª ì ìëµíê³ , ì»¤ë° ìë§ íìí©ëë¤" + +#: builtin/shortlog.c:234 +msgid "Show the email address of each author" +msgstr "ìì±ìì ì ìë©ì¼ 주ì를 íìí©ëë¤" + +#: builtin/shortlog.c:235 +msgid "w[,i1[,i2]]" +msgstr "w[,i1[,i2]]" + +#: builtin/shortlog.c:236 +msgid "Linewrap output" +msgstr "ì¤ë°ê¿ ì¶ë ¥" + +#: builtin/show-branch.c:10 +msgid "" +"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" +"\t\t[--current] [--color[=<when>] | --no-color] [--sparse]\n" +"\t\t[--more=<n> | --list | --independent | --merge-base]\n" +"\t\t[--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]" +msgstr "" +"git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" +"\t\t[--current] [--color[=<ìê°>] | --no-color] [--sparse]\n" +"\t\t[--more=<n> | --list | --independent | --merge-base]\n" +"\t\t[--no-name | --sha1-name] [--topics] [(<리ë¹ì > | <glob>)...]" + +#: builtin/show-branch.c:14 +msgid "git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]" +msgstr "git show-branch (-g | --reflog)[=<n>[,<ë² ì´ì¤>]] [--list] [<ë í¼ë°ì¤>]" + +#: builtin/show-branch.c:640 +msgid "show remote-tracking and local branches" +msgstr "ë¦¬ëª¨í¸ ì¶ì ë° ë¡ì»¬ ë¸ëì¹ë¥¼ íìí©ëë¤" + +#: builtin/show-branch.c:642 +msgid "show remote-tracking branches" +msgstr "ë¦¬ëª¨í¸ ì¶ì ë¸ëì¹ë¥¼ íìí©ëë¤" + +#: builtin/show-branch.c:644 +msgid "color '*!+-' corresponding to the branch" +msgstr "ë¸ëì¹ì ë°ë¥¸ '*!+-' íìì ìì ì íëë¤" + +#: builtin/show-branch.c:646 +msgid "show <n> more commits after the common ancestor" +msgstr "ê³µíµ ì´ì ì»¤ë° ë¤ì <n>ê°ì 커ë°ì íìí©ëë¤" + +#: builtin/show-branch.c:648 +msgid "synonym to more=-1" +msgstr "--more=-1 ìµì ê³¼ ëì¼" + +#: builtin/show-branch.c:649 +msgid "suppress naming strings" +msgstr "ì´ë¦ 문ìì´ì íìíì§ ììµëë¤" + +#: builtin/show-branch.c:651 +msgid "include the current branch" +msgstr "íì¬ ë¸ëì¹ë¥¼ í¬í¨" + +#: builtin/show-branch.c:653 +msgid "name commits with their object names" +msgstr "커ë°ì ì´ë¦ì ê·¸ ì¤ë¸ì í¸ ì´ë¦ì¼ë¡ ë¶ì ëë¤" + +#: builtin/show-branch.c:655 +msgid "show possible merge bases" +msgstr "ê°ë¥í ë³í© 기ì¤ì ì íìí©ëë¤" + +#: builtin/show-branch.c:657 +msgid "show refs unreachable from any other ref" +msgstr "ë¤ë¥¸ ì´ë¤ ë í¼ë°ì¤ììë ì ê·¼ ë¶ê°ë¥í ë í¼ë°ì¤ë¥¼ íìí©ëë¤" + +#: builtin/show-branch.c:659 +msgid "show commits in topological order" +msgstr "ìì ììì ë°ë¼ 커ë°ì íìí©ëë¤" + +#: builtin/show-branch.c:662 +msgid "show only commits not on the first branch" +msgstr "첫 ë¸ëì¹ì ìë 커ë°ë§ íìí©ëë¤" + +#: builtin/show-branch.c:664 +msgid "show merges reachable from only one tip" +msgstr "íëì ëììë§ ì ê·¼ ê°ë¥í ë³í©ì íìí©ëë¤" + +#: builtin/show-branch.c:666 +msgid "topologically sort, maintaining date order where possible" +msgstr "ê°ë¥íë©´ ìê° ìì를 ì ì§íë©´ì ìì ììë¡ ì ë ¬" + +#: builtin/show-branch.c:669 +msgid "<n>[,<base>]" +msgstr "<n>[,<ë² ì´ì¤>]" + +#: builtin/show-branch.c:670 +msgid "show <n> most recent ref-log entries starting at base" +msgstr "기ì¤ë¶í° ììí´ ìµë <n>ê°ì ìµê·¼ ref-log í목ì íìí©ëë¤" + +#: builtin/show-ref.c:10 +msgid "" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" +"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]" +msgstr "" +"git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --" +"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<í¨í´>...]" + +#: builtin/show-ref.c:11 +msgid "git show-ref --exclude-existing[=<pattern>]" +msgstr "git show-ref --exclude-existing[=<í¨í´>]" + +#: builtin/show-ref.c:165 +msgid "only show tags (can be combined with heads)" +msgstr "íê·¸ë§ íì (í¤ëì ê²°í© ê°ë¥)" + +#: builtin/show-ref.c:166 +msgid "only show heads (can be combined with tags)" +msgstr "í¤ëë§ íì (íê·¸ì ê²°í© ê°ë¥)" + +#: builtin/show-ref.c:167 +msgid "stricter reference checking, requires exact ref path" +msgstr "ë ì격í ë í¼ë°ì¤ ê²ì¬, ì íí íëì ë í¼ë°ì¤ ê²½ë¡ íì" + +#: builtin/show-ref.c:170 builtin/show-ref.c:172 +msgid "show the HEAD reference, even if it would be filtered out" +msgstr "HEAD ë í¼ë°ì¤ë¥¼ íìí©ëë¤ (íí°ë§ëì ì ì¸ëëë¼ë)" + +#: builtin/show-ref.c:174 +msgid "dereference tags into object IDs" +msgstr "í그를 ì¤ë¸ì í¸ IDë¡ ë°ë¼ê°ëë¤" + +#: builtin/show-ref.c:176 +msgid "only show SHA1 hash using <n> digits" +msgstr "SHA-1 íìì <n>ê°ì ì«ìë§ ì¬ì©í©ëë¤" + +#: builtin/show-ref.c:180 +msgid "do not print results to stdout (useful with --verify)" +msgstr "íì¤ ì¶ë ¥ì 결과를 íìíì§ ììµëë¤ (--verify ìµì ê³¼ ì¬ì©íë©´ ì¢ì)" + +#: builtin/show-ref.c:182 +msgid "show refs from stdin that aren't in local repository" +msgstr "ë¡ì»¬ ì ì¥ìì ìë ë í¼ë°ì¤ë¥¼ íì¤ ì ë ¥ìì ì½ì´ íìí©ëë¤" + +#: builtin/stripspace.c:17 +msgid "git stripspace [-s | --strip-comments]" +msgstr "git stripspace [-s | --strip-comments]" + +#: builtin/stripspace.c:18 +msgid "git stripspace [-c | --comment-lines]" +msgstr "git stripspace [-c | --comment-lines]" + +#: builtin/stripspace.c:35 +msgid "skip and remove all lines starting with comment character" +msgstr "주ì 문ìë¡ ììíë 모ë ì¤ì ê±´ëë°ê³ ì ê±°í©ëë¤" + +#: builtin/stripspace.c:38 +msgid "prepend comment character and blank to each line" +msgstr "ê° ì¤ì ìì 주ì 문ì를 ë¶ì´ê³ ë¹ ì¤ë¡ ë§ëëë¤" + +#: builtin/submodule--helper.c:79 builtin/submodule--helper.c:167 +msgid "alternative anchor for relative paths" +msgstr "ìë ê²½ë¡ì ì¬ì©í ëë¤ë¥¸ 기ì¤" + +#: builtin/submodule--helper.c:84 +msgid "git submodule--helper list [--prefix=<path>] [<path>...]" +msgstr "git submodule--helper list [--prefix=<ê²½ë¡>] [<ê²½ë¡>...]" + +#: builtin/submodule--helper.c:114 +msgid "git submodule--helper name <path>" +msgstr "git submodule--helper name <ê²½ë¡>" + +#: builtin/submodule--helper.c:120 +#, c-format +msgid "no submodule mapping found in .gitmodules for path '%s'" +msgstr "ê²½ë¡ '%s'ì ëí´ .gitmodulesì ìë íì모ë 매íì´ ììµëë¤" + +#: builtin/submodule--helper.c:170 +msgid "where the new submodule will be cloned to" +msgstr "ì íì 모ëì ë³µì í ëì ìì¹" + +#: builtin/submodule--helper.c:173 +msgid "name of the new submodule" +msgstr "ì íì 모ë ì´ë¦" + +#: builtin/submodule--helper.c:176 +msgid "url where to clone the submodule from" +msgstr "íì 모ëì ë³µì í´ ì¬ URL" + +#: builtin/submodule--helper.c:182 +msgid "depth for shallow clones" +msgstr "ìì ë³µì ì ì¬ì©í ê¹ì´" + +#: builtin/submodule--helper.c:188 +msgid "" +"git submodule--helper clone [--prefix=<path>] [--quiet] [--reference " +"<repository>] [--name <name>] [--url <url>][--depth <depth>] [--] [<path>...]" +msgstr "" +"git submodule--helper clone [--prefix=<ê²½ë¡>] [--quiet] [--reference <ì ì¥ì" +">] [--name <ì´ë¦>] [--url <URL>][--depth <ê¹ì´>] [--] [<ê²½ë¡>...]" + +#: builtin/submodule--helper.c:202 builtin/submodule--helper.c:208 +#: builtin/submodule--helper.c:216 +#, c-format +msgid "could not create directory '%s'" +msgstr "'%s' ëë í°ë¦¬ë¥¼ ë§ë¤ ì ììµëë¤" + +#: builtin/submodule--helper.c:204 +#, c-format +msgid "clone of '%s' into submodule path '%s' failed" +msgstr "'%s'ìì íì 모ë ê²½ë¡ '%s'ì ë³µì íëë° ì¤í¨íìµëë¤" + +#: builtin/submodule--helper.c:227 +#, c-format +msgid "cannot open file '%s'" +msgstr "'%s' íì¼ì ì´ ì ììµëë¤" + +#: builtin/submodule--helper.c:232 +#, c-format +msgid "could not close file %s" +msgstr "%s íì¼ì ë«ì ì ììµëë¤" + +#: builtin/submodule--helper.c:247 +#, c-format +msgid "could not get submodule directory for '%s'" +msgstr "'%s'ì ëí íì 모ë ëë í°ë¦¬ë¥¼ ê°ì ¸ì¬ ì ììµëë¤" + +#: builtin/submodule--helper.c:273 +msgid "fatal: submodule--helper subcommand must be called with a subcommand" +msgstr "" +"ì¹ëª ì ì´ì: submodule--helper íì ëª ë ¹ì íì ëª ë ¹ì¼ë¡ í¸ì¶í´ì¼ í©ëë¤" + +#: builtin/submodule--helper.c:280 +#, c-format +msgid "fatal: '%s' is not a valid submodule--helper subcommand" +msgstr "ì¹ëª ì ì´ì: '%s'ì(ë) ì¬ë°ë¥¸ submodule--helper íì ëª ë ¹ì´ ìëëë¤" + +#: builtin/symbolic-ref.c:7 +msgid "git symbolic-ref [<options>] <name> [<ref>]" +msgstr "git symbolic-ref [<ìµì >] <ì´ë¦> [<ë í¼ë°ì¤>]" + +#: builtin/symbolic-ref.c:8 +msgid "git symbolic-ref -d [-q] <name>" +msgstr "git symbolic-ref -d [-q] <ì´ë¦>" + +#: builtin/symbolic-ref.c:40 +msgid "suppress error message for non-symbolic (detached) refs" +msgstr "ì¬ë³¼ì´ ìë (ë¶ë¦¬ë) ë í¼ë°ì¤ì ëí´ ìë¬ ë©ìì§ë¥¼ íìíì§ ììµëë¤" + +#: builtin/symbolic-ref.c:41 +msgid "delete symbolic ref" +msgstr "ì¬ë³¼ë¦ ë í¼ë°ì¤ë¥¼ ìì í©ëë¤" + +#: builtin/symbolic-ref.c:42 +msgid "shorten ref output" +msgstr "ë í¼ë°ì¤ ì¶ë ¥ì ì¤ì ëë¤" + +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362 +msgid "reason" +msgstr "ì´ì " + +#: builtin/symbolic-ref.c:43 builtin/update-ref.c:362 +msgid "reason of the update" +msgstr "ì ë°ì´í¸ì ì´ì " + +#: builtin/tag.c:23 +msgid "" +"git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> " +"[<head>]" +msgstr "" +"git tag [-a | -s | -u <í¤-ID>] [-f] [-m <ë©ìì§> | -F <íì¼>] <íê·¸ì´ë¦>\n" +"\t\t[<í¤ë>]" + +#: builtin/tag.c:24 +msgid "git tag -d <tagname>..." +msgstr "git tag -d <íê·¸ì´ë¦>..." + +#: builtin/tag.c:25 +msgid "" +"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]\n" +"\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]" +msgstr "" +"git tag -l [-n[<ê°ì>]] [--contains <커ë°>] [--points-at <ì¤ë¸ì í¸>]\n" +"\t\t[--format=<íì>] [--[no-]merged [<커ë°>]] [<í¨í´>...]" + +#: builtin/tag.c:27 +msgid "git tag -v <tagname>..." +msgstr "git tag -v <íê·¸ì´ë¦>..." + +#: builtin/tag.c:80 +#, c-format +msgid "tag name too long: %.*s..." +msgstr "íê·¸ ì´ë¦ì´ ë무 ê¹ëë¤: %.*s..." + +#: builtin/tag.c:85 +#, c-format +msgid "tag '%s' not found." +msgstr "'%s' íê·¸ê° ììµëë¤." + +#: builtin/tag.c:100 +#, c-format +msgid "Deleted tag '%s' (was %s)\n" +msgstr "'%s' íê·¸ ìì í¨ (과거 %s)\n" + +#: builtin/tag.c:112 +#, c-format +msgid "could not verify the tag '%s'" +msgstr "'%s' í그를 ê²ì¦í ì ììµëë¤" + +#: builtin/tag.c:122 +#, c-format +msgid "" +"\n" +"Write a message for tag:\n" +" %s\n" +"Lines starting with '%c' will be ignored.\n" +msgstr "" +"\n" +"ë¤ì íê·¸ì ëí ë©ìì§ë¥¼ ì°ììì¤:\n" +" %s\n" +"'%c' 문ìë¡ ììíë ì¤ì 무ìë©ëë¤.\n" + +#: builtin/tag.c:126 +#, c-format +msgid "" +"\n" +"Write a message for tag:\n" +" %s\n" +"Lines starting with '%c' will be kept; you may remove them yourself if you " +"want to.\n" +msgstr "" +"\n" +"ë¤ì íê·¸ì ëí ë©ìì§ë¥¼ ì°ììì¤:\n" +" %s\n" +"'%c' 문ìë¡ ììíë ì¤ì ì ì§ë©ëë¤. ì ê±°íë ¤ë©´ ì§ì ì§ìì¼ í©ëë¤.\n" + +#: builtin/tag.c:199 +msgid "unable to sign the tag" +msgstr "íê·¸ì ìëª í ì ììµëë¤" + +#: builtin/tag.c:201 +msgid "unable to write tag file" +msgstr "íê·¸ íì¼ì ì¸ ì ììµëë¤" + +#: builtin/tag.c:226 +msgid "bad object type." +msgstr "ì못ë ì¤ë¸ì í¸ ì¢ ë¥." + +#: builtin/tag.c:239 +msgid "tag header too big." +msgstr "íê·¸ í¤ëê° ë무 í½ëë¤." + +#: builtin/tag.c:275 +msgid "no tag message?" +msgstr "íê·¸ ë©ìì§ ìì?" + +#: builtin/tag.c:281 +#, c-format +msgid "The tag message has been left in %s\n" +msgstr "íê·¸ ë©ìì§ê° %s íì¼ì ë¨ì ììµëë¤\n" + +#: builtin/tag.c:339 +msgid "list tag names" +msgstr "íê·¸ ì´ë¦ 목ë¡ì íìí©ëë¤" + +#: builtin/tag.c:341 +msgid "print <n> lines of each tag message" +msgstr "ê° íê·¸ ë©ìì§ì <n>ì¤ì íìí©ëë¤" + +#: builtin/tag.c:343 +msgid "delete tags" +msgstr "í그를 ìì í©ëë¤" + +#: builtin/tag.c:344 +msgid "verify tags" +msgstr "í그를 ê²ì¦í©ëë¤" + +#: builtin/tag.c:346 +msgid "Tag creation options" +msgstr "íê·¸ ë§ë¤ê¸° ìµì " + +#: builtin/tag.c:348 +msgid "annotated tag, needs a message" +msgstr "주ì ë¬ë¦° íê·¸, ë©ìì§ê° íìí©ëë¤" + +#: builtin/tag.c:350 +msgid "tag message" +msgstr "íê·¸ ë©ìì§" + +#: builtin/tag.c:352 +msgid "annotated and GPG-signed tag" +msgstr "주ì ë¬ë¦¬ê³ GPG ìëª í íê·¸" + +#: builtin/tag.c:356 +msgid "use another key to sign the tag" +msgstr "í그를 ìëª íëë° ì§ì í í¤ë¥¼ ì¬ì©í©ëë¤" + +#: builtin/tag.c:357 +msgid "replace the tag if exists" +msgstr "íê·¸ê° ìì¼ë©´ ë°ê¿ëë¤" + +#: builtin/tag.c:358 builtin/update-ref.c:368 +msgid "create a reflog" +msgstr "reflog를 ë§ëëë¤" + +#: builtin/tag.c:360 +msgid "Tag listing options" +msgstr "íê·¸ ëª©ë¡ ë³´ê¸° ìµì " + +#: builtin/tag.c:361 +msgid "show tag list in columns" +msgstr "íê·¸ 목ë¡ì ì¬ë¬ ì´ë¡ íìí©ëë¤" + +#: builtin/tag.c:362 builtin/tag.c:363 +msgid "print only tags that contain the commit" +msgstr "í´ë¹ 커ë°ì´ ë¤ì´ ìë íê·¸ë§ íìí©ëë¤" + +#: builtin/tag.c:364 +msgid "print only tags that are merged" +msgstr "ë³í©ë íê·¸ë§ íìí©ëë¤" + +#: builtin/tag.c:365 +msgid "print only tags that are not merged" +msgstr "ë³í©ëì§ ìì íê·¸ë§ íìí©ëë¤" + +#: builtin/tag.c:370 +msgid "print only tags of the object" +msgstr "í´ë¹ ì¤ë¸ì í¸ì íê·¸ë§ íìí©ëë¤" + +#: builtin/tag.c:399 +msgid "--column and -n are incompatible" +msgstr "--column ë° -n ìµì ì í¸íëì§ ììµëë¤" + +#: builtin/tag.c:419 +msgid "-n option is only allowed with -l." +msgstr "-n ìµì ì -l ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤." + +#: builtin/tag.c:421 +msgid "--contains option is only allowed with -l." +msgstr "--contains ìµì ì -l ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤." + +#: builtin/tag.c:423 +msgid "--points-at option is only allowed with -l." +msgstr "--points-at ìµì ì -l ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤." + +#: builtin/tag.c:425 +msgid "--merged and --no-merged option are only allowed with -l" +msgstr "--merged ë° --no-merged ìµì ì -l ìµì ê³¼ ê°ì´ ì¨ì¼ í©ëë¤." + +#: builtin/tag.c:433 +msgid "only one -F or -m option is allowed." +msgstr "íëì -F ëë -m ìµì ë§ ì¸ ì ììµëë¤." + +#: builtin/tag.c:453 +msgid "too many params" +msgstr "íë¼ë¯¸í°ê° ë무 ë§ìµëë¤" + +#: builtin/tag.c:459 +#, c-format +msgid "'%s' is not a valid tag name." +msgstr "'%s'ì9ë) ì¬ë°ë¥¸ íê·¸ ì´ë¦ì´ ìëëë¤." + +#: builtin/tag.c:464 +#, c-format +msgid "tag '%s' already exists" +msgstr "íê·¸ '%s'ì´(ê°) ì´ë¯¸ ììµëë¤" + +#: builtin/tag.c:489 +#, c-format +msgid "Updated tag '%s' (was %s)\n" +msgstr "íê·¸ '%s' ì ë°ì´í¸ (과거 %s)\n" + +#: builtin/unpack-objects.c:490 +msgid "Unpacking objects" +msgstr "ì¤ë¸ì í¸ ë¬¶ì í¸ë ì¤" + +#: builtin/update-index.c:70 +#, c-format +msgid "failed to create directory %s" +msgstr "%s ëë í°ë¦¬ ë§ë¤ê¸° ì¤í¨íìµëë¤" + +#: builtin/update-index.c:76 +#, c-format +msgid "failed to stat %s" +msgstr "%sì stat()íëë° ì¤í¨íìµëë¤" + +#: builtin/update-index.c:86 +#, c-format +msgid "failed to create file %s" +msgstr "%s íì¼ì ë§ëëë° ì¤í¨íìµëë¤" + +#: builtin/update-index.c:94 +#, c-format +msgid "failed to delete file %s" +msgstr "%s íì¼ì ìì íëë° ì¤í¨íìµëë¤" + +#: builtin/update-index.c:101 builtin/update-index.c:203 +#, c-format +msgid "failed to delete directory %s" +msgstr "%s ëë í°ë¦¬ë¥¼ ìì íëë° ì¤í¨íìµëë¤" + +#: builtin/update-index.c:124 +#, c-format +msgid "Testing " +msgstr "í ì¤í¸ì¤ " + +#: builtin/update-index.c:136 +msgid "directory stat info does not change after adding a new file" +msgstr "ì íì¼ì ì¶ê°í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:149 +msgid "directory stat info does not change after adding a new directory" +msgstr "ì ëë í°ë¦¬ë¥¼ ì¶ê°í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:162 +msgid "directory stat info changes after updating a file" +msgstr "íì¼ì ì ë°ì´í¸í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:173 +msgid "directory stat info changes after adding a file inside subdirectory" +msgstr "íì ëë í°ë¦¬ì íì¼ì ì¶ê°í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:184 +msgid "directory stat info does not change after deleting a file" +msgstr "íì¼ì ìì í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:197 +msgid "directory stat info does not change after deleting a directory" +msgstr "ëë í°ë¦¬ë¥¼ ìì í íì ëë í°ë¦¬ ì ë³´ê° ë°ëì§ ìììµëë¤" + +#: builtin/update-index.c:204 +msgid " OK" +msgstr " ì¤ì¼ì´" + +#: builtin/update-index.c:564 +msgid "git update-index [<options>] [--] [<file>...]" +msgstr "git update-index [<ìµì >] [--] [<íì¼>...]" + +#: builtin/update-index.c:918 +msgid "continue refresh even when index needs update" +msgstr "ì¸ë±ì¤ì ì ë°ì´í¸ê° íìíëë¼ë ìë¡ ê³ ì¹¨ì ê³ìí©ëë¤" + +#: builtin/update-index.c:921 +msgid "refresh: ignore submodules" +msgstr "ìë¡ ê³ ì¹¨: íì 모ë 무ì" + +#: builtin/update-index.c:924 +msgid "do not ignore new files" +msgstr "ì íì¼ì 무ìí ì ììµëë¤" + +#: builtin/update-index.c:926 +msgid "let files replace directories and vice-versa" +msgstr "ëë í°ë¦¬ë¥¼ íì¼ë¡, ëë ê·¸ ë°ëë¡ ë°ê¿ ì ìê² íì©í©ëë¤" + +#: builtin/update-index.c:928 +msgid "notice files missing from worktree" +msgstr "ìì í´ëìì ì림 íì¼ì´ ììµëë¤" + +#: builtin/update-index.c:930 +msgid "refresh even if index contains unmerged entries" +msgstr "ì¸ë±ì¤ì ë³í©íì§ ìì íëª©ì´ ìì´ë ìë¡ ê³ ì¹©ëë¤" + +#: builtin/update-index.c:933 +msgid "refresh stat information" +msgstr "íì¼ ì 보를 ìë¡ ê³ ì¹©ëë¤" + +#: builtin/update-index.c:937 +msgid "like --refresh, but ignore assume-unchanged setting" +msgstr "--refreshì ëì¼íì§ë§, assume-unchanged ì¤ì ì 무ìí©ëë¤" + +#: builtin/update-index.c:941 +msgid "<mode>,<object>,<path>" +msgstr "<모ë>,<ì¤ë¸ì í¸>,<ê²½ë¡>" + +#: builtin/update-index.c:942 +msgid "add the specified entry to the index" +msgstr "ì§ì í í목ì ì¸ë±ì¤ì ì¶ê°í©ëë¤" + +#: builtin/update-index.c:946 +msgid "(+/-)x" +msgstr "(+/-)x" + +#: builtin/update-index.c:947 +msgid "override the executable bit of the listed files" +msgstr "목ë¡ì íì¼ìì ì¤í ê°ë¥ ë¹í¸ë¥¼ ë°ê¿ëë¤" + +#: builtin/update-index.c:951 +msgid "mark files as \"not changing\"" +msgstr "íì¼ì \"ë°ê¾¸ì§ ìì\"ì¼ë¡ íìí©ëë¤" + +#: builtin/update-index.c:954 +msgid "clear assumed-unchanged bit" +msgstr "ë°ê¾¸ì§ ììì¼ë¡ ê°ì (assumed-unchanged) ë¹í¸ë¥¼ ì§ìëë¤" + +#: builtin/update-index.c:957 +msgid "mark files as \"index-only\"" +msgstr "íì¼ì ì¸ë±ì¤ ì ì©ì¼ë¡ (\"index-only\") íìí©ëë¤" + +#: builtin/update-index.c:960 +msgid "clear skip-worktree bit" +msgstr "ìì í´ë ê±´ëë°ê¸° (skip-worktree) ë¹í¸ë¥¼ ì§ìëë¤" + +#: builtin/update-index.c:963 +msgid "add to index only; do not add content to object database" +msgstr "ì¸ë±ì¤ìë§ ì¶ê°í©ëë¤. ë´ì©ì ì¤ë¸ì í¸ ë°ì´í°ë² ì´ì¤ì ì¶ê°íì§ ììµëë¤" + +#: builtin/update-index.c:965 +msgid "remove named paths even if present in worktree" +msgstr "ìì í´ëì ìì´ë í´ë¹ ê²½ë¡ë¥¼ ì ê±°í©ëë¤" + +#: builtin/update-index.c:967 +msgid "with --stdin: input lines are terminated by null bytes" +msgstr "--stdinê³¼ ê°ì´ ì¬ì©: ì ë ¥ ì¤ì NUL ë°ì´í¸ë¡ ëë©ëë¤" + +#: builtin/update-index.c:969 +msgid "read list of paths to be updated from standard input" +msgstr "íì¤ ì ë ¥ìì ì ë°ì´í¸í ê²½ë¡ì 목ë¡ì ì½ìµëë¤" + +#: builtin/update-index.c:973 +msgid "add entries from standard input to the index" +msgstr "íì¤ ì ë ¥ìì ì½ì í목ì ì¸ë±ì¤ì ì¶ê°í©ëë¤" + +#: builtin/update-index.c:977 +msgid "repopulate stages #2 and #3 for the listed paths" +msgstr "ê²½ë¡ ëª©ë¡ì ëí´ #2 ë° #3 ì¤í ì´ì§ì ë¤ì í©ëë¤" + +#: builtin/update-index.c:981 +msgid "only update entries that differ from HEAD" +msgstr "HEADì ë¤ë¥¸ íëª©ë§ ì ë°ì´í¸í©ëë¤" + +#: builtin/update-index.c:985 +msgid "ignore files missing from worktree" +msgstr "ìì í´ëì ìë íì¼ì 무ìí©ëë¤" + +#: builtin/update-index.c:988 +msgid "report actions to standard output" +msgstr "íì¤ ì¶ë ¥ì ëìì ì립ëë¤" + +#: builtin/update-index.c:990 +msgid "(for porcelains) forget saved unresolved conflicts" +msgstr "ì ì¥í í´ê²°ëì§ ìì 충ëì 무ìí©ëë¤ (ì¬ì©ìì© ëª ë ¹ ì©ë)" + +#: builtin/update-index.c:994 +msgid "write index in this format" +msgstr "ì¸ë±ì¤ë¥¼ ì´ íìì¼ë¡ ìëë¤" + +#: builtin/update-index.c:996 +msgid "enable or disable split index" +msgstr "ì¤í릿 ì¸ë±ì¤ë¥¼ ì¼ê±°ë ëëë¤" + +#: builtin/update-index.c:998 +msgid "enable/disable untracked cache" +msgstr "ì¶ì íì§ ìë ìºì ì¬ì©ì ì¼ê±°ë ëëë¤" + +#: builtin/update-index.c:1000 +msgid "enable untracked cache without testing the filesystem" +msgstr "íì¼ ìì¤í í ì¤í¸ ìì´ ì¶ì íì§ ìë ìºì를 ì¬ì©í©ëë¤" + +#: builtin/update-ref.c:9 +msgid "git update-ref [<options>] -d <refname> [<old-val>]" +msgstr "git update-ref [<ìµì >] -d <ë í¼ë°ì¤ì´ë¦> [<과거-ê°>]" + +#: builtin/update-ref.c:10 +msgid "git update-ref [<options>] <refname> <new-val> [<old-val>]" +msgstr "git update-ref [<ìµì >] <ë í¼ë°ì¤ì´ë¦> <ì-ê°> [<과거-ê°>]" + +#: builtin/update-ref.c:11 +msgid "git update-ref [<options>] --stdin [-z]" +msgstr "git update-ref [<ìµì >] --stdin [-z]" + +#: builtin/update-ref.c:363 +msgid "delete the reference" +msgstr "ë í¼ë°ì¤ë¥¼ ìì í©ëë¤" + +#: builtin/update-ref.c:365 +msgid "update <refname> not the one it points to" +msgstr "<ë í¼ë°ì¤ì´ë¦>ì ê°ë¦¬í¤ì§ ìë í목ì¼ë¡ ì ë°ì´í¸í©ëë¤" + +#: builtin/update-ref.c:366 +msgid "stdin has NUL-terminated arguments" +msgstr "íì¤ ì ë ¥ì NULë¡ ëëë ì¸ìê° ììµëë¤" + +#: builtin/update-ref.c:367 +msgid "read updates from stdin" +msgstr "íì¤ ì ë ¥ìì ì ë°ì´í¸ë¥¼ ì½ìµëë¤" + +#: builtin/update-server-info.c:6 +msgid "git update-server-info [--force]" +msgstr "git update-server-info [--force]" + +#: builtin/update-server-info.c:14 +msgid "update the info files from scratch" +msgstr "ë°ë¥ë¶í° ì ë³´ íì¼ì ì ë°ì´í¸í©ëë¤" + +#: builtin/verify-commit.c:17 +msgid "git verify-commit [-v | --verbose] <commit>..." +msgstr "git verify-commit [-v | --verbose] <커ë°>..." + +#: builtin/verify-commit.c:72 +msgid "print commit contents" +msgstr "ì»¤ë° ë´ì©ì íìí©ëë¤" + +#: builtin/verify-commit.c:73 builtin/verify-tag.c:84 +msgid "print raw gpg status output" +msgstr "ì본 GPG ìí를 ì¶ë ¥í©ëë¤" + +#: builtin/verify-pack.c:54 +msgid "git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..." +msgstr "git verify-pack [-v | --verbose] [-s | --stat-only] <묶ì>..." + +#: builtin/verify-pack.c:64 +msgid "verbose" +msgstr "ìì¸í íì" + +#: builtin/verify-pack.c:66 +msgid "show statistics only" +msgstr "íµê³ë§ íì" + +#: builtin/verify-tag.c:17 +msgid "git verify-tag [-v | --verbose] <tag>..." +msgstr "git verify-tag [-v | --verbose] <íê·¸>..." + +#: builtin/verify-tag.c:83 +msgid "print tag contents" +msgstr "íê·¸ ë´ì© íì" + +#: builtin/worktree.c:15 +msgid "git worktree add [<options>] <path> [<branch>]" +msgstr "git worktree add [<ìµì >] <ê²½ë¡> [<ë¸ëì¹>]" + +#: builtin/worktree.c:16 +msgid "git worktree prune [<options>]" +msgstr "git worktree prune [<ìµì >]" + +#: builtin/worktree.c:17 +msgid "git worktree list [<options>]" +msgstr "git worktree list [<ìµì >]" + +#: builtin/worktree.c:39 +#, c-format +msgid "Removing worktrees/%s: not a valid directory" +msgstr "worktrees/%s ì ê±°: ì¬ë°ë¥¸ ëë í°ë¦¬ê° ìëëë¤" + +#: builtin/worktree.c:45 +#, c-format +msgid "Removing worktrees/%s: gitdir file does not exist" +msgstr "worktrees/%s ì ê±°: gitdir íì¼ì´ ììµëë¤" + +#: builtin/worktree.c:50 +#, c-format +msgid "Removing worktrees/%s: unable to read gitdir file (%s)" +msgstr "worktrees/%s ì ê±°: gitdir íì¼ì ì½ì ì ììµëë¤ (%s)" + +#: builtin/worktree.c:61 +#, c-format +msgid "Removing worktrees/%s: invalid gitdir file" +msgstr "worktrees/%s ì ê±°: gitdir íì¼ì´ ì¬ë°ë¥´ì§ ììµëë¤" + +#: builtin/worktree.c:77 +#, c-format +msgid "Removing worktrees/%s: gitdir file points to non-existent location" +msgstr "worktrees/%s ì ê±°: gitdir íì¼ì´ ìë ìì¹ë¥¼ ê°ë¦¬íµëë¤" + +#: builtin/worktree.c:112 +#, c-format +msgid "failed to remove: %s" +msgstr "ì ê±°ì ì¤í¨íìµëë¤: %s" + +#: builtin/worktree.c:201 +#, c-format +msgid "'%s' already exists" +msgstr "'%s'ì´(ê°) ì´ë¯¸ ììµëë¤" + +#: builtin/worktree.c:235 +#, c-format +msgid "could not create directory of '%s'" +msgstr "'%s'ì ëë í°ë¦¬ë¥¼ ë§ë¤ ì ììµëë¤" + +#: builtin/worktree.c:271 +#, c-format +msgid "Preparing %s (identifier %s)" +msgstr "%s ì¤ë¹ ì¤ (ID %s)" + +#: builtin/worktree.c:319 +msgid "checkout <branch> even if already checked out in other worktree" +msgstr "ë¤ë¥¸ ìì í´ëìì ì²´í¬ììíëë¼ë <ë¸ëì¹>를 ì²´í¬ììí©ëë¤" + +#: builtin/worktree.c:321 +msgid "create a new branch" +msgstr "ì ë¸ëì¹ë¥¼ ë§ëëë¤" + +#: builtin/worktree.c:323 +msgid "create or reset a branch" +msgstr "ë¸ëì¹ë¥¼ ë§ë¤ê±°ë 리ì í©ëë¤" + +#: builtin/worktree.c:324 +msgid "detach HEAD at named commit" +msgstr "HEAD를 í´ë¹ 커ë°ìì ë¶ë¦¬í©ëë¤" + +#: builtin/worktree.c:331 +msgid "-b, -B, and --detach are mutually exclusive" +msgstr "-b, -B, --detach ìµì ì¤ íëë§ ì¸ ì ììµëë¤" + +#: builtin/write-tree.c:13 +msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]" +msgstr "git write-tree [--missing-ok] [--prefix=<ì ëì´>/]" + +#: builtin/write-tree.c:26 +msgid "<prefix>/" +msgstr "<ì ëì´>/" + +#: builtin/write-tree.c:27 +msgid "write tree object for a subdirectory <prefix>" +msgstr "íì ëë í°ë¦¬ <ì ëì´>ì ëí´ í¸ë¦¬ ì¤ë¸ì í¸ë¥¼ ìëë¤" + +#: builtin/write-tree.c:30 +msgid "only useful for debugging" +msgstr "ëë²ê¹ ì©ëë¡ë§ ì¬ì©" + +#: credential-cache--daemon.c:255 +msgid "print debugging messages to stderr" +msgstr "ëë²ê¹ ë©ìì§ë¥¼ íì¤ì¤ë¥ë¡ ì¶ë ¥í©ëë¤" + +#: git.c:14 +msgid "" +"'git help -a' and 'git help -g' list available subcommands and some\n" +"concept guides. See 'git help <command>' or 'git help <concept>'\n" +"to read about a specific subcommand or concept." +msgstr "" +"'git help -a' ë° 'git help -g' ëª ë ¹ì ì¤ííë©´ íì ëª ë ¹ì´ì ê°ë ì¤ëª ìì\n" +"목ë¡ì ë³¼ ì ììµëë¤. í¹ì íì ëª ë ¹ì´ë ê°ë ì ëí´ ì½ì´ ë³´ë ¤ë©´ 'git help\n" +"<ëª ë ¹>' ëë 'git help <ê°ë >' ëª ë ¹ì ì¤ííììì¤." + +#: common-cmds.h:9 +msgid "start a working area (see also: git help tutorial)" +msgstr "ìì ê³µê° ìì (ì°¸ê³ : git help tutorial)" + +#: common-cmds.h:10 +msgid "work on the current change (see also: git help everyday)" +msgstr "ë³ê²½ ì¬íì ëí ìì (ì°¸ê³ : git help everyday)" + +#: common-cmds.h:11 +msgid "examine the history and state (see also: git help revisions)" +msgstr "ì»¤ë° ë´ìê³¼ ìí 보기 (ì°¸ê³ : git help revisions)" + +#: common-cmds.h:12 +msgid "grow, mark and tweak your common history" +msgstr "ì»¤ë° ë´ìì í¤ì°ê³ , íìíê³ , ì¡°ìí기" + +#: common-cmds.h:13 +msgid "collaborate (see also: git help workflows)" +msgstr "íë ìì (ì°¸ê³ : git help workflows)" + +#: common-cmds.h:17 +msgid "Add file contents to the index" +msgstr "íì¼ ë´ì©ì ì¸ë±ì¤ì ì¶ê°í©ëë¤" + +#: common-cmds.h:18 +msgid "Use binary search to find the commit that introduced a bug" +msgstr "ì´ì§ íìì¼ë¡ ë²ê·¸ë¥¼ ë§ë¤ì´ë¸ 커ë°ì ì°¾ìµëë¤" + +#: common-cmds.h:19 +msgid "List, create, or delete branches" +msgstr "ë¸ëì¹ë¥¼ ë§ë¤ê±°ë, ìì íê±°ë, 목ë¡ì ì¶ë ¥í©ëë¤" + +#: common-cmds.h:20 +msgid "Switch branches or restore working tree files" +msgstr "ë¸ëì¹ë¥¼ ì ííê±°ë ìì íì¼ì 복구í©ëë¤" + +#: common-cmds.h:21 +msgid "Clone a repository into a new directory" +msgstr "ì ì¥ì를 ë³µì í´ ì ëë í°ë¦¬ë¡ ê°ì ¸ ìµëë¤" + +#: common-cmds.h:22 +msgid "Record changes to the repository" +msgstr "ë°ë ì¬íì ì ì¥ìì 기ë¡í©ëë¤." + +#: common-cmds.h:23 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "커ë°ê³¼ ì»¤ë° ì¬ì´, 커ë°ê³¼ ìì ë´ì© ì¬ì´ ë±ì ë°ë ì ì ë´ ëë¤" + +#: common-cmds.h:24 +msgid "Download objects and refs from another repository" +msgstr "ë¤ë¥¸ ì ì¥ììì ì¤ë¸ì í¸ì ë í¼ë°ì¤ë¥¼ ë¤ì´ë¡ëí©ëë¤" + +#: common-cmds.h:25 +msgid "Print lines matching a pattern" +msgstr "í¨í´ê³¼ ì¼ì¹íë ì¤ì íìí©ëë¤" + +#: common-cmds.h:26 +msgid "Create an empty Git repository or reinitialize an existing one" +msgstr "ë¹ ê¹ ì ì¥ì를 ë§ë¤ê±°ë 기존 ì ì¥ì를 ë¤ì ì´ê¸°íí©ëë¤" + +#: common-cmds.h:27 +msgid "Show commit logs" +msgstr "ì»¤ë° ê¸°ë¡ì íìí©ëë¤" + +#: common-cmds.h:28 +msgid "Join two or more development histories together" +msgstr "ì¬ë¬ ê°ì ê°ë° ë´ìì íëë¡ í©ì¹©ëë¤" + +#: common-cmds.h:29 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "íì¼, ëë í°ë¦¬, ì¬ë³¼ë¦ ë§í¬ë¥¼ ì®ê¸°ê±°ë ì´ë¦ì ë°ê¿ëë¤" + +#: common-cmds.h:30 +msgid "Fetch from and integrate with another repository or a local branch" +msgstr "ë¤ë¥¸ ì ì¥ì ëë ë¤ë¥¸ ë¡ì»¬ ë¸ëì¹ìì ê°ì ¸ì¤ê±°ë íµí©í©ëë¤" + +#: common-cmds.h:31 +msgid "Update remote refs along with associated objects" +msgstr "ì격 ë í¼ë°ì¤ ë° ê·¸ì ê´ë ¨ë ì¤ë¸ì í¸ë¥¼ ì ë°ì´í¸í©ëë¤" + +#: common-cmds.h:32 +msgid "Forward-port local commits to the updated upstream head" +msgstr "ë¡ì»¬ 커ë°ì ì ë°ì´í¸ë ì ì¤í¸ë¦¼ head ë¤ìì ë§ì¶° ë£ìµëë¤" + +#: common-cmds.h:33 +msgid "Reset current HEAD to the specified state" +msgstr "íì¬ HEAD를 ì§ì í ìíë¡ ì¬ì¤ì íí©ëë¤" + +#: common-cmds.h:34 +msgid "Remove files from the working tree and from the index" +msgstr "íì¼ì ìì í´ëìì ì ê±°íê³ ì¸ë±ì¤ììë ì ê±°í©ëë¤" + +#: common-cmds.h:35 +msgid "Show various types of objects" +msgstr "ì¬ë¬ê°ì§ ì¢ ë¥ì ì¤ë¸ì í¸ë¥¼ íìí©ëë¤" + +#: common-cmds.h:36 +msgid "Show the working tree status" +msgstr "ìì í´ë ìí를 íìí©ëë¤" + +#: common-cmds.h:37 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "í그를 ë§ë¤ê±°ë, íìíê±°ë, ìì íê±°ë, GPG ìëª ì ê²ì¦í©ëë¤" + +#: parse-options.h:145 +msgid "expiry-date" +msgstr "ë§ë£-ìê°" + +#: parse-options.h:160 +msgid "no-op (backward compatibility)" +msgstr "ì무 ëìë íì§ ìì (í¸íì©)" + +#: parse-options.h:237 +msgid "be more verbose" +msgstr "ë ìì¸í íìí©ëë¤" + +#: parse-options.h:239 +msgid "be more quiet" +msgstr "ë ê°ëµí íìí©ëë¤" + +#: parse-options.h:245 +msgid "use <n> digits to display SHA-1s" +msgstr "SHA-1 íìì <n>ê°ì ì«ì를 ì¬ì©í©ëë¤" + +#: rerere.h:38 +msgid "update the index with reused conflict resolution if possible" +msgstr "ê°ë¥íë©´ ì¸ë±ì¤ë¥¼ ì¬ì¬ì©í 충ë í´ê²°ë¡ ì ë°ì´í¸í©ëë¤" + +#: git-bisect.sh:55 +msgid "You need to start by \"git bisect start\"" +msgstr "\"git bisect start\" ëª ë ¹ì¼ë¡ ììí´ì¼ í©ëë¤" + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:61 +msgid "Do you want me to do it for you [Y/n]? " +msgstr "ì§ê¸ íìê² ìµëê¹ [Y/n]? " + +#: git-bisect.sh:122 +#, sh-format +msgid "unrecognised option: '$arg'" +msgstr "ì ì ìë ìµì : '$arg'" + +#: git-bisect.sh:126 +#, sh-format +msgid "'$arg' does not appear to be a valid revision" +msgstr "'$arg'ì(ë) ì¬ë°ë¥¸ 리ë¹ì ì²ë¼ ë³´ì´ì§ ììµëë¤" + +#: git-bisect.sh:155 +msgid "Bad HEAD - I need a HEAD" +msgstr "ì못ë HEAD - HEADê° íìí©ëë¤" + +#: git-bisect.sh:168 +#, sh-format +msgid "" +"Checking out '$start_head' failed. Try 'git bisect reset <valid-branch>'." +msgstr "" +"'$start_head' ë°ìì¤ê¸°ê° ì¤í¨íìµëë¤. 'git bisect reset <valid-branch>'를 " +"í´ ë³´ììì¤." + +#: git-bisect.sh:178 +msgid "won't bisect on cg-seek'ed tree" +msgstr "cg-seekí í¸ë¦¬ìì bisect를 í ì ììµëë¤" + +#: git-bisect.sh:182 +msgid "Bad HEAD - strange symbolic ref" +msgstr "ì못ë HEAD - ì¬ë³¼ë¦ ë í¼ë°ì¤ê° ì못ëììµëë¤" + +#: git-bisect.sh:234 +#, sh-format +msgid "Bad bisect_write argument: $state" +msgstr "ì못ë bisect_write ì¸ì: $state" + +#: git-bisect.sh:263 +#, sh-format +msgid "Bad rev input: $arg" +msgstr "ì못ë 리ë¹ì ì ë ¥: $arg" + +#: git-bisect.sh:278 +msgid "Please call 'bisect_state' with at least one argument." +msgstr "'bisect_state' í¸ì¶ì ìµìí íëì ì¸ì를 ì¨ì¼ í©ëë¤." + +#: git-bisect.sh:290 +#, sh-format +msgid "Bad rev input: $rev" +msgstr "ì못ë 리ë¹ì ì ë ¥: $rev" + +#: git-bisect.sh:299 +#, sh-format +msgid "'git bisect $TERM_BAD' can take only one argument." +msgstr "'git bisect $TERM_BAD' ëª ë ¹ì íëì ì¸ìë§ ì¸ ì ììµëë¤." + +#: git-bisect.sh:322 +#, sh-format +msgid "Warning: bisecting only with a $TERM_BAD commit." +msgstr "ê²½ê³ : íëì $TERM_BAD 커ë°ì ëí´ìë§ ì´ë±ë¶." + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:328 +msgid "Are you sure [Y/n]? " +msgstr "íì¤í©ëê¹ [Y/n]? " + +#: git-bisect.sh:340 +#, sh-format +msgid "" +"You need to give me at least one $bad_syn and one $good_syn revision.\n" +"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)" +msgstr "" +"ìµìí íëì $bad_syn ë° íëì $good_syn 리ë¹ì ì ëê²¨ì¼ í©ëë¤.\n" +"(\"git bisect $bad_syn\" ë° \"git bisect $good_syn\" ëª ë ¹ì ì¤ííë©´ ë©ëë¤.)" + +#: git-bisect.sh:343 +#, sh-format +msgid "" +"You need to start by \"git bisect start\".\n" +"You then need to give me at least one $good_syn and one $bad_syn revision.\n" +"(You can use \"git bisect $bad_syn\" and \"git bisect $good_syn\" for that.)" +msgstr "" +"\"git bisect start\"를 ì¤íí´ì¼ í©ëë¤.\n" +"ê·¸ ë¤ì ìµìí íëì $good_syn ë° íëì $bad_syn 리ë¹ì ì ëê²¨ì¼ í©ëë¤\n" +"(\"git bisect $bad_syn\" ë° \"git bisect $good_syn\" ëª ë ¹ì ì¤ííë©´ ë©ëë¤.)" + +#: git-bisect.sh:414 git-bisect.sh:546 +msgid "We are not bisecting." +msgstr "ì´ë±ë¶íë ì¤ì ëë¤." + +#: git-bisect.sh:421 +#, sh-format +msgid "'$invalid' is not a valid commit" +msgstr "'$invalid'ì(ë) ì¬ë°ë¥¸ 커ë°ì´ ìëëë¤" + +#: git-bisect.sh:430 +#, sh-format +msgid "" +"Could not check out original HEAD '$branch'.\n" +"Try 'git bisect reset <commit>'." +msgstr "" +"본ëì HEAD '$branch'ì(를) ì²´í¬ììí ì ììµëë¤.\n" +"'git bisect reset <커ë°>'ì í´ ë³´ììì¤" + +#: git-bisect.sh:458 +msgid "No logfile given" +msgstr "ë¡ê·¸ íì¼ì´ 주ì´ì§ì§ ìììµëë¤" + +#: git-bisect.sh:459 +#, sh-format +msgid "cannot read $file for replaying" +msgstr "ë¤ì ì¬ìí $file íì¼ì ì½ì ì ììµëë¤" + +#: git-bisect.sh:480 +msgid "?? what are you talking about?" +msgstr "?? ë¬´ì¨ ì리ì¸ì§ ëª¨ë¥´ê² ìµëë¤?" + +#: git-bisect.sh:492 +#, sh-format +msgid "running $command" +msgstr "ì¤í: $command" + +#: git-bisect.sh:499 +#, sh-format +msgid "" +"bisect run failed:\n" +"exit code $res from '$command' is < 0 or >= 128" +msgstr "" +"ì´ë±ë¶ ì¤íì´ ì¤í¨íìµëë¤:\n" +"'$command' ëª ë ¹ìì ìí ì½ë '$res'ì´(ê°) 0ë³´ë¤ ìê±°ë 128ë³´ë¤ í½ëë¤" + +#: git-bisect.sh:525 +msgid "bisect run cannot continue any more" +msgstr "ì´ë±ë¶ ì¤íì ê³ì í ì ììµëë¤" + +#: git-bisect.sh:531 +#, sh-format +msgid "" +"bisect run failed:\n" +"'bisect_state $state' exited with error code $res" +msgstr "" +"ì´ë±ë¶ ì¤íì´ ì¤í¨íìµëë¤:\n" +"'bisect_state $state' ëª ë ¹ìì ìí ì½ëê° '$res'ì ëë¤" + +#: git-bisect.sh:538 +msgid "bisect run success" +msgstr "ì´ë±ë¶ ì¤í ì±ê³µ" + +#: git-bisect.sh:565 +msgid "please use two different terms" +msgstr "ë ë¤ë¥¸ ì©ì´ë¥¼ ì¬ì©íììì¤" + +#: git-bisect.sh:575 +#, sh-format +msgid "'$term' is not a valid term" +msgstr "'$term'ì´(ê°) ì¬ë°ë¥¸ ì©ì´ê° ìëëë¤" + +#: git-bisect.sh:578 +#, sh-format +msgid "can't use the builtin command '$term' as a term" +msgstr "ë´ë¶ ëª ë ¹ì´ '$term'ì(를) ì©ì´ë¡ ì¬ì©í ì ììµëë¤" + +#: git-bisect.sh:587 git-bisect.sh:593 +#, sh-format +msgid "can't change the meaning of term '$term'" +msgstr "ì©ì´ '$term'ì ì미를 ë°ê¿ ì ììµëë¤" + +#: git-bisect.sh:606 +#, sh-format +msgid "Invalid command: you're currently in a $TERM_BAD/$TERM_GOOD bisect." +msgstr "ì못ë ëª ë ¹ì´: íì¬ $TERM_BAD/$TERM_GOOD ì´ë±ë¶ ì¤ì ëë¤." + +#: git-bisect.sh:636 +msgid "no terms defined" +msgstr "ì©ì´ë¥¼ ì ìíì§ ìììµëë¤" + +#: git-bisect.sh:653 +#, sh-format +msgid "" +"invalid argument $arg for 'git bisect terms'.\n" +"Supported options are: --term-good|--term-old and --term-bad|--term-new." +msgstr "" +"'git bisect terms'ì ëí´ ì못ë ì¸ì '$arg'.\n" +"ì§ìíë ìµì ì: --term-good|--term-old ë° --term-bad|--term-new." + +#: git-rebase.sh:57 +msgid "" +"When you have resolved this problem, run \"git rebase --continue\".\n" +"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" +"To check out the original branch and stop rebasing, run \"git rebase --abort" +"\"." +msgstr "" +"ì´ ë¬¸ì 를 í´ê²°íë©´, \"\"git rebase --continue\"를 ì¤ííììì¤.\n" +"ì´ í¨ì¹ë¥¼ ê±´ëë°ë ¤ë©´, ëì ì \"git rebase --skip\"ì ì¤ííììì¤.\n" +"ìë ë¸ëì¹ë¥¼ ì²´í¬ììíê³ ë¦¬ë² ì´ì¤ë¥¼ ì¤ì§íë ¤ë©´, \"git rebase --abort\"를 ì¤ííììì¤." + +#: git-rebase.sh:165 +msgid "Applied autostash." +msgstr "ìëì¤íì ì ì©." + +#: git-rebase.sh:168 +#, sh-format +msgid "Cannot store $stash_sha1" +msgstr "\"$stash_sha1\"ì(를) ì ì¥í ì ììµëë¤" + +#: git-rebase.sh:169 +msgid "" +"Applying autostash resulted in conflicts.\n" +"Your changes are safe in the stash.\n" +"You can run \"git stash pop\" or \"git stash drop\" at any time.\n" +msgstr "" +"ìëì¤íì ì ì©ì 충ëì´ ë°ìíìµëë¤.\n" +"ë³ê²½ ì¬íì ì¤íì ìì ìì íê² ë¤ì´ ììµëë¤.\n" +"ì¸ì ë ì§ \"git stash pop\" ëë \"git stash drop\"ì ì¤íí ì ììµëë¤.\n" + +#: git-rebase.sh:208 +msgid "The pre-rebase hook refused to rebase." +msgstr "ë¦¬ë² ì´ì¤ ì íí¬ìì ë¦¬ë² ì´ì¤ë¥¼ ê±°ë¶íìµëë¤." + +#: git-rebase.sh:213 +msgid "It looks like git-am is in progress. Cannot rebase." +msgstr "git-amì´ ì§í ì¤ì¸ ê²ì²ë¼ ë³´ì ëë¤. ë¦¬ë² ì´ì¤í ì ììµëë¤." + +#: git-rebase.sh:354 +msgid "The --exec option must be used with the --interactive option" +msgstr "--exec ìµì ì --interactive ìµì ê³¼ ê°ì´ ì¬ì©í´ì¼ í©ëë¤" + +#: git-rebase.sh:359 +msgid "No rebase in progress?" +msgstr "ë¦¬ë² ì´ì¤ê° ì§í ì¤ì´ì§ ììµëë¤" + +#: git-rebase.sh:370 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "--edit-todo ëìì ëíí ë¦¬ë² ì´ì¤ììë§ ì¬ì©í ì ììµëë¤." + +#: git-rebase.sh:377 +msgid "Cannot read HEAD" +msgstr "HEAD를 ì½ì ì ììµëë¤" + +#: git-rebase.sh:380 +msgid "" +"You must edit all merge conflicts and then\n" +"mark them as resolved using git add" +msgstr "" +"모ë ë³í© 충ëì í¸ì§íê³ git add\n" +"ëª ë ¹ì¼ë¡ í´ê²°ëìë¤ê³ íìí´ì¼ í©ëë¤" + +#: git-rebase.sh:398 +#, sh-format +msgid "Could not move back to $head_name" +msgstr "'$head_name' ìì¹ë¡ ëìê° ì ììµëë¤" + +#: git-rebase.sh:417 +#, sh-format +msgid "" +"It seems that there is already a $state_dir_base directory, and\n" +"I wonder if you are in the middle of another rebase. If that is the\n" +"case, please try\n" +"\t$cmd_live_rebase\n" +"If that is not the case, please\n" +"\t$cmd_clear_stale_rebase\n" +"and run me again. I am stopping in case you still have something\n" +"valuable there." +msgstr "" +"ì´ë¯¸ '$state_dir_base' ëë í°ë¦¬ê° ìë ê²ì¼ë¡ ë³´ì, ì´ë¯¸\n" +"ë ë¤ë¥¸ ë¦¬ë² ì´ì¤ ì¤ì ìë ê² ê°ìµëë¤. ê·¸ë¬í ê²½ì°ìë\n" +"ë¤ìì ìëí´ ë³´ììì¤:\n" +"\t$cmd_live_rebase\n" +"ë¦¬ë² ì´ì¤ ì¤ì´ ìëë¼ë©´ ë¤ìì ìëíê³ ,\n" +"\t$cmd_clear_stale_rebase\n" +"ì´ ëª ë ¹ì ë¤ì ì¤ííììì¤. ì¤ìí ì¬íì´ ë¨ì ìì ê²½ì°ë¥¼\n" +"ëë¹í´ ì¬ê¸°ì ë©ì¶¥ëë¤." + +#: git-rebase.sh:468 +#, sh-format +msgid "invalid upstream $upstream_name" +msgstr "ì못ë ì ì¤í¸ë¦¼ $upstream_name" + +#: git-rebase.sh:492 +#, sh-format +msgid "$onto_name: there are more than one merge bases" +msgstr "$onto_name: ì¬ë¬ ê°ì ë³í© ë² ì´ì¤ê° ììµëë¤" + +#: git-rebase.sh:495 git-rebase.sh:499 +#, sh-format +msgid "$onto_name: there is no merge base" +msgstr "$onto_name: ë³í© ë² ì´ì¤ê° ììµëë¤" + +#: git-rebase.sh:504 +#, sh-format +msgid "Does not point to a valid commit: $onto_name" +msgstr "ì¬ë°ë¥¸ 커ë°ì ê°ë¦¬í¤ì§ ììµëë¤: $onto_name" + +#: git-rebase.sh:527 +#, sh-format +msgid "fatal: no such branch: $branch_name" +msgstr "ì¹ëª ì ì´ì: ê·¸ë° ë¸ëì¹ê° ììµëë¤: $branch_name" + +#: git-rebase.sh:560 +msgid "Cannot autostash" +msgstr "ìë ì¤íì를 í ì ììµëë¤" + +#: git-rebase.sh:565 +#, sh-format +msgid "Created autostash: $stash_abbrev" +msgstr "ìë ì¤íì를 ë§ë¤ììµëë¤: $stash_abbrev" + +#: git-rebase.sh:569 +msgid "Please commit or stash them." +msgstr "커ë°íê±°ë ì¤íìì ë£ì¼ììì¤." + +#: git-rebase.sh:589 +#, sh-format +msgid "Current branch $branch_name is up to date." +msgstr "íì¬ ë¸ëì¹ê° ($branch_name) ìµì ìíì ëë¤." + +#: git-rebase.sh:593 +#, sh-format +msgid "Current branch $branch_name is up to date, rebase forced." +msgstr "íì¬ ë¸ëì¹ê° ($branch_name) ìµì ìíì ëë¤. ê°ì ë¦¬ë² ì´ì¤í©ëë¤." + +#: git-rebase.sh:604 +#, sh-format +msgid "Changes from $mb to $onto:" +msgstr "ë³ê²½ ì¬í '$mb'ìì '$onto'(ì¼)ë¡:" + +#: git-rebase.sh:613 +msgid "First, rewinding head to replay your work on top of it..." +msgstr "ìì ì¬íì ë¤ì ë£ê¸° ìí´ ë¨¼ì í¤ë를 ë¤ë¡ ë립ëë¤..." + +#: git-rebase.sh:623 +#, sh-format +msgid "Fast-forwarded $branch_name to $onto_name." +msgstr "$branch_name ë¸ëì¹ë¥¼ $onto_name ìì¹ë¡ ì ë°©í¥ ì§íí©ëë¤." + +#: git-stash.sh:51 +msgid "git stash clear with parameters is unimplemented" +msgstr "git stash clear ëª ë ¹ì íë¼ë¯¸í°ì ê°ì´ ì°ê¸°ë 구íëì§ ìììµëë¤" + +#: git-stash.sh:74 +msgid "You do not have the initial commit yet" +msgstr "ìì§ ìµì´ 커ë°ì´ ììµëë¤" + +#: git-stash.sh:89 +msgid "Cannot save the current index state" +msgstr "íì¬ ì¸ë±ì¤ ìí를 ì ì¥í ì ììµëë¤" + +#: git-stash.sh:124 git-stash.sh:137 +msgid "Cannot save the current worktree state" +msgstr "íì¬ ìì í´ë ìí를 ì ì¥í ì ììµëë¤" + +#: git-stash.sh:141 +msgid "No changes selected" +msgstr "ë³ê²½ ì¬íì ì ííì§ ìììµëë¤" + +#: git-stash.sh:144 +msgid "Cannot remove temporary index (can't happen)" +msgstr "ìì ì¸ë±ì¤ë¥¼ ì ê±°í ì ììµëë¤ (ì¼ì´ë ì ìë ìí©)" + +#: git-stash.sh:157 +msgid "Cannot record working tree state" +msgstr "ìì í´ë ìí를 기ë¡í ì ììµëë¤" + +#: git-stash.sh:189 +#, sh-format +msgid "Cannot update $ref_stash with $w_commit" +msgstr "$ref_stashì(를) $w_commit(ì¼)ë¡ ì ë°ì´í¸í ì ììµëë¤" + +#. TRANSLATORS: $option is an invalid option, like +#. `--blah-blah'. The 7 spaces at the beginning of the +#. second line correspond to "error: ". So you should line +#. up the second line with however many characters the +#. translation of "error: " takes in your language. E.g. in +#. English this is: +#. +#. $ git stash save --blah-blah 2>&1 | head -n 2 +#. error: unknown option for 'stash save': --blah-blah +#. To provide a message, use git stash save -- '--blah-blah' +#: git-stash.sh:239 +#, sh-format +msgid "" +"error: unknown option for 'stash save': $option\n" +" To provide a message, use git stash save -- '$option'" +msgstr "" +"ì¤ë¥: 'stash save'ì ëí´ ì ì ìë ìµì : $option\n" +" ë©ìì§ë¥¼ ëê¸°ë ¤ë©´, ë¤ìê³¼ ê°ì´ ì°ììì¤: git stash save -- '$option'" + +#: git-stash.sh:260 +msgid "No local changes to save" +msgstr "ì ì¥í ë¡ì»¬ ë³ê²½ ì¬íì´ ììµëë¤" + +#: git-stash.sh:264 +msgid "Cannot initialize stash" +msgstr "ì¤íì를 ì´ê¸°íí ì ììµëë¤" + +#: git-stash.sh:268 +msgid "Cannot save the current status" +msgstr "íì¬ ìí를 ì ì¥í ì ììµëë¤" + +#: git-stash.sh:286 +msgid "Cannot remove worktree changes" +msgstr "ìì í´ë ë³ê²½ ì¬íì ì ê±°í ì ììµëë¤" + +#: git-stash.sh:405 +#, sh-format +msgid "unknown option: $opt" +msgstr "ì ì ìë ìµì : $opt" + +#: git-stash.sh:415 +msgid "No stash found." +msgstr "ì¤íìê° ììµëë¤." + +#: git-stash.sh:422 +#, sh-format +msgid "Too many revisions specified: $REV" +msgstr "ë무 ë§ì 리ë¹ì ì ì§ì íìµëë¤: $REV" + +#: git-stash.sh:428 +#, sh-format +msgid "$reference is not a valid reference" +msgstr "$referenceì(ë) ì¬ë°ë¥¸ ë í¼ë°ì¤ê° ìëëë¤" + +#: git-stash.sh:456 +#, sh-format +msgid "'$args' is not a stash-like commit" +msgstr "'$args'ì(ë) ì¤íì 커ë°ì´ ìëëë¤" + +#: git-stash.sh:467 +#, sh-format +msgid "'$args' is not a stash reference" +msgstr "'$args'ì(ë) ì¤íì ë í¼ë°ì¤ê° ìëëë¤" + +#: git-stash.sh:475 +msgid "unable to refresh index" +msgstr "ì¸ë±ì¤ë¥¼ ìë¡ ê³ ì¹ ì ììµëë¤" + +#: git-stash.sh:479 +msgid "Cannot apply a stash in the middle of a merge" +msgstr "ë³í© ëì¤ì ì¤íì를 ì ì©í ì ììµëë¤" + +#: git-stash.sh:487 +msgid "Conflicts in index. Try without --index." +msgstr "ì¸ë±ì¤ì 충ë. --index ìì´ ìëí´ ë³´ììì¤." + +#: git-stash.sh:489 +msgid "Could not save index tree" +msgstr "ì¸ë±ì¤ í¸ë¦¬ë¥¼ ì ì¥í ì ììµëë¤" + +#: git-stash.sh:523 +msgid "Cannot unstage modified files" +msgstr "ìì í íì¼ì ì¤í ì´ì§ìì ëº ì ììµëë¤" + +#: git-stash.sh:538 +msgid "Index was not unstashed." +msgstr "ì¸ë±ì¤ê° ì¤íììì ë¹ ì¡ìµëë¤." + +#: git-stash.sh:561 +#, sh-format +msgid "Dropped ${REV} ($s)" +msgstr "${REV} ì§ì ($s)" + +#: git-stash.sh:562 +#, sh-format +msgid "${REV}: Could not drop stash entry" +msgstr "${REV}: ì¤íì í목ì ì§ì¸ ì ììµëë¤" + +#: git-stash.sh:570 +msgid "No branch name specified" +msgstr "ë¸ëì¹ ì´ë¦ì ì§ì íì§ ìììµëë¤" + +#: git-stash.sh:642 +msgid "(To restore them type \"git stash apply\")" +msgstr "(복구íë ¤ë©´ \"git stash apply\"를 ì¤ííììì¤)" + +#: git-submodule.sh:104 +#, sh-format +msgid "cannot strip one component off url '$remoteurl'" +msgstr "'$remoteurl' URLìì íëì í목ì ìë¼ë¼ ì ììµëë¤" + +#: git-submodule.sh:281 +msgid "Relative path can only be used from the toplevel of the working tree" +msgstr "ìë ê²½ë¡ë ìì í´ëì ìµììììë§ ì¸ ì ììµëë¤" + +#: git-submodule.sh:291 +#, sh-format +msgid "repo URL: '$repo' must be absolute or begin with ./|../" +msgstr "ì ì¥ì URL: '$repo' ê°ì ì ë ê²½ë¡ê±°ë ./ ëë ../ë¡ ììí´ì¼ í©ëë¤." + +#: git-submodule.sh:308 +#, sh-format +msgid "'$sm_path' already exists in the index" +msgstr "'$sm_path'ì(ë) ì´ë¯¸ ì¸ë±ì¤ì ììµëë¤" + +#: git-submodule.sh:312 +#, sh-format +msgid "" +"The following path is ignored by one of your .gitignore files:\n" +"$sm_path\n" +"Use -f if you really want to add it." +msgstr "" +"ë¤ì ê²½ë¡ë .gitignore íì¼ìì 무ìí©ëë¤:\n" +"$sm_path\n" +"ì ë§ë¡ ì¶ê°íë ¤ë©´ -f ìµì ì ì¬ì©íììì¤." + +#: git-submodule.sh:330 +#, sh-format +msgid "Adding existing repo at '$sm_path' to the index" +msgstr "'$sm_path'ì 기존 ì ì¥ì를 ì¸ë±ì¤ì ì¶ê°í©ëë¤" + +#: git-submodule.sh:332 +#, sh-format +msgid "'$sm_path' already exists and is not a valid git repo" +msgstr "'$sm_path'ì´(ê°) ì´ë¯¸ ìê³ ì¬ë°ë¥¸ git ì ì¥ìê° ìëëë¤" + +#: git-submodule.sh:340 +#, sh-format +msgid "A git directory for '$sm_name' is found locally with remote(s):" +msgstr "'$sm_name'ì ëí ê¹ ëë í°ë¦¬ê° ë¡ì»¬ìì 리모í¸ê° ìë ì±ë¡ ììµëë¤:" + +#: git-submodule.sh:342 +#, sh-format +msgid "" +"If you want to reuse this local git directory instead of cloning again from" +msgstr "ë¤ì ë³µì íì§ ìê³ ì´ ë¡ì»¬ ê¹ ëë í°ë¦¬ë¥¼ ì¬íì©íë ¤ë©´" + +#: git-submodule.sh:344 +#, sh-format +msgid "" +"use the '--force' option. If the local git directory is not the correct repo" +msgstr "" +"'--force' ìµì ì ì¬ì©íììì¤. ë¡ì»¬ ê¹ ëë í°ë¦¬ê° ì¬ë°ë¥¸ ì ì¥ìê° ìëê±°ë" + +#: git-submodule.sh:345 +#, sh-format +msgid "" +"or you are unsure what this means choose another name with the '--name' " +"option." +msgstr "ë¬´ì¨ ì미ì¸ì§ ì ëª¨ë¥´ê² ë¤ë©´ '--name' ìµì ì¼ë¡ ë¤ë¥¸ ì´ë¦ì ì°ììì¤." + +#: git-submodule.sh:347 +#, sh-format +msgid "Reactivating local git directory for submodule '$sm_name'." +msgstr "ë¡ì»¬ ê¹ ëë í°ë¦¬ë¥¼ '$sm_name' íì모ëë¡ ë¤ì íì±íí©ëë¤." + +#: git-submodule.sh:359 +#, sh-format +msgid "Unable to checkout submodule '$sm_path'" +msgstr "'$sm_path' íì 모ëì ì²´í¬ììí ì ììµëë¤" + +#: git-submodule.sh:364 +#, sh-format +msgid "Failed to add submodule '$sm_path'" +msgstr "'$sm_path' íì 모ëì ì¶ê°íëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:373 +#, sh-format +msgid "Failed to register submodule '$sm_path'" +msgstr "'$sm_path' íì 모ëì ë±ë¡íëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:417 +#, sh-format +msgid "Entering '$prefix$displaypath'" +msgstr "'$prefix$displaypath' ì ë ¥" + +#: git-submodule.sh:437 +#, sh-format +msgid "Stopping at '$prefix$displaypath'; script returned non-zero status." +msgstr "'$prefix$displaypath' ìì¹ìì ë©ì¶¤. ì¤í¬ë¦½í¸ìì 0ì´ ìë ìí를 리í´íìµëë¤." + +#: git-submodule.sh:483 +#, sh-format +msgid "No url found for submodule path '$displaypath' in .gitmodules" +msgstr ".gitmodulesìì íì 모ë ê²½ë¡ '$displaypath'ì ëí URLì´ ììµëë¤" + +#: git-submodule.sh:492 +#, sh-format +msgid "Failed to register url for submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ì ëí URLì ë±ë¡íëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:494 +#, sh-format +msgid "Submodule '$name' ($url) registered for path '$displaypath'" +msgstr "'$displaypath' ê²½ë¡ì ($url) ëí´ ë±ë¡ë '$name' íì 모ë" + +#: git-submodule.sh:511 +#, sh-format +msgid "Failed to register update mode for submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ì ëí´ ì ë°ì´í¸ 모ë를 ë±ë¡íëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:549 +#, sh-format +msgid "Use '.' if you really want to deinitialize all submodules" +msgstr "ì ë§ë¡ 모ë íì 모ë ì´ê¸°í를 í´ì íë ¤ë©´ '.'ì ì¬ì©íììì¤" + +#: git-submodule.sh:566 +#, sh-format +msgid "Submodule work tree '$displaypath' contains a .git directory" +msgstr "íì 모ë ìì í´ëì ('$displaypath') .git ëë í°ë¦¬ê° ë¤ì´ ììµëë¤" + +#: git-submodule.sh:567 +#, sh-format +msgid "" +"(use 'rm -rf' if you really want to remove it including all of its history)" +msgstr "(ì ë§ë¡ ê·¸ ì»¤ë° ë´ìê¹ì§ í¬í¨í´ ì ê±°íë ¤ë©´ 'rm -rf'를 ì¬ì©íììì¤)" + +#: git-submodule.sh:573 +#, sh-format +msgid "" +"Submodule work tree '$displaypath' contains local modifications; use '-f' to " +"discard them" +msgstr "íì 모ë ìì í´ëì ('$displaypath') ë¡ì»¬ ìì ì¬íì´ ììµëë¤. ë²ë¦¬ë ¤ë©´ '-f'를 ì¬ì©íììì¤" + +#: git-submodule.sh:576 +#, sh-format +msgid "Cleared directory '$displaypath'" +msgstr "'$displaypath' ëë í°ë¦¬ë¥¼ ì§ìëë¤" + +#: git-submodule.sh:577 +#, sh-format +msgid "Could not remove submodule work tree '$displaypath'" +msgstr "íì 모ë ëë í°ë¦¬ë¥¼ ('$displaypath') ì ê±°í ì ììµëë¤" + +#: git-submodule.sh:580 +#, sh-format +msgid "Could not create empty submodule directory '$displaypath'" +msgstr "ë¹ íì 모ë ëë í°ë¦¬ë¥¼ ('$displaypath') ë§ë¤ ì ììµëë¤" + +#: git-submodule.sh:589 +#, sh-format +msgid "Submodule '$name' ($url) unregistered for path '$displaypath'" +msgstr "'$name' íì 모ëì´ ($url) '$displaypath' ê²½ë¡ì ëí´ ë±ë¡ëì§ ìììµëë¤" + +#: git-submodule.sh:705 +#, sh-format +msgid "" +"Submodule path '$displaypath' not initialized\n" +"Maybe you want to use 'update --init'?" +msgstr "" +"íì 모ë ê²½ë¡ê° ('$displaypath') ì´ê¸°íëì§ ìììµëë¤\n" +"ìë§ë 'update --init'ì´ íìí©ëë¤?" + +#: git-submodule.sh:718 +#, sh-format +msgid "Unable to find current revision in submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ìì ('$displaypath') íì¬ ë¦¬ë¹ì ì ì°¾ì ì ììµëë¤" + +#: git-submodule.sh:727 +#, sh-format +msgid "Unable to fetch in submodule path '$sm_path'" +msgstr "íì 모ë ê²½ë¡ '$sm_path'ìì ê°ì ¸ì¬ ì ììµëë¤" + +#: git-submodule.sh:751 +#, sh-format +msgid "Unable to fetch in submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ìì ê°ì ¸ì¬ ì ììµëë¤" + +#: git-submodule.sh:765 +#, sh-format +msgid "Unable to checkout '$sha1' in submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ìì '$sha1'ì(를) ì²´í¬ììí ì ììµëë¤" + +#: git-submodule.sh:766 +#, sh-format +msgid "Submodule path '$displaypath': checked out '$sha1'" +msgstr "íì 모ë ê²½ë¡ '$displaypath': '$sha1' ì²´í¬ìì" + +#: git-submodule.sh:770 +#, sh-format +msgid "Unable to rebase '$sha1' in submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ìì '$sha1'ì(를) ë¦¬ë² ì´ì¤í ì ììµëë¤" + +#: git-submodule.sh:771 +#, sh-format +msgid "Submodule path '$displaypath': rebased into '$sha1'" +msgstr "íì 모ë ê²½ë¡ '$displaypath': '$sha1'(ì¼)ë¡ ë¦¬ë² ì´ì¤" + +#: git-submodule.sh:776 +#, sh-format +msgid "Unable to merge '$sha1' in submodule path '$displaypath'" +msgstr "íì 모ë ê²½ë¡ '$displaypath'ìì '$sha1' ë³í©í ì ììµëë¤" + +#: git-submodule.sh:777 +#, sh-format +msgid "Submodule path '$displaypath': merged in '$sha1'" +msgstr "íì 모ë ê²½ë¡ '$displaypath': '$sha1'ìì ë³í©" + +#: git-submodule.sh:782 +#, sh-format +msgid "" +"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'" +msgstr "íì 모ë ê²½ë¡ '$prefix$sm_path'ìì '$command $sha1' ì¤íì´ ì¤í¨íìµëë¤" + +#: git-submodule.sh:783 +#, sh-format +msgid "Submodule path '$prefix$sm_path': '$command $sha1'" +msgstr "íì 모ë ê²½ë¡ '$prefix$sm_path': '$command $sha1'" + +#: git-submodule.sh:813 +#, sh-format +msgid "Failed to recurse into submodule path '$displaypath'" +msgstr "ì¬ê·ì ì¼ë¡ íì 모ë ê²½ë¡ '$displaypath'ì ë¤ì´ê°ëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:921 +msgid "The --cached option cannot be used with the --files option" +msgstr "--cached ìµì ì --files ìµì ê³¼ ê°ì´ ì¸ ì ììµëë¤" + +#: git-submodule.sh:973 +#, sh-format +msgid "unexpected mode $mod_dst" +msgstr "ììì¹ ëª»í 모ë $mod_dst" + +#: git-submodule.sh:993 +#, sh-format +msgid " Warn: $display_name doesn't contain commit $sha1_src" +msgstr " ê²½ê³ : '$display_name'ì '$sha1_src' 커ë°ì´ ë¤ì´ìì§ ììµëë¤" + +#: git-submodule.sh:996 +#, sh-format +msgid " Warn: $display_name doesn't contain commit $sha1_dst" +msgstr " ê²½ê³ : '$display_name'ì '$sha1_dst' 커ë°ì´ ë¤ì´ìì§ ììµëë¤" + +#: git-submodule.sh:999 +#, sh-format +msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst" +msgstr " ê²½ê³ : '$display_name'ì '$sha1_src' ë° '$sha1_dst' 커ë°ì´ ë¤ì´ìì§ ììµëë¤" + +#: git-submodule.sh:1024 +msgid "blob" +msgstr "ë¸ë¡" + +#: git-submodule.sh:1142 +#, sh-format +msgid "Failed to recurse into submodule path '$sm_path'" +msgstr "ì¬ê·ì ì¼ë¡ íì 모ë ê²½ë¡ '$sm_path'ì ë¤ì´ê°ëë° ì¤í¨íìµëë¤" + +#: git-submodule.sh:1206 +#, sh-format +msgid "Synchronizing submodule url for '$displaypath'" +msgstr "íì 모ë URLì '$displaypath'ì ëí´ ë기í" diff --git a/read-cache.c b/read-cache.c index 84616c8e21..5be7cd1dbf 100644 --- a/read-cache.c +++ b/read-cache.c @@ -327,7 +327,7 @@ int ie_match_stat(const struct index_state *istate, * by definition never matches what is in the work tree until it * actually gets added. */ - if (ce->ce_flags & CE_INTENT_TO_ADD) + if (ce_intent_to_add(ce)) return DATA_CHANGED | TYPE_CHANGED | MODE_CHANGED; changed = ce_match_stat_basic(ce, st); @@ -1237,7 +1237,7 @@ int refresh_index(struct index_state *istate, unsigned int flags, if (cache_errno == ENOENT) fmt = deleted_fmt; - else if (ce->ce_flags & CE_INTENT_TO_ADD) + else if (ce_intent_to_add(ce)) fmt = added_fmt; /* must be before other checks */ else if (changed & TYPE_CHANGED) fmt = typechange_fmt; diff --git a/ref-filter.c b/ref-filter.c index 7bef7f8dac..f097176ed9 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -763,6 +763,29 @@ static inline char *copy_advance(char *dst, const char *src) return dst; } +static const char *strip_ref_components(const char *refname, const char *nr_arg) +{ + char *end; + long nr = strtol(nr_arg, &end, 10); + long remaining = nr; + const char *start = refname; + + if (nr < 1 || *end != '\0') + die(":strip= requires a positive integer argument"); + + while (remaining) { + switch (*start++) { + case '\0': + die("ref '%s' does not have %ld components to :strip", + refname, nr); + case '/': + remaining--; + break; + } + } + return start; +} + /* * Parse the object referred by ref, and grab needed value. */ @@ -909,11 +932,14 @@ static void populate_value(struct ref_array_item *ref) formatp = strchr(name, ':'); if (formatp) { int num_ours, num_theirs; + const char *arg; formatp++; if (!strcmp(formatp, "short")) refname = shorten_unambiguous_ref(refname, warn_ambiguous_refs); + else if (skip_prefix(formatp, "strip=", &arg)) + refname = strip_ref_components(refname, arg); else if (!strcmp(formatp, "track") && (starts_with(name, "upstream") || starts_with(name, "push"))) { diff --git a/reflog-walk.c b/reflog-walk.c index 85b8a54241..0ebd1da5ce 100644 --- a/reflog-walk.c +++ b/reflog-walk.c @@ -221,6 +221,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit) struct commit_info *commit_info = get_commit_info(commit, &info->reflogs, 0); struct commit_reflog *commit_reflog; + struct object *logobj; struct reflog_info *reflog; info->last_commit_reflog = NULL; @@ -232,15 +233,20 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit) commit->parents = NULL; return; } - - reflog = &commit_reflog->reflogs->items[commit_reflog->recno]; info->last_commit_reflog = commit_reflog; - commit_reflog->recno--; - commit_info->commit = (struct commit *)parse_object(reflog->osha1); - if (!commit_info->commit) { + + do { + reflog = &commit_reflog->reflogs->items[commit_reflog->recno]; + commit_reflog->recno--; + logobj = parse_object(reflog->osha1); + } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT)); + + if (!logobj || logobj->type != OBJ_COMMIT) { + commit_info->commit = NULL; commit->parents = NULL; return; } + commit_info->commit = (struct commit *)logobj; commit->parents = xcalloc(1, sizeof(struct commit_list)); commit->parents->item = commit_info->commit; diff --git a/refs.h b/refs.h index 7a04077489..3c3da29bf0 100644 --- a/refs.h +++ b/refs.h @@ -292,7 +292,7 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict); /** rename ref, return 0 on success **/ extern int rename_ref(const char *oldref, const char *newref, const char *logmsg); -extern int create_symref(const char *ref, const char *refs_heads_master, const char *logmsg); +extern int create_symref(const char *refname, const char *target, const char *logmsg); enum action_on_err { UPDATE_REFS_MSG_ON_ERR, diff --git a/refs/files-backend.c b/refs/files-backend.c index c648b5e853..81c92b410e 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1840,12 +1840,17 @@ static int verify_lock(struct ref_lock *lock, if (read_ref_full(lock->ref_name, mustexist ? RESOLVE_REF_READING : 0, lock->old_oid.hash, NULL)) { - int save_errno = errno; - strbuf_addf(err, "can't verify ref %s", lock->ref_name); - errno = save_errno; - return -1; + if (old_sha1) { + int save_errno = errno; + strbuf_addf(err, "can't verify ref %s", lock->ref_name); + errno = save_errno; + return -1; + } else { + hashclr(lock->old_oid.hash); + return 0; + } } - if (hashcmp(lock->old_oid.hash, old_sha1)) { + if (old_sha1 && hashcmp(lock->old_oid.hash, old_sha1)) { strbuf_addf(err, "ref %s is at %s but expected %s", lock->ref_name, sha1_to_hex(lock->old_oid.hash), @@ -1882,7 +1887,8 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, const char *orig_refname = refname; struct ref_lock *lock; int last_errno = 0; - int type, lflags; + int type; + int lflags = 0; int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int resolve_flags = 0; int attempts_remaining = 3; @@ -1893,10 +1899,11 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, if (mustexist) resolve_flags |= RESOLVE_REF_READING; - if (flags & REF_DELETING) { + if (flags & REF_DELETING) resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME; - if (flags & REF_NODEREF) - resolve_flags |= RESOLVE_REF_NO_RECURSE; + if (flags & REF_NODEREF) { + resolve_flags |= RESOLVE_REF_NO_RECURSE; + lflags |= LOCK_NO_DEREF; } refname = resolve_ref_unsafe(refname, resolve_flags, @@ -1932,6 +1939,10 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, goto error_return; } + + if (flags & REF_NODEREF) + refname = orig_refname; + /* * If the ref did not exist and we are creating it, make sure * there is no existing packed ref whose name begins with our @@ -1947,11 +1958,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, lock->lk = xcalloc(1, sizeof(struct lock_file)); - lflags = 0; - if (flags & REF_NODEREF) { - refname = orig_refname; - lflags |= LOCK_NO_DEREF; - } lock->ref_name = xstrdup(refname); lock->orig_ref_name = xstrdup(orig_refname); strbuf_git_path(&ref_file, "%s", refname); @@ -1985,7 +1991,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, goto error_return; } } - if (old_sha1 && verify_lock(lock, old_sha1, mustexist, err)) { + if (verify_lock(lock, old_sha1, mustexist, err)) { last_errno = errno; goto error_return; } @@ -2811,73 +2817,72 @@ static int commit_ref_update(struct ref_lock *lock, return 0; } -int create_symref(const char *ref_target, const char *refs_heads_master, - const char *logmsg) +static int create_ref_symlink(struct ref_lock *lock, const char *target) { - char *lockpath = NULL; - char ref[1000]; - int fd, len, written; - char *git_HEAD = git_pathdup("%s", ref_target); - unsigned char old_sha1[20], new_sha1[20]; - struct strbuf err = STRBUF_INIT; - - if (logmsg && read_ref(ref_target, old_sha1)) - hashclr(old_sha1); - - if (safe_create_leading_directories(git_HEAD) < 0) - return error("unable to create directory for %s", git_HEAD); - + int ret = -1; #ifndef NO_SYMLINK_HEAD - if (prefer_symlink_refs) { - unlink(git_HEAD); - if (!symlink(refs_heads_master, git_HEAD)) - goto done; + char *ref_path = get_locked_file_path(lock->lk); + unlink(ref_path); + ret = symlink(target, ref_path); + free(ref_path); + + if (ret) fprintf(stderr, "no symlink - falling back to symbolic ref\n"); - } #endif + return ret; +} - len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master); - if (sizeof(ref) <= len) { - error("refname too long: %s", refs_heads_master); - goto error_free_return; - } - lockpath = mkpathdup("%s.lock", git_HEAD); - fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666); - if (fd < 0) { - error("Unable to open %s for writing", lockpath); - goto error_free_return; - } - written = write_in_full(fd, ref, len); - if (close(fd) != 0 || written != len) { - error("Unable to write to %s", lockpath); - goto error_unlink_return; - } - if (rename(lockpath, git_HEAD) < 0) { - error("Unable to create %s", git_HEAD); - goto error_unlink_return; - } - if (adjust_shared_perm(git_HEAD)) { - error("Unable to fix permissions on %s", lockpath); - error_unlink_return: - unlink_or_warn(lockpath); - error_free_return: - free(lockpath); - free(git_HEAD); - return -1; +static void update_symref_reflog(struct ref_lock *lock, const char *refname, + const char *target, const char *logmsg) +{ + struct strbuf err = STRBUF_INIT; + unsigned char new_sha1[20]; + if (logmsg && !read_ref(target, new_sha1) && + log_ref_write(refname, lock->old_oid.hash, new_sha1, logmsg, 0, &err)) { + error("%s", err.buf); + strbuf_release(&err); } - free(lockpath); +} -#ifndef NO_SYMLINK_HEAD - done: -#endif - if (logmsg && !read_ref(refs_heads_master, new_sha1) && - log_ref_write(ref_target, old_sha1, new_sha1, logmsg, 0, &err)) { +static int create_symref_locked(struct ref_lock *lock, const char *refname, + const char *target, const char *logmsg) +{ + if (prefer_symlink_refs && !create_ref_symlink(lock, target)) { + update_symref_reflog(lock, refname, target, logmsg); + return 0; + } + + if (!fdopen_lock_file(lock->lk, "w")) + return error("unable to fdopen %s: %s", + lock->lk->tempfile.filename.buf, strerror(errno)); + + update_symref_reflog(lock, refname, target, logmsg); + + /* no error check; commit_ref will check ferror */ + fprintf(lock->lk->tempfile.fp, "ref: %s\n", target); + if (commit_ref(lock) < 0) + return error("unable to write symref for %s: %s", refname, + strerror(errno)); + return 0; +} + +int create_symref(const char *refname, const char *target, const char *logmsg) +{ + struct strbuf err = STRBUF_INIT; + struct ref_lock *lock; + int ret; + + lock = lock_ref_sha1_basic(refname, NULL, NULL, NULL, REF_NODEREF, NULL, + &err); + if (!lock) { error("%s", err.buf); strbuf_release(&err); + return -1; } - free(git_HEAD); - return 0; + ret = create_symref_locked(lock, refname, target, logmsg); + unlock_ref(lock); + return ret; } int reflog_exists(const char *refname) diff --git a/remote-curl.c b/remote-curl.c index f404faf0f4..c7048575fb 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -827,7 +827,7 @@ static void parse_fetch(struct strbuf *buf) die("http transport does not support %s", buf->buf); strbuf_reset(buf); - if (strbuf_getline(buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(buf, stdin) == EOF) return; if (!*buf->buf) break; @@ -940,7 +940,7 @@ static void parse_push(struct strbuf *buf) die("http transport does not support %s", buf->buf); strbuf_reset(buf); - if (strbuf_getline(buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(buf, stdin) == EOF) goto free_specs; if (!*buf->buf) break; @@ -990,7 +990,7 @@ int main(int argc, const char **argv) do { const char *arg; - if (strbuf_getline(&buf, stdin, '\n') == EOF) { + if (strbuf_getline_lf(&buf, stdin) == EOF) { if (ferror(stdin)) error("remote-curl: error reading command stream from git"); return 1; diff --git a/remote-testsvn.c b/remote-testsvn.c index f599c372c6..f05ff45298 100644 --- a/remote-testsvn.c +++ b/remote-testsvn.c @@ -154,7 +154,7 @@ static void check_or_regenerate_marks(int latestrev) fclose(marksfile); } else { strbuf_addf(&sb, ":%d ", latestrev); - while (strbuf_getline(&line, marksfile, '\n') != EOF) { + while (strbuf_getline_lf(&line, marksfile) != EOF) { if (starts_with(line.buf, sb.buf)) { found++; break; @@ -322,7 +322,7 @@ int main(int argc, char **argv) marksfilename = marksfilename_sb.buf; while (1) { - if (strbuf_getline(&buf, stdin, '\n') == EOF) { + if (strbuf_getline_lf(&buf, stdin) == EOF) { if (ferror(stdin)) die("Error reading command stream"); else diff --git a/remote.c b/remote.c index 9d34b5a5da..7d61dabebb 100644 --- a/remote.c +++ b/remote.c @@ -256,7 +256,7 @@ static void read_remotes_file(struct remote *remote) if (!f) return; remote->origin = REMOTE_REMOTES; - while (strbuf_getline(&buf, f, '\n') != EOF) { + while (strbuf_getline(&buf, f) != EOF) { const char *v; strbuf_rtrim(&buf); @@ -281,7 +281,7 @@ static void read_branches_file(struct remote *remote) if (!f) return; - strbuf_getline(&buf, f, '\n'); + strbuf_getline_lf(&buf, f); fclose(f); strbuf_trim(&buf); if (!buf.len) { diff --git a/revision.c b/revision.c index 0a282f533b..f24ead53d5 100644 --- a/revision.c +++ b/revision.c @@ -1635,10 +1635,7 @@ static void append_prune_data(struct cmdline_pathspec *prune, const char **av) static void read_pathspec_from_stdin(struct rev_info *revs, struct strbuf *sb, struct cmdline_pathspec *prune) { - while (strbuf_getwholeline(sb, stdin, '\n') != EOF) { - int len = sb->len; - if (len && sb->buf[len - 1] == '\n') - sb->buf[--len] = '\0'; + while (strbuf_getline(sb, stdin) != EOF) { ALLOC_GROW(prune->path, prune->nr + 1, prune->alloc); prune->path[prune->nr++] = xstrdup(sb->buf); } @@ -1655,10 +1652,8 @@ static void read_revisions_from_stdin(struct rev_info *revs, warn_on_object_refname_ambiguity = 0; strbuf_init(&sb, 1000); - while (strbuf_getwholeline(&sb, stdin, '\n') != EOF) { + while (strbuf_getline(&sb, stdin) != EOF) { int len = sb.len; - if (len && sb.buf[len - 1] == '\n') - sb.buf[--len] = '\0'; if (!len) break; if (sb.buf[0] == '-') { @@ -2049,7 +2044,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if (!strcmp(arg, "--ignore-missing")) { revs->ignore_missing = 1; } else { - int opts = diff_opt_parse(&revs->diffopt, argv, argc); + int opts = diff_opt_parse(&revs->diffopt, argv, argc, revs->prefix); if (!opts) unkv[(*unkc)++] = arg; return opts; diff --git a/run-command.c b/run-command.c index 13fa452e8c..cdf0184579 100644 --- a/run-command.c +++ b/run-command.c @@ -3,6 +3,8 @@ #include "exec_cmd.h" #include "sigchain.h" #include "argv-array.h" +#include "thread-utils.h" +#include "strbuf.h" void child_process_init(struct child_process *child) { @@ -245,7 +247,7 @@ static int wait_or_whine(pid_t pid, const char *argv0, int in_signal) error("waitpid is confused (%s)", argv0); } else if (WIFSIGNALED(status)) { code = WTERMSIG(status); - if (code != SIGINT && code != SIGQUIT) + if (code != SIGINT && code != SIGQUIT && code != SIGPIPE) error("%s died of signal %d", argv0, code); /* * This return value is chosen so that code & 0xff @@ -865,3 +867,336 @@ int capture_command(struct child_process *cmd, struct strbuf *buf, size_t hint) close(cmd->out); return finish_command(cmd); } + +enum child_state { + GIT_CP_FREE, + GIT_CP_WORKING, + GIT_CP_WAIT_CLEANUP, +}; + +struct parallel_processes { + void *data; + + int max_processes; + int nr_processes; + + get_next_task_fn get_next_task; + start_failure_fn start_failure; + task_finished_fn task_finished; + + struct { + enum child_state state; + struct child_process process; + struct strbuf err; + void *data; + } *children; + /* + * The struct pollfd is logically part of *children, + * but the system call expects it as its own array. + */ + struct pollfd *pfd; + + unsigned shutdown : 1; + + int output_owner; + struct strbuf buffered_output; /* of finished children */ +}; + +static int default_start_failure(struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void *pp_task_cb) +{ + int i; + + strbuf_addstr(err, "Starting a child failed:"); + for (i = 0; cp->argv[i]; i++) + strbuf_addf(err, " %s", cp->argv[i]); + + return 0; +} + +static int default_task_finished(int result, + struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void *pp_task_cb) +{ + int i; + + if (!result) + return 0; + + strbuf_addf(err, "A child failed with return code %d:", result); + for (i = 0; cp->argv[i]; i++) + strbuf_addf(err, " %s", cp->argv[i]); + + return 0; +} + +static void kill_children(struct parallel_processes *pp, int signo) +{ + int i, n = pp->max_processes; + + for (i = 0; i < n; i++) + if (pp->children[i].state == GIT_CP_WORKING) + kill(pp->children[i].process.pid, signo); +} + +static struct parallel_processes *pp_for_signal; + +static void handle_children_on_signal(int signo) +{ + kill_children(pp_for_signal, signo); + sigchain_pop(signo); + raise(signo); +} + +static void pp_init(struct parallel_processes *pp, + int n, + get_next_task_fn get_next_task, + start_failure_fn start_failure, + task_finished_fn task_finished, + void *data) +{ + int i; + + if (n < 1) + n = online_cpus(); + + pp->max_processes = n; + + trace_printf("run_processes_parallel: preparing to run up to %d tasks", n); + + pp->data = data; + if (!get_next_task) + die("BUG: you need to specify a get_next_task function"); + pp->get_next_task = get_next_task; + + pp->start_failure = start_failure ? start_failure : default_start_failure; + pp->task_finished = task_finished ? task_finished : default_task_finished; + + pp->nr_processes = 0; + pp->output_owner = 0; + pp->shutdown = 0; + pp->children = xcalloc(n, sizeof(*pp->children)); + pp->pfd = xcalloc(n, sizeof(*pp->pfd)); + strbuf_init(&pp->buffered_output, 0); + + for (i = 0; i < n; i++) { + strbuf_init(&pp->children[i].err, 0); + child_process_init(&pp->children[i].process); + pp->pfd[i].events = POLLIN | POLLHUP; + pp->pfd[i].fd = -1; + } + + pp_for_signal = pp; + sigchain_push_common(handle_children_on_signal); +} + +static void pp_cleanup(struct parallel_processes *pp) +{ + int i; + + trace_printf("run_processes_parallel: done"); + for (i = 0; i < pp->max_processes; i++) { + strbuf_release(&pp->children[i].err); + child_process_clear(&pp->children[i].process); + } + + free(pp->children); + free(pp->pfd); + + /* + * When get_next_task added messages to the buffer in its last + * iteration, the buffered output is non empty. + */ + fputs(pp->buffered_output.buf, stderr); + strbuf_release(&pp->buffered_output); + + sigchain_pop_common(); +} + +/* returns + * 0 if a new task was started. + * 1 if no new jobs was started (get_next_task ran out of work, non critical + * problem with starting a new command) + * <0 no new job was started, user wishes to shutdown early. Use negative code + * to signal the children. + */ +static int pp_start_one(struct parallel_processes *pp) +{ + int i, code; + + for (i = 0; i < pp->max_processes; i++) + if (pp->children[i].state == GIT_CP_FREE) + break; + if (i == pp->max_processes) + die("BUG: bookkeeping is hard"); + + code = pp->get_next_task(&pp->children[i].process, + &pp->children[i].err, + pp->data, + &pp->children[i].data); + if (!code) { + strbuf_addbuf(&pp->buffered_output, &pp->children[i].err); + strbuf_reset(&pp->children[i].err); + return 1; + } + pp->children[i].process.err = -1; + pp->children[i].process.stdout_to_stderr = 1; + pp->children[i].process.no_stdin = 1; + + if (start_command(&pp->children[i].process)) { + code = pp->start_failure(&pp->children[i].process, + &pp->children[i].err, + pp->data, + &pp->children[i].data); + strbuf_addbuf(&pp->buffered_output, &pp->children[i].err); + strbuf_reset(&pp->children[i].err); + if (code) + pp->shutdown = 1; + return code; + } + + pp->nr_processes++; + pp->children[i].state = GIT_CP_WORKING; + pp->pfd[i].fd = pp->children[i].process.err; + return 0; +} + +static void pp_buffer_stderr(struct parallel_processes *pp, int output_timeout) +{ + int i; + + while ((i = poll(pp->pfd, pp->max_processes, output_timeout)) < 0) { + if (errno == EINTR) + continue; + pp_cleanup(pp); + die_errno("poll"); + } + + /* Buffer output from all pipes. */ + for (i = 0; i < pp->max_processes; i++) { + if (pp->children[i].state == GIT_CP_WORKING && + pp->pfd[i].revents & (POLLIN | POLLHUP)) { + int n = strbuf_read_once(&pp->children[i].err, + pp->children[i].process.err, 0); + if (n == 0) { + close(pp->children[i].process.err); + pp->children[i].state = GIT_CP_WAIT_CLEANUP; + } else if (n < 0) + if (errno != EAGAIN) + die_errno("read"); + } + } +} + +static void pp_output(struct parallel_processes *pp) +{ + int i = pp->output_owner; + if (pp->children[i].state == GIT_CP_WORKING && + pp->children[i].err.len) { + fputs(pp->children[i].err.buf, stderr); + strbuf_reset(&pp->children[i].err); + } +} + +static int pp_collect_finished(struct parallel_processes *pp) +{ + int i, code; + int n = pp->max_processes; + int result = 0; + + while (pp->nr_processes > 0) { + for (i = 0; i < pp->max_processes; i++) + if (pp->children[i].state == GIT_CP_WAIT_CLEANUP) + break; + if (i == pp->max_processes) + break; + + code = finish_command(&pp->children[i].process); + + code = pp->task_finished(code, &pp->children[i].process, + &pp->children[i].err, pp->data, + &pp->children[i].data); + + if (code) + result = code; + if (code < 0) + break; + + pp->nr_processes--; + pp->children[i].state = GIT_CP_FREE; + pp->pfd[i].fd = -1; + child_process_init(&pp->children[i].process); + + if (i != pp->output_owner) { + strbuf_addbuf(&pp->buffered_output, &pp->children[i].err); + strbuf_reset(&pp->children[i].err); + } else { + fputs(pp->children[i].err.buf, stderr); + strbuf_reset(&pp->children[i].err); + + /* Output all other finished child processes */ + fputs(pp->buffered_output.buf, stderr); + strbuf_reset(&pp->buffered_output); + + /* + * Pick next process to output live. + * NEEDSWORK: + * For now we pick it randomly by doing a round + * robin. Later we may want to pick the one with + * the most output or the longest or shortest + * running process time. + */ + for (i = 0; i < n; i++) + if (pp->children[(pp->output_owner + i) % n].state == GIT_CP_WORKING) + break; + pp->output_owner = (pp->output_owner + i) % n; + } + } + return result; +} + +int run_processes_parallel(int n, + get_next_task_fn get_next_task, + start_failure_fn start_failure, + task_finished_fn task_finished, + void *pp_cb) +{ + int i, code; + int output_timeout = 100; + int spawn_cap = 4; + struct parallel_processes pp; + + pp_init(&pp, n, get_next_task, start_failure, task_finished, pp_cb); + while (1) { + for (i = 0; + i < spawn_cap && !pp.shutdown && + pp.nr_processes < pp.max_processes; + i++) { + code = pp_start_one(&pp); + if (!code) + continue; + if (code < 0) { + pp.shutdown = 1; + kill_children(&pp, -code); + } + break; + } + if (!pp.nr_processes) + break; + pp_buffer_stderr(&pp, output_timeout); + pp_output(&pp); + code = pp_collect_finished(&pp); + if (code) { + pp.shutdown = 1; + if (code < 0) + kill_children(&pp, -code); + } + } + + pp_cleanup(&pp); + return 0; +} diff --git a/run-command.h b/run-command.h index 12bb26c2a6..d5a57f9227 100644 --- a/run-command.h +++ b/run-command.h @@ -122,4 +122,84 @@ int start_async(struct async *async); int finish_async(struct async *async); int in_async(void); +/** + * This callback should initialize the child process and preload the + * error channel if desired. The preloading of is useful if you want to + * have a message printed directly before the output of the child process. + * pp_cb is the callback cookie as passed to run_processes_parallel. + * You can store a child process specific callback cookie in pp_task_cb. + * + * Even after returning 0 to indicate that there are no more processes, + * this function will be called again until there are no more running + * child processes. + * + * Return 1 if the next child is ready to run. + * Return 0 if there are currently no more tasks to be processed. + * To send a signal to other child processes for abortion, + * return the negative signal number. + */ +typedef int (*get_next_task_fn)(struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void **pp_task_cb); + +/** + * This callback is called whenever there are problems starting + * a new process. + * + * You must not write to stdout or stderr in this function. Add your + * message to the strbuf err instead, which will be printed without + * messing up the output of the other parallel processes. + * + * pp_cb is the callback cookie as passed into run_processes_parallel, + * pp_task_cb is the callback cookie as passed into get_next_task_fn. + * + * Return 0 to continue the parallel processing. To abort return non zero. + * To send a signal to other child processes for abortion, return + * the negative signal number. + */ +typedef int (*start_failure_fn)(struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void *pp_task_cb); + +/** + * This callback is called on every child process that finished processing. + * + * You must not write to stdout or stderr in this function. Add your + * message to the strbuf err instead, which will be printed without + * messing up the output of the other parallel processes. + * + * pp_cb is the callback cookie as passed into run_processes_parallel, + * pp_task_cb is the callback cookie as passed into get_next_task_fn. + * + * Return 0 to continue the parallel processing. To abort return non zero. + * To send a signal to other child processes for abortion, return + * the negative signal number. + */ +typedef int (*task_finished_fn)(int result, + struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void *pp_task_cb); + +/** + * Runs up to n processes at the same time. Whenever a process can be + * started, the callback get_next_task_fn is called to obtain the data + * required to start another child process. + * + * The children started via this function run in parallel. Their output + * (both stdout and stderr) is routed to stderr in a manner that output + * from different tasks does not interleave. + * + * If start_failure_fn or task_finished_fn are NULL, default handlers + * will be used. The default handlers will print an error message on + * error without issuing an emergency stop. + */ +int run_processes_parallel(int n, + get_next_task_fn, + start_failure_fn, + task_finished_fn, + void *pp_cb); + #endif diff --git a/sequencer.c b/sequencer.c index 8c58fa2f4d..80487860c8 100644 --- a/sequencer.c +++ b/sequencer.c @@ -886,7 +886,7 @@ static int sequencer_rollback(struct replay_opts *opts) if (!f) return error(_("cannot open %s: %s"), git_path_head_file(), strerror(errno)); - if (strbuf_getline(&buf, f, '\n')) { + if (strbuf_getline_lf(&buf, f)) { error(_("cannot read %s: %s"), git_path_head_file(), ferror(f) ? strerror(errno) : _("unexpected end of file")); fclose(f); diff --git a/sha1_file.c b/sha1_file.c index 73ccd49a46..aab1872b4c 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -396,7 +396,7 @@ void add_to_alternates_file(const char *reference) struct strbuf line = STRBUF_INIT; int found = 0; - while (strbuf_getline(&line, in, '\n') != EOF) { + while (strbuf_getline(&line, in) != EOF) { if (!strcmp(reference, line.buf)) { found = 1; break; diff --git a/shell.c b/shell.c index ace62e4b65..c5439a63e9 100644 --- a/shell.c +++ b/shell.c @@ -88,7 +88,7 @@ static void run_shell(void) int count; fprintf(stderr, "git> "); - if (strbuf_getline(&line, stdin, '\n') == EOF) { + if (strbuf_getline_lf(&line, stdin) == EOF) { fprintf(stderr, "\n"); strbuf_release(&line); break; diff --git a/sigchain.c b/sigchain.c index faa375d5d8..2ac43bbd28 100644 --- a/sigchain.c +++ b/sigchain.c @@ -50,3 +50,12 @@ void sigchain_push_common(sigchain_fun f) sigchain_push(SIGQUIT, f); sigchain_push(SIGPIPE, f); } + +void sigchain_pop_common(void) +{ + sigchain_pop(SIGPIPE); + sigchain_pop(SIGQUIT); + sigchain_pop(SIGTERM); + sigchain_pop(SIGHUP); + sigchain_pop(SIGINT); +} diff --git a/sigchain.h b/sigchain.h index 618083bce0..138b20f54b 100644 --- a/sigchain.h +++ b/sigchain.h @@ -7,5 +7,6 @@ int sigchain_push(int sig, sigchain_fun f); int sigchain_pop(int sig); void sigchain_push_common(sigchain_fun f); +void sigchain_pop_common(void); #endif /* SIGCHAIN_H */ diff --git a/strbuf.c b/strbuf.c index d76f0aed85..bab316dda8 100644 --- a/strbuf.c +++ b/strbuf.c @@ -384,6 +384,17 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint) return sb->len - oldlen; } +ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint) +{ + ssize_t cnt; + + strbuf_grow(sb, hint ? hint : 8192); + cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); + if (cnt > 0) + strbuf_setlen(sb, sb->len + cnt); + return cnt; +} + #define STRBUF_MAXLINK (2*PATH_MAX) int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint) @@ -501,15 +512,37 @@ int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term) } #endif -int strbuf_getline(struct strbuf *sb, FILE *fp, int term) +static int strbuf_getdelim(struct strbuf *sb, FILE *fp, int term) { if (strbuf_getwholeline(sb, fp, term)) return EOF; - if (sb->buf[sb->len-1] == term) - strbuf_setlen(sb, sb->len-1); + if (sb->buf[sb->len - 1] == term) + strbuf_setlen(sb, sb->len - 1); return 0; } +int strbuf_getline(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 && sb->buf[sb->len - 1] == '\r') + strbuf_setlen(sb, sb->len - 1); + } + return 0; +} + +int strbuf_getline_lf(struct strbuf *sb, FILE *fp) +{ + return strbuf_getdelim(sb, fp, '\n'); +} + +int strbuf_getline_nul(struct strbuf *sb, FILE *fp) +{ + return strbuf_getdelim(sb, fp, '\0'); +} + int strbuf_getwholeline_fd(struct strbuf *sb, int fd, int term) { strbuf_reset(sb); diff --git a/strbuf.h b/strbuf.h index 7123fca7af..f72fd14c2e 100644 --- a/strbuf.h +++ b/strbuf.h @@ -354,8 +354,8 @@ extern void strbuf_addftime(struct strbuf *sb, const char *fmt, const struct tm * * NOTE: The buffer is rewound if the read fails. If -1 is returned, * `errno` must be consulted, like you would do for `read(3)`. - * `strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the - * same behaviour as well. + * `strbuf_read()`, `strbuf_read_file()` and `strbuf_getline_*()` + * family of functions have the same behaviour as well. */ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); @@ -366,6 +366,14 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); */ extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); +/** + * Read the contents of a given file descriptor partially by using only one + * attempt of xread. The third argument can be used to give a hint about the + * file size, to avoid reallocs. Returns the number of new bytes appended to + * the sb. + */ +extern ssize_t strbuf_read_once(struct strbuf *, int fd, size_t hint); + /** * Read the contents of a file, specified by its path. The third argument * can be used to give a hint about the file size, to avoid reallocs. @@ -379,14 +387,31 @@ extern ssize_t strbuf_read_file(struct strbuf *sb, const char *path, size_t hint extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); /** - * Read a line from a FILE *, overwriting the existing contents - * of the strbuf. The second argument specifies the line - * terminator character, typically `'\n'`. + * Read a line from a FILE *, overwriting the existing contents of + * the strbuf. The strbuf_getline*() family of functions share + * this signature, but have different line termination conventions. + * * Reading stops after the terminator or at EOF. The terminator * is removed from the buffer before returning. Returns 0 unless * there was nothing left before EOF, in which case it returns `EOF`. */ -extern int strbuf_getline(struct strbuf *, FILE *, int); +typedef int (*strbuf_getline_fn)(struct strbuf *, FILE *); + +/* Uses LF as the line terminator */ +extern int strbuf_getline_lf(struct strbuf *sb, FILE *fp); + +/* Uses NUL as the line terminator */ +extern int strbuf_getline_nul(struct strbuf *sb, FILE *fp); + +/* + * Similar to strbuf_getline_lf(), but additionally treats a CR that + * comes immediately before the LF as part of the terminator. + * This is the most friendly version to be used to read "text" files + * that can come from platforms whose native text format is CRLF + * terminated. + */ +extern int strbuf_getline(struct strbuf *, FILE *); + /** * Like `strbuf_getline`, but keeps the trailing terminator (if diff --git a/submodule.c b/submodule.c index 14e76247bf..b83939c294 100644 --- a/submodule.c +++ b/submodule.c @@ -12,6 +12,7 @@ #include "sha1-array.h" #include "argv-array.h" #include "blob.h" +#include "thread-utils.h" static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND; static struct string_list changed_submodule_paths; @@ -610,37 +611,28 @@ static void calculate_changed_submodule_paths(void) initialized_fetch_ref_tips = 0; } -int fetch_populated_submodules(const struct argv_array *options, - const char *prefix, int command_line_option, - int quiet) +struct submodule_parallel_fetch { + int count; + struct argv_array args; + const char *work_tree; + const char *prefix; + int command_line_option; + int quiet; + int result; +}; +#define SPF_INIT {0, ARGV_ARRAY_INIT, NULL, NULL, 0, 0, 0} + +static int get_next_submodule(struct child_process *cp, + struct strbuf *err, void *data, void **task_cb) { - int i, result = 0; - struct child_process cp = CHILD_PROCESS_INIT; - struct argv_array argv = ARGV_ARRAY_INIT; - const char *work_tree = get_git_work_tree(); - if (!work_tree) - goto out; - - if (read_cache() < 0) - die("index file corrupt"); - - argv_array_push(&argv, "fetch"); - for (i = 0; i < options->argc; i++) - argv_array_push(&argv, options->argv[i]); - argv_array_push(&argv, "--recurse-submodules-default"); - /* default value, "--submodule-prefix" and its value are added later */ - - cp.env = local_repo_env; - cp.git_cmd = 1; - cp.no_stdin = 1; - - calculate_changed_submodule_paths(); + int ret = 0; + struct submodule_parallel_fetch *spf = data; - for (i = 0; i < active_nr; i++) { + for (; spf->count < active_nr; spf->count++) { struct strbuf submodule_path = STRBUF_INIT; struct strbuf submodule_git_dir = STRBUF_INIT; struct strbuf submodule_prefix = STRBUF_INIT; - const struct cache_entry *ce = active_cache[i]; + const struct cache_entry *ce = active_cache[spf->count]; const char *git_dir, *default_argv; const struct submodule *submodule; @@ -652,7 +644,7 @@ int fetch_populated_submodules(const struct argv_array *options, submodule = submodule_from_name(null_sha1, ce->name); default_argv = "yes"; - if (command_line_option == RECURSE_SUBMODULES_DEFAULT) { + if (spf->command_line_option == RECURSE_SUBMODULES_DEFAULT) { if (submodule && submodule->fetch_recurse != RECURSE_SUBMODULES_NONE) { @@ -675,40 +667,101 @@ int fetch_populated_submodules(const struct argv_array *options, default_argv = "on-demand"; } } - } else if (command_line_option == RECURSE_SUBMODULES_ON_DEMAND) { + } else if (spf->command_line_option == RECURSE_SUBMODULES_ON_DEMAND) { if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name)) continue; default_argv = "on-demand"; } - strbuf_addf(&submodule_path, "%s/%s", work_tree, ce->name); + strbuf_addf(&submodule_path, "%s/%s", spf->work_tree, ce->name); strbuf_addf(&submodule_git_dir, "%s/.git", submodule_path.buf); - strbuf_addf(&submodule_prefix, "%s%s/", prefix, ce->name); + strbuf_addf(&submodule_prefix, "%s%s/", spf->prefix, ce->name); git_dir = read_gitfile(submodule_git_dir.buf); if (!git_dir) git_dir = submodule_git_dir.buf; if (is_directory(git_dir)) { - if (!quiet) - printf("Fetching submodule %s%s\n", prefix, ce->name); - cp.dir = submodule_path.buf; - argv_array_push(&argv, default_argv); - argv_array_push(&argv, "--submodule-prefix"); - argv_array_push(&argv, submodule_prefix.buf); - cp.argv = argv.argv; - if (run_command(&cp)) - result = 1; - argv_array_pop(&argv); - argv_array_pop(&argv); - argv_array_pop(&argv); + child_process_init(cp); + cp->dir = strbuf_detach(&submodule_path, NULL); + cp->env = local_repo_env; + cp->git_cmd = 1; + if (!spf->quiet) + strbuf_addf(err, "Fetching submodule %s%s\n", + spf->prefix, ce->name); + argv_array_init(&cp->args); + argv_array_pushv(&cp->args, spf->args.argv); + argv_array_push(&cp->args, default_argv); + argv_array_push(&cp->args, "--submodule-prefix"); + argv_array_push(&cp->args, submodule_prefix.buf); + ret = 1; } strbuf_release(&submodule_path); strbuf_release(&submodule_git_dir); strbuf_release(&submodule_prefix); + if (ret) { + spf->count++; + return 1; + } } - argv_array_clear(&argv); + return 0; +} + +static int fetch_start_failure(struct child_process *cp, + struct strbuf *err, + void *cb, void *task_cb) +{ + struct submodule_parallel_fetch *spf = cb; + + spf->result = 1; + + return 0; +} + +static int fetch_finish(int retvalue, struct child_process *cp, + struct strbuf *err, void *cb, void *task_cb) +{ + struct submodule_parallel_fetch *spf = cb; + + if (retvalue) + spf->result = 1; + + return 0; +} + +int fetch_populated_submodules(const struct argv_array *options, + const char *prefix, int command_line_option, + int quiet, int max_parallel_jobs) +{ + int i; + struct submodule_parallel_fetch spf = SPF_INIT; + + spf.work_tree = get_git_work_tree(); + spf.command_line_option = command_line_option; + spf.quiet = quiet; + spf.prefix = prefix; + + if (!spf.work_tree) + goto out; + + if (read_cache() < 0) + die("index file corrupt"); + + argv_array_push(&spf.args, "fetch"); + for (i = 0; i < options->argc; i++) + argv_array_push(&spf.args, options->argv[i]); + argv_array_push(&spf.args, "--recurse-submodules-default"); + /* default value, "--submodule-prefix" and its value are added later */ + + calculate_changed_submodule_paths(); + run_processes_parallel(max_parallel_jobs, + get_next_submodule, + fetch_start_failure, + fetch_finish, + &spf); + + argv_array_clear(&spf.args); out: string_list_clear(&changed_submodule_paths, 1); - return result; + return spf.result; } unsigned is_submodule_modified(const char *path, int ignore_untracked) diff --git a/submodule.h b/submodule.h index ddff512109..e06eaa5ebb 100644 --- a/submodule.h +++ b/submodule.h @@ -32,7 +32,7 @@ void set_config_fetch_recurse_submodules(int value); void check_for_new_submodule_commits(unsigned char new_sha1[20]); int fetch_populated_submodules(const struct argv_array *options, const char *prefix, int command_line_option, - int quiet); + int quiet, int max_parallel_jobs); unsigned is_submodule_modified(const char *path, int ignore_untracked); int submodule_uses_gitfile(const char *path); int ok_to_remove_submodule(const char *path); diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index e9714467d0..f9f3e5fd82 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -98,8 +98,8 @@ then test_skip_or_die $GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'" fi -HTTPD_VERSION=`$LIB_HTTPD_PATH -v | \ - sed -n 's/^Server version: Apache\/\([0-9]*\)\..*$/\1/p; q'` +HTTPD_VERSION=$($LIB_HTTPD_PATH -v | \ + sed -n 's/^Server version: Apache\/\([0-9]*\)\..*$/\1/p; q') if test -n "$HTTPD_VERSION" then diff --git a/t/t0001-init.sh b/t/t0001-init.sh index f91bbcfc85..295aa5949a 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -87,6 +87,23 @@ test_expect_success 'plain nested in bare through aliased command' ' check_config bare-ancestor-aliased.git/plain-nested/.git false unset ' +test_expect_success 'No extra GIT_* on alias scripts' ' + ( + env | sed -ne "/^GIT_/s/=.*//p" && + echo GIT_PREFIX && # setup.c + echo GIT_TEXTDOMAINDIR # wrapper-for-bin.sh + ) | sort | uniq >expected && + cat <<-\EOF >script && + #!/bin/sh + env | sed -ne "/^GIT_/s/=.*//p" | sort >actual + exit 0 + EOF + chmod 755 script && + git config alias.script \!./script && + ( mkdir sub && cd sub && git script ) && + test_cmp expected actual +' + test_expect_success 'plain with GIT_WORK_TREE' ' mkdir plain-wt && test_must_fail env GIT_WORK_TREE="$(pwd)/plain-wt" git init plain-wt diff --git a/t/t0027-auto-crlf.sh b/t/t0027-auto-crlf.sh index b343651504..504e5a02a1 100755 --- a/t/t0027-auto-crlf.sh +++ b/t/t0027-auto-crlf.sh @@ -56,21 +56,16 @@ create_gitattributes () { } create_NNO_files () { - lfname=$1 - crlfname=$2 - lfmixcrlf=$3 - lfmixcr=$4 - crlfnul=$5 for crlf in false true input do for attr in "" auto text -text lf crlf do pfx=NNO_${crlf}_attr_${attr} && - cp $lfname ${pfx}_LF.txt && - cp $crlfname ${pfx}_CRLF.txt && - cp $lfmixcrlf ${pfx}_CRLF_mix_LF.txt && - cp $lfmixcr ${pfx}_LF_mix_CR.txt && - cp $crlfnul ${pfx}_CRLF_nul.txt + cp CRLF_mix_LF ${pfx}_LF.txt && + cp CRLF_mix_LF ${pfx}_CRLF.txt && + cp CRLF_mix_LF ${pfx}_CRLF_mix_LF.txt && + cp CRLF_mix_LF ${pfx}_LF_mix_CR.txt && + cp CRLF_mix_LF ${pfx}_CRLF_nul.txt done done } @@ -96,7 +91,7 @@ commit_check_warn () { crlfnul=$7 pfx=crlf_${crlf}_attr_${attr} create_gitattributes "$attr" && - for f in LF CRLF repoMIX LF_mix_CR CRLF_mix_LF LF_nul CRLF_nul + for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul CRLF_nul do fname=${pfx}_$f.txt && cp $f $fname && @@ -149,6 +144,27 @@ commit_chk_wrnNNO () { ' } +stats_ascii () { + case "$1" in + LF) + echo lf + ;; + CRLF) + echo crlf + ;; + CRLF_mix_LF) + echo mixed + ;; + LF_mix_CR|CRLF_nul|LF_nul|CRLF_mix_CR) + echo "-text" + ;; + *) + echo error_invalid $1 + ;; + esac + +} + check_files_in_repo () { crlf=$1 attr=$2 @@ -203,35 +219,83 @@ checkout_files () { create_gitattributes $attr && git config core.autocrlf $crlf && pfx=eol_${eol}_crlf_${crlf}_attr_${attr}_ && - src=crlf_false_attr__ && for f in LF CRLF LF_mix_CR CRLF_mix_LF LF_nul do - rm $src$f.txt && + rm crlf_false_attr__$f.txt && if test -z "$eol"; then - git checkout $src$f.txt + git checkout crlf_false_attr__$f.txt else - git -c core.eol=$eol checkout $src$f.txt + git -c core.eol=$eol checkout crlf_false_attr__$f.txt fi done + test_expect_success "ls-files --eol $lfname ${pfx}LF.txt" ' + test_when_finished "rm expect actual" && + sort <<-EOF >expect && + i/crlf w/$(stats_ascii $crlfname) crlf_false_attr__CRLF.txt + i/mixed w/$(stats_ascii $lfmixcrlf) crlf_false_attr__CRLF_mix_LF.txt + i/lf w/$(stats_ascii $lfname) crlf_false_attr__LF.txt + i/-text w/$(stats_ascii $lfmixcr) crlf_false_attr__LF_mix_CR.txt + i/-text w/$(stats_ascii $crlfnul) crlf_false_attr__CRLF_nul.txt + i/-text w/$(stats_ascii $crlfnul) crlf_false_attr__LF_nul.txt + EOF + git ls-files --eol crlf_false_attr__* | + sed -e "s!attr/[^ ]*!!g" -e "s/ / /g" -e "s/ */ /g" | + sort >actual && + test_cmp expect actual + ' test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF" " - compare_ws_file $pfx $lfname ${src}LF.txt + compare_ws_file $pfx $lfname crlf_false_attr__LF.txt " test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF" " - compare_ws_file $pfx $crlfname ${src}CRLF.txt + compare_ws_file $pfx $crlfname crlf_false_attr__CRLF.txt " test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=CRLF_mix_LF" " - compare_ws_file $pfx $lfmixcrlf ${src}CRLF_mix_LF.txt + compare_ws_file $pfx $lfmixcrlf crlf_false_attr__CRLF_mix_LF.txt " test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF_mix_CR" " - compare_ws_file $pfx $lfmixcr ${src}LF_mix_CR.txt + compare_ws_file $pfx $lfmixcr crlf_false_attr__LF_mix_CR.txt " test_expect_success "checkout core.eol=$eol core.autocrlf=$crlf gitattributes=$attr file=LF_nul" " - compare_ws_file $pfx $crlfnul ${src}LF_nul.txt + compare_ws_file $pfx $crlfnul crlf_false_attr__LF_nul.txt " } -####### +# Test control characters +# NUL SOH CR EOF==^Z +test_expect_success 'ls-files --eol -o Text/Binary' ' + test_when_finished "rm expect actual TeBi_*" && + STRT=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA && + STR=$STRT$STRT$STRT$STRT && + printf "${STR}BBB\001" >TeBi_127_S && + printf "${STR}BBBB\001">TeBi_128_S && + printf "${STR}BBB\032" >TeBi_127_E && + printf "\032${STR}BBB" >TeBi_E_127 && + printf "${STR}BBBB\000">TeBi_128_N && + printf "${STR}BBB\012">TeBi_128_L && + printf "${STR}BBB\015">TeBi_127_C && + printf "${STR}BB\015\012" >TeBi_126_CL && + printf "${STR}BB\015\012\015" >TeBi_126_CLC && + sort <<-\EOF >expect && + i/ w/-text TeBi_127_S + i/ w/none TeBi_128_S + i/ w/none TeBi_127_E + i/ w/-text TeBi_E_127 + i/ w/-text TeBi_128_N + i/ w/lf TeBi_128_L + i/ w/-text TeBi_127_C + i/ w/crlf TeBi_126_CL + i/ w/-text TeBi_126_CLC + EOF + git ls-files --eol -o | + sed -n -e "/TeBi_/{s!attr/[ ]*!!g + s! ! !g + s! *! !g + p + }" | sort >actual && + test_cmp expect actual +' + test_expect_success 'setup master' ' echo >.gitattributes && git checkout -b master && @@ -480,4 +544,19 @@ checkout_files native true "lf" LF CRLF CRLF_mix_LF LF_mix_CR checkout_files native false "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul checkout_files native true "crlf" CRLF CRLF CRLF CRLF_mix_CR CRLF_nul +# Should be the last test case: remove some files from the worktree +test_expect_success 'ls-files --eol -d -z' ' + rm crlf_false_attr__CRLF.txt crlf_false_attr__CRLF_mix_LF.txt crlf_false_attr__LF.txt .gitattributes && + cat >expect <<-\EOF && + i/crlf w/ crlf_false_attr__CRLF.txt + i/lf w/ .gitattributes + i/lf w/ crlf_false_attr__LF.txt + i/mixed w/ crlf_false_attr__CRLF_mix_LF.txt + EOF + git ls-files --eol -d | + sed -e "s!attr/[^ ]*!!g" -e "s/ / /g" -e "s/ */ /g" | + sort >actual && + test_cmp expect actual +' + test_done diff --git a/t/t0060-path-utils.sh b/t/t0060-path-utils.sh index 627ef854d5..f0152a7ab4 100755 --- a/t/t0060-path-utils.sh +++ b/t/t0060-path-utils.sh @@ -59,6 +59,9 @@ case $(uname -s) in ;; esac +test_expect_success basename 'test-path-utils basename' +test_expect_success dirname 'test-path-utils dirname' + norm_path "" "" norm_path . "" norm_path ./ "" diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh index 9acf628726..12228b4aa6 100755 --- a/t/t0061-run-command.sh +++ b/t/t0061-run-command.sh @@ -47,4 +47,57 @@ test_expect_success POSIXPERM,SANITY 'unreadable directory in PATH' ' test_cmp expect actual ' +cat >expect <<-EOF +preloaded output of a child +Hello +World +preloaded output of a child +Hello +World +preloaded output of a child +Hello +World +preloaded output of a child +Hello +World +EOF + +test_expect_success 'run_command runs in parallel with more jobs available than tasks' ' + test-run-command run-command-parallel 5 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test_cmp expect actual +' + +test_expect_success 'run_command runs in parallel with as many jobs as tasks' ' + test-run-command run-command-parallel 4 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test_cmp expect actual +' + +test_expect_success 'run_command runs in parallel with more tasks than jobs available' ' + test-run-command run-command-parallel 3 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test_cmp expect actual +' + +cat >expect <<-EOF +preloaded output of a child +asking for a quick stop +preloaded output of a child +asking for a quick stop +preloaded output of a child +asking for a quick stop +EOF + +test_expect_success 'run_command is asked to abort gracefully' ' + test-run-command run-command-abort 3 false 2>actual && + test_cmp expect actual +' + +cat >expect <<-EOF +no further jobs available +EOF + +test_expect_success 'run_command outputs ' ' + test-run-command run-command-no-jobs 3 sh -c "printf \"%s\n%s\n\" Hello World" 2>actual && + test_cmp expect actual +' + test_done diff --git a/t/t1100-commit-tree-options.sh b/t/t1100-commit-tree-options.sh index f8457f9d14..b7e9b4fc5b 100755 --- a/t/t1100-commit-tree-options.sh +++ b/t/t1100-commit-tree-options.sh @@ -35,11 +35,11 @@ test_expect_success \ GIT_COMMITTER_NAME="Committer Name" \ GIT_COMMITTER_EMAIL="committer@email" \ GIT_COMMITTER_DATE="2005-05-26 23:30" \ - TZ=GMT git commit-tree `cat treeid` >commitid 2>/dev/null' + TZ=GMT git commit-tree $(cat treeid) >commitid 2>/dev/null' test_expect_success \ 'read commit' \ - 'git cat-file commit `cat commitid` >commit' + 'git cat-file commit $(cat commitid) >commit' test_expect_success \ 'compare commit' \ diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh index 1f0dff3a0b..417eecc3af 100755 --- a/t/t1401-symbolic-ref.sh +++ b/t/t1401-symbolic-ref.sh @@ -29,7 +29,7 @@ reset_to_sane test_expect_success 'symbolic-ref refuses bare sha1' ' echo content >file && git add file && git commit -m one && - test_must_fail git symbolic-ref HEAD `git rev-parse HEAD` + test_must_fail git symbolic-ref HEAD $(git rev-parse HEAD) ' reset_to_sane @@ -114,4 +114,19 @@ test_expect_success 'symbolic-ref writes reflog entry' ' test_cmp expect actual ' +test_expect_success 'symbolic-ref does not create ref d/f conflicts' ' + git checkout -b df && + test_commit df && + test_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df && + git pack-refs --all --prune && + test_must_fail git symbolic-ref refs/heads/df/conflict refs/heads/df +' + +test_expect_success 'symbolic-ref handles existing pointer to invalid name' ' + head=$(git rev-parse HEAD) && + git symbolic-ref HEAD refs/heads/outer && + git update-ref refs/heads/outer/inner $head && + git symbolic-ref HEAD refs/heads/unrelated +' + test_done diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index b79049f6f6..c623824b4d 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -62,18 +62,18 @@ test_expect_success setup ' git add . && test_tick && git commit -m rabbit && - H=`git rev-parse --verify HEAD` && - A=`git rev-parse --verify HEAD:A` && - B=`git rev-parse --verify HEAD:A/B` && - C=`git rev-parse --verify HEAD:C` && - D=`git rev-parse --verify HEAD:A/D` && - E=`git rev-parse --verify HEAD:A/B/E` && + H=$(git rev-parse --verify HEAD) && + A=$(git rev-parse --verify HEAD:A) && + B=$(git rev-parse --verify HEAD:A/B) && + C=$(git rev-parse --verify HEAD:C) && + D=$(git rev-parse --verify HEAD:A/D) && + E=$(git rev-parse --verify HEAD:A/B/E) && check_fsck && test_chmod +x C && git add C && test_tick && git commit -m dragon && - L=`git rev-parse --verify HEAD` && + L=$(git rev-parse --verify HEAD) && check_fsck && rm -f C A/B/E && @@ -81,15 +81,15 @@ test_expect_success setup ' echo horse >A/G && git add F A/G && test_tick && git commit -a -m sheep && - F=`git rev-parse --verify HEAD:F` && - G=`git rev-parse --verify HEAD:A/G` && - I=`git rev-parse --verify HEAD:A` && - J=`git rev-parse --verify HEAD` && + F=$(git rev-parse --verify HEAD:F) && + G=$(git rev-parse --verify HEAD:A/G) && + I=$(git rev-parse --verify HEAD:A) && + J=$(git rev-parse --verify HEAD) && check_fsck && rm -f A/G && test_tick && git commit -a -m monkey && - K=`git rev-parse --verify HEAD` && + K=$(git rev-parse --verify HEAD) && check_fsck && check_have A B C D E F G H I J K L && @@ -325,4 +325,17 @@ test_expect_success 'parsing reverse reflogs at BUFSIZ boundaries' ' test_cmp expect actual ' +test_expect_success 'no segfaults for reflog containing non-commit sha1s' ' + git update-ref --create-reflog -m "Creating ref" \ + refs/tests/tree-in-reflog HEAD && + git update-ref -m "Forcing tree" refs/tests/tree-in-reflog HEAD^{tree} && + git update-ref -m "Restoring to commit" refs/tests/tree-in-reflog HEAD && + git reflog refs/tests/tree-in-reflog +' + +test_expect_failure 'reflog with non-commit entries displays all entries' ' + git reflog refs/tests/tree-in-reflog >actual && + test_line_count = 3 actual +' + test_done diff --git a/t/t1511-rev-parse-caret.sh b/t/t1511-rev-parse-caret.sh index 15973f2094..7043ba7947 100755 --- a/t/t1511-rev-parse-caret.sh +++ b/t/t1511-rev-parse-caret.sh @@ -6,11 +6,11 @@ test_description='tests for ref^{stuff}' test_expect_success 'setup' ' echo blob >a-blob && - git tag -a -m blob blob-tag `git hash-object -w a-blob` && + git tag -a -m blob blob-tag $(git hash-object -w a-blob) && mkdir a-tree && echo moreblobs >a-tree/another-blob && git add . && - TREE_SHA1=`git write-tree` && + TREE_SHA1=$(git write-tree) && git tag -a -m tree tree-tag "$TREE_SHA1" && git commit -m Initial && git tag -a -m commit commit-tag && diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index 4a155c8d09..e221167cfb 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -275,19 +275,19 @@ test_expect_success 'rev-parse --disambiguate' ' test_expect_success 'ambiguous 40-hex ref' ' TREE=$(git mktree </dev/null) && - REF=`git rev-parse HEAD` && + REF=$(git rev-parse HEAD) && VAL=$(git commit-tree $TREE </dev/null) && git update-ref refs/heads/$REF $VAL && - test `git rev-parse $REF 2>err` = $REF && + test $(git rev-parse $REF 2>err) = $REF && grep "refname.*${REF}.*ambiguous" err ' test_expect_success 'ambiguous short sha1 ref' ' TREE=$(git mktree </dev/null) && - REF=`git rev-parse --short HEAD` && + REF=$(git rev-parse --short HEAD) && VAL=$(git commit-tree $TREE </dev/null) && git update-ref refs/heads/$REF $VAL && - test `git rev-parse $REF 2>err` = $VAL && + test $(git rev-parse $REF 2>err) = $VAL && grep "refname.*${REF}.*ambiguous" err ' diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh index 193d55c3f4..8aef49f236 100755 --- a/t/t1700-split-index.sh +++ b/t/t1700-split-index.sh @@ -55,7 +55,7 @@ test_expect_success 'disable split index' ' EOF test_cmp ls-files.expect ls-files.actual && - BASE=`test-dump-split-index .git/index | grep "^own" | sed "s/own/base/"` && + BASE=$(test-dump-split-index .git/index | grep "^own" | sed "s/own/base/") && test-dump-split-index .git/index | sed "/^own/d" >actual && cat >expect <<EOF && not a split index diff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh index 300f8bf25c..c5501b008c 100755 --- a/t/t2011-checkout-invalid-head.sh +++ b/t/t2011-checkout-invalid-head.sh @@ -19,4 +19,43 @@ test_expect_success 'checkout master from invalid HEAD' ' git checkout master -- ' +test_expect_success 'checkout notices failure to lock HEAD' ' + test_when_finished "rm -f .git/HEAD.lock" && + >.git/HEAD.lock && + test_must_fail git checkout -b other +' + +test_expect_success 'create ref directory/file conflict scenario' ' + git update-ref refs/heads/outer/inner master && + + # do not rely on symbolic-ref to get a known state, + # as it may use the same code we are testing + reset_to_df () { + echo "ref: refs/heads/outer" >.git/HEAD + } +' + +test_expect_success 'checkout away from d/f HEAD (unpacked, to branch)' ' + reset_to_df && + git checkout master +' + +test_expect_success 'checkout away from d/f HEAD (unpacked, to detached)' ' + reset_to_df && + git checkout --detach master +' + +test_expect_success 'pack refs' ' + git pack-refs --all --prune +' + +test_expect_success 'checkout away from d/f HEAD (packed, to branch)' ' + reset_to_df && + git checkout master +' + +test_expect_success 'checkout away from d/f HEAD (packed, to detached)' ' + reset_to_df && + git checkout --detach master +' test_done diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh index 3694174989..0a804dab63 100755 --- a/t/t2025-worktree-add.sh +++ b/t/t2025-worktree-add.sh @@ -123,10 +123,10 @@ test_expect_success 'checkout from a bare repo without "add"' ' test_expect_success 'checkout with grafts' ' test_when_finished rm .git/info/grafts && test_commit abc && - SHA1=`git rev-parse HEAD` && + SHA1=$(git rev-parse HEAD) && test_commit def && test_commit xyz && - echo "`git rev-parse HEAD` $SHA1" >.git/info/grafts && + echo "$(git rev-parse HEAD) $SHA1" >.git/info/grafts && cat >expected <<-\EOF && xyz abc diff --git a/t/t2102-update-index-symlinks.sh b/t/t2102-update-index-symlinks.sh index 4d0d0a3515..22f2c730ae 100755 --- a/t/t2102-update-index-symlinks.sh +++ b/t/t2102-update-index-symlinks.sh @@ -23,7 +23,7 @@ git update-index symlink' test_expect_success \ 'the index entry must still be a symbolic link' ' -case "`git ls-files --stage --cached symlink`" in +case "$(git ls-files --stage --cached symlink)" in 120000" "*symlink) echo pass;; *) echo fail; git ls-files --stage --cached symlink; (exit 1);; esac' diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index da257c020f..3fc484e8c3 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -305,29 +305,4 @@ test_expect_success 'ls-files with "**" patterns and no slashes' ' test_cmp expect actual ' -test_expect_success 'negative patterns' ' - git init reinclude && - ( - cd reinclude && - cat >.gitignore <<-\EOF && - /fooo - /foo - !foo/bar/bar - EOF - mkdir fooo && - cat >fooo/.gitignore <<-\EOF && - !/* - EOF - mkdir -p foo/bar && - touch abc foo/def foo/bar/ghi foo/bar/bar && - git ls-files -o --exclude-standard >../actual && - cat >../expected <<-\EOF && - .gitignore - abc - foo/bar/bar - EOF - test_cmp ../expected ../actual - ) -' - test_done diff --git a/t/t3030-merge-recursive.sh b/t/t3030-merge-recursive.sh index 6224187632..f7b0e599f1 100755 --- a/t/t3030-merge-recursive.sh +++ b/t/t3030-merge-recursive.sh @@ -263,7 +263,7 @@ test_expect_success 'setup 8' ' test_ln_s_add e a && test_tick && git commit -m "rename a->e, symlink a->e" && - oln=`printf e | git hash-object --stdin` + oln=$(printf e | git hash-object --stdin) ' test_expect_success 'setup 9' ' diff --git a/t/t3100-ls-tree-restrict.sh b/t/t3100-ls-tree-restrict.sh index eb73c06a4e..325114f8fe 100755 --- a/t/t3100-ls-tree-restrict.sh +++ b/t/t3100-ls-tree-restrict.sh @@ -28,7 +28,7 @@ test_expect_success \ echo Mi >path2/baz/b && find path? \( -type f -o -type l \) -print | xargs git update-index --add && - tree=`git write-tree` && + tree=$(git write-tree) && echo $tree' test_output () { diff --git a/t/t3101-ls-tree-dirname.sh b/t/t3101-ls-tree-dirname.sh index 026f9f89d9..425d858938 100755 --- a/t/t3101-ls-tree-dirname.sh +++ b/t/t3101-ls-tree-dirname.sh @@ -35,7 +35,7 @@ test_expect_success 'setup' ' echo 222 >path3/2.txt && find *.txt path* \( -type f -o -type l \) -print | xargs git update-index --add && - tree=`git write-tree` && + tree=$(git write-tree) && echo $tree ' diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index d3913f9088..4261403cf6 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -176,4 +176,12 @@ test_expect_success 'git branch --points-at option' ' test_cmp expect actual ' +test_expect_success 'ambiguous branch/tag not marked' ' + git tag ambiguous && + git branch ambiguous && + echo " ambiguous" >expect && + git branch --list ambiguous >actual && + test_cmp expect actual +' + test_done diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index db244d2f88..9b182a0c32 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -27,7 +27,7 @@ SHA1= test_expect_success \ 'see if git show-ref works as expected' \ 'git branch a && - SHA1=`cat .git/refs/heads/a` && + SHA1=$(cat .git/refs/heads/a) && echo "$SHA1 refs/heads/a" >expect && git show-ref a >result && test_cmp expect result' diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index cd70274ea5..2d200fdf36 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -83,6 +83,16 @@ test_expect_success 'edit existing notes' ' test_must_fail git notes show HEAD^ ' +test_expect_success 'show notes from treeish' ' + test "b3" = "$(git notes --ref commits^{tree} show)" && + test "b4" = "$(git notes --ref commits@{1} show)" +' + +test_expect_success 'cannot edit notes from non-ref' ' + test_must_fail git notes --ref commits^{tree} edit && + test_must_fail git notes --ref commits@{1} edit +' + test_expect_success 'cannot "git notes add -m" where notes already exists' ' test_must_fail git notes add -m "b2" && test_path_is_missing .git/NOTES_EDITMSG && diff --git a/t/t3308-notes-merge.sh b/t/t3308-notes-merge.sh index 24d82b49bb..19aed7ec95 100755 --- a/t/t3308-notes-merge.sh +++ b/t/t3308-notes-merge.sh @@ -18,7 +18,9 @@ test_expect_success setup ' git notes add -m "Notes on 1st commit" 1st && git notes add -m "Notes on 2nd commit" 2nd && git notes add -m "Notes on 3rd commit" 3rd && - git notes add -m "Notes on 4th commit" 4th + git notes add -m "Notes on 4th commit" 4th && + # Copy notes to remote-notes + git fetch . refs/notes/*:refs/remote-notes/origin/* ' commit_sha1=$(git rev-parse 1st^{commit}) @@ -66,7 +68,9 @@ test_expect_success 'verify initial notes (x)' ' ' cp expect_notes_x expect_notes_y +cp expect_notes_x expect_notes_v cp expect_log_x expect_log_y +cp expect_log_x expect_log_v test_expect_success 'fail to merge empty notes ref into empty notes ref (z => y)' ' test_must_fail git -c "core.notesRef=refs/notes/y" notes merge z @@ -84,16 +88,12 @@ test_expect_success 'fail to merge into various non-notes refs' ' test_must_fail git -c "core.notesRef=refs/notes/foo^{bar" notes merge x ' -test_expect_success 'fail to merge various non-note-trees' ' - git config core.notesRef refs/notes/y && - test_must_fail git notes merge refs/notes && - test_must_fail git notes merge refs/notes/ && - test_must_fail git notes merge refs/notes/dir && - test_must_fail git notes merge refs/notes/dir/ && - test_must_fail git notes merge refs/heads/master && - test_must_fail git notes merge x: && - test_must_fail git notes merge x:foo && - test_must_fail git notes merge foo^{bar +test_expect_success 'merge non-notes ref into empty notes ref (remote-notes/origin/x => v)' ' + git config core.notesRef refs/notes/v && + git notes merge refs/remote-notes/origin/x && + verify_notes v && + # refs/remote-notes/origin/x and v should point to the same notes commit + test "$(git rev-parse refs/remote-notes/origin/x)" = "$(git rev-parse refs/notes/v)" ' test_expect_success 'merge notes into empty notes ref (x => y)' ' diff --git a/t/t3403-rebase-skip.sh b/t/t3403-rebase-skip.sh index 3968020e64..1f5122b632 100755 --- a/t/t3403-rebase-skip.sh +++ b/t/t3403-rebase-skip.sh @@ -67,7 +67,7 @@ test_expect_success 'rebase --skip with --merge' ' ' test_expect_success 'merge and reference trees equal' ' - test -z "`git diff-tree skip-merge skip-reference`" + test -z "$(git diff-tree skip-merge skip-reference)" ' test_expect_success 'moved back to branch correctly' ' diff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh index b7dff09d06..9cce5ae881 100755 --- a/t/t3511-cherry-pick-x.sh +++ b/t/t3511-cherry-pick-x.sh @@ -77,7 +77,7 @@ test_expect_success setup ' test_expect_success 'cherry-pick -x inserts blank line after one line subject' ' pristine_detach initial && - sha1=`git rev-parse mesg-one-line^0` && + sha1=$(git rev-parse mesg-one-line^0) && git cherry-pick -x mesg-one-line && cat <<-EOF >expect && $mesg_one_line @@ -114,7 +114,7 @@ test_expect_success 'cherry-pick -s inserts blank line after non-conforming foot test_expect_success 'cherry-pick -x inserts blank line when conforming footer not found' ' pristine_detach initial && - sha1=`git rev-parse mesg-no-footer^0` && + sha1=$(git rev-parse mesg-no-footer^0) && git cherry-pick -x mesg-no-footer && cat <<-EOF >expect && $mesg_no_footer @@ -139,7 +139,7 @@ test_expect_success 'cherry-pick -s inserts blank line when conforming footer no test_expect_success 'cherry-pick -x -s inserts blank line when conforming footer not found' ' pristine_detach initial && - sha1=`git rev-parse mesg-no-footer^0` && + sha1=$(git rev-parse mesg-no-footer^0) && git cherry-pick -x -s mesg-no-footer && cat <<-EOF >expect && $mesg_no_footer @@ -164,7 +164,7 @@ test_expect_success 'cherry-pick -s adds sob when last sob doesnt match committe test_expect_success 'cherry-pick -x -s adds sob when last sob doesnt match committer' ' pristine_detach initial && - sha1=`git rev-parse mesg-with-footer^0` && + sha1=$(git rev-parse mesg-with-footer^0) && git cherry-pick -x -s mesg-with-footer && cat <<-EOF >expect && $mesg_with_footer @@ -187,7 +187,7 @@ test_expect_success 'cherry-pick -s refrains from adding duplicate trailing sob' test_expect_success 'cherry-pick -x -s adds sob even when trailing sob exists for committer' ' pristine_detach initial && - sha1=`git rev-parse mesg-with-footer-sob^0` && + sha1=$(git rev-parse mesg-with-footer-sob^0) && git cherry-pick -x -s mesg-with-footer-sob && cat <<-EOF >expect && $mesg_with_footer_sob @@ -200,7 +200,7 @@ test_expect_success 'cherry-pick -x -s adds sob even when trailing sob exists fo test_expect_success 'cherry-pick -x treats "(cherry picked from..." line as part of footer' ' pristine_detach initial && - sha1=`git rev-parse mesg-with-cherry-footer^0` && + sha1=$(git rev-parse mesg-with-cherry-footer^0) && git cherry-pick -x mesg-with-cherry-footer && cat <<-EOF >expect && $mesg_with_cherry_footer @@ -223,7 +223,7 @@ test_expect_success 'cherry-pick -s treats "(cherry picked from..." line as part test_expect_success 'cherry-pick -x -s treats "(cherry picked from..." line as part of footer' ' pristine_detach initial && - sha1=`git rev-parse mesg-with-cherry-footer^0` && + sha1=$(git rev-parse mesg-with-cherry-footer^0) && git cherry-pick -x -s mesg-with-cherry-footer && cat <<-EOF >expect && $mesg_with_cherry_footer diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index 9d90d2c935..2e47a2bfd8 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -115,7 +115,7 @@ test_expect_success '"rm" command printed' ' git add test-file && git commit -m "add file for rm test" && git rm test-file > rm-output && - test `grep "^rm " rm-output | wc -l` = 1 && + test $(grep "^rm " rm-output | wc -l) = 1 && rm -f test-file rm-output && git commit -m "remove file from rm test" ' @@ -125,7 +125,7 @@ test_expect_success '"rm" command suppressed with --quiet' ' git add test-file && git commit -m "add file for rm --quiet test" && git rm --quiet test-file > rm-output && - test `wc -l < rm-output` = 0 && + test $(wc -l < rm-output) = 0 && rm -f test-file rm-output && git commit -m "remove file from rm --quiet test" ' diff --git a/t/t3700-add.sh b/t/t3700-add.sh index f7ff1f555d..f14a665356 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -25,7 +25,7 @@ test_expect_success \ echo foo >xfoo1 && chmod 755 xfoo1 && git add xfoo1 && - case "`git ls-files --stage xfoo1`" in + case "$(git ls-files --stage xfoo1)" in 100644" "*xfoo1) echo pass;; *) echo fail; git ls-files --stage xfoo1; (exit 1);; esac' @@ -33,7 +33,7 @@ test_expect_success \ test_expect_success 'git add: filemode=0 should not get confused by symlink' ' rm -f xfoo1 && test_ln_s_add foo xfoo1 && - case "`git ls-files --stage xfoo1`" in + case "$(git ls-files --stage xfoo1)" in 120000" "*xfoo1) echo pass;; *) echo fail; git ls-files --stage xfoo1; (exit 1);; esac @@ -45,7 +45,7 @@ test_expect_success \ echo foo >xfoo2 && chmod 755 xfoo2 && git update-index --add xfoo2 && - case "`git ls-files --stage xfoo2`" in + case "$(git ls-files --stage xfoo2)" in 100644" "*xfoo2) echo pass;; *) echo fail; git ls-files --stage xfoo2; (exit 1);; esac' @@ -53,7 +53,7 @@ test_expect_success \ test_expect_success 'git add: filemode=0 should not get confused by symlink' ' rm -f xfoo2 && test_ln_s_add foo xfoo2 && - case "`git ls-files --stage xfoo2`" in + case "$(git ls-files --stage xfoo2)" in 120000" "*xfoo2) echo pass;; *) echo fail; git ls-files --stage xfoo2; (exit 1);; esac @@ -63,7 +63,7 @@ test_expect_success \ 'git update-index --add: Test that executable bit is not used...' \ 'git config core.filemode 0 && test_ln_s_add xfoo2 xfoo3 && # runs git update-index --add - case "`git ls-files --stage xfoo3`" in + case "$(git ls-files --stage xfoo3)" in 120000" "*xfoo3) echo pass;; *) echo fail; git ls-files --stage xfoo3; (exit 1);; esac' @@ -173,14 +173,14 @@ test_expect_success 'git add with filemode=0, symlinks=0 prefers stage 2 over st test_expect_success 'git add --refresh' ' >foo && git add foo && git commit -a -m "commit all" && - test -z "`git diff-index HEAD -- foo`" && + test -z "$(git diff-index HEAD -- foo)" && git read-tree HEAD && - case "`git diff-index HEAD -- foo`" in + case "$(git diff-index HEAD -- foo)" in :100644" "*"M foo") echo pass;; *) echo fail; (exit 1);; esac && git add --refresh -- foo && - test -z "`git diff-index HEAD -- foo`" + test -z "$(git diff-index HEAD -- foo)" ' test_expect_success 'git add --refresh with pathspec' ' diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 646c4750ec..3b99434e3e 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -1445,4 +1445,19 @@ test_expect_success 'From line has expected format' ' test_cmp from filtered ' +test_expect_success 'format-patch format.outputDirectory option' ' + test_config format.outputDirectory patches && + rm -fr patches && + git format-patch master..side && + test $(git rev-list master..side | wc -l) -eq $(ls patches | wc -l) +' + +test_expect_success 'format-patch -o overrides format.outputDirectory' ' + test_config format.outputDirectory patches && + rm -fr patches patchset && + git format-patch master..side -o patchset && + test_path_is_missing patches && + test_path_is_dir patchset +' + test_done diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh index c0460bb0e5..43dd474a12 100755 --- a/t/t4056-diff-order.sh +++ b/t/t4056-diff-order.sh @@ -68,6 +68,12 @@ test_expect_success POSIXPERM,SANITY 'unreadable orderfile' ' test_must_fail git diff -Ounreadable_file --name-only HEAD^..HEAD ' +test_expect_success "orderfile using option from subdir with --output" ' + mkdir subdir && + git -C subdir diff -O../order_file_1 --output ../actual --name-only HEAD^..HEAD && + test_cmp expect_1 actual +' + for i in 1 2 do test_expect_success "orderfile using option ($i)" ' diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh index 7600a3e3e8..f5e63670fa 100755 --- a/t/t4201-shortlog.sh +++ b/t/t4201-shortlog.sh @@ -120,6 +120,12 @@ test_expect_success !MINGW 'shortlog from non-git directory' ' test_cmp expect out ' +test_expect_success !MINGW 'shortlog can read --format=raw output' ' + git log --format=raw HEAD >log && + GIT_DIR=non-existing git shortlog -w <log >out && + test_cmp expect out +' + test_expect_success 'shortlog should add newline when input line matches wraplen' ' cat >expect <<\EOF && A U Thor (2): @@ -172,22 +178,6 @@ test_expect_success !MINGW 'shortlog encoding' ' git shortlog HEAD~2.. > out && test_cmp expect out' -test_expect_success 'shortlog ignores commits with missing authors' ' - git commit --allow-empty -m normal && - git commit --allow-empty -m soon-to-be-broken && - git cat-file commit HEAD >commit.tmp && - sed "/^author/d" commit.tmp >broken.tmp && - commit=$(git hash-object -w -t commit --stdin <broken.tmp) && - git update-ref HEAD $commit && - cat >expect <<-\EOF && - A U Thor (1): - normal - - EOF - git shortlog HEAD~2.. >actual && - test_cmp expect actual -' - test_expect_success 'shortlog with revision pseudo options' ' git shortlog --all && git shortlog --branches && diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index e97cfb2ab8..85b3df5e33 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -9,9 +9,9 @@ test_description='git mailinfo and git mailsplit test' test_expect_success 'split sample box' \ 'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last && - last=`cat last` && + last=$(cat last) && echo total is $last && - test `cat last` = 17' + test $(cat last) = 17' check_mailinfo () { mail=$1 opt=$2 @@ -23,7 +23,7 @@ check_mailinfo () { } -for mail in `echo 00*` +for mail in 00* do test_expect_success "mailinfo $mail" ' check_mailinfo $mail "" && @@ -47,11 +47,11 @@ test_expect_success 'split box with rfc2047 samples' \ 'mkdir rfc2047 && git mailsplit -orfc2047 "$TEST_DIRECTORY"/t5100/rfc2047-samples.mbox \ >rfc2047/last && - last=`cat rfc2047/last` && + last=$(cat rfc2047/last) && echo total is $last && - test `cat rfc2047/last` = 11' + test $(cat rfc2047/last) = 11' -for mail in `echo rfc2047/00*` +for mail in rfc2047/00* do test_expect_success "mailinfo $mail" ' git mailinfo -u $mail-msg $mail-patch <$mail >$mail-info && diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 20c1961515..fc2be63e02 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -8,7 +8,7 @@ test_description='git pack-object ' . ./test-lib.sh -TRASH=`pwd` +TRASH=$(pwd) test_expect_success \ 'setup' \ @@ -20,8 +20,8 @@ test_expect_success \ test-genrandom "seed b" 2097152 > b_big && git update-index --add a a_big b b_big c && cat c >d && echo foo >>d && git update-index --add d && - tree=`git write-tree` && - commit=`git commit-tree $tree </dev/null` && { + tree=$(git write-tree) && + commit=$(git commit-tree $tree </dev/null) && { echo $tree && echo $commit && git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/" @@ -29,7 +29,7 @@ test_expect_success \ git diff-tree --root -p $commit && while read object do - t=`git cat-file -t $object` && + t=$(git cat-file -t $object) && git cat-file $t $object || return 1 done <obj-list } >expect' @@ -147,7 +147,7 @@ test_expect_success \ git diff-tree --root -p $commit && while read object do - t=`git cat-file -t $object` && + t=$(git cat-file -t $object) && git cat-file $t $object || return 1 done <obj-list } >current && @@ -162,7 +162,7 @@ test_expect_success \ git diff-tree --root -p $commit && while read object do - t=`git cat-file -t $object` && + t=$(git cat-file -t $object) && git cat-file $t $object || return 1 done <obj-list } >current && @@ -177,7 +177,7 @@ test_expect_success \ git diff-tree --root -p $commit && while read object do - t=`git cat-file -t $object` && + t=$(git cat-file -t $object) && git cat-file $t $object || return 1 done <obj-list } >current && @@ -252,8 +252,8 @@ test_expect_success \ test_expect_success \ 'verify-pack catches a corrupted sum of the index file itself' \ - 'l=`wc -c <test-3.idx` && - l=`expr $l - 20` && + 'l=$(wc -c <test-3.idx) && + l=$(expr $l - 20) && cat test-1-${packname_1}.pack >test-3.pack && printf "%20s" "" | dd of=test-3.idx count=20 bs=1 conv=notrunc seek=$l && if git verify-pack test-3.pack diff --git a/t/t5301-sliding-window.sh b/t/t5301-sliding-window.sh index 2fc5af6007..cae8c2e882 100755 --- a/t/t5301-sliding-window.sh +++ b/t/t5301-sliding-window.sh @@ -16,12 +16,12 @@ test_expect_success \ git update-index --add $i || return 1 done && echo d >d && cat c >>d && git update-index --add d && - tree=`git write-tree` && - commit1=`git commit-tree $tree </dev/null` && + tree=$(git write-tree) && + commit1=$(git commit-tree $tree </dev/null) && git update-ref HEAD $commit1 && git repack -a -d && - test "`git count-objects`" = "0 objects, 0 kilobytes" && - pack1=`ls .git/objects/pack/*.pack` && + test "$(git count-objects)" = "0 objects, 0 kilobytes" && + pack1=$(ls .git/objects/pack/*.pack) && test -f "$pack1"' test_expect_success \ @@ -43,11 +43,11 @@ test_expect_success \ 'repack -a -d, packedGit{WindowSize,Limit} == 1 page' \ 'git config core.packedGitWindowSize 512 && git config core.packedGitLimit 512 && - commit2=`git commit-tree $tree -p $commit1 </dev/null` && + commit2=$(git commit-tree $tree -p $commit1 </dev/null) && git update-ref HEAD $commit2 && git repack -a -d && - test "`git count-objects`" = "0 objects, 0 kilobytes" && - pack2=`ls .git/objects/pack/*.pack` && + test "$(git count-objects)" = "0 objects, 0 kilobytes" && + pack2=$(ls .git/objects/pack/*.pack) && test -f "$pack2" && test "$pack1" \!= "$pack2"' diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh index 3dc5ec4dd3..c2fc584dac 100755 --- a/t/t5302-pack-index.sh +++ b/t/t5302-pack-index.sh @@ -14,21 +14,21 @@ test_expect_success \ i=1 && while test $i -le 100 do - iii=`printf '%03i' $i` + iii=$(printf '%03i' $i) test-genrandom "bar" 200 > wide_delta_$iii && test-genrandom "baz $iii" 50 >> wide_delta_$iii && test-genrandom "foo"$i 100 > deep_delta_$iii && - test-genrandom "foo"`expr $i + 1` 100 >> deep_delta_$iii && - test-genrandom "foo"`expr $i + 2` 100 >> deep_delta_$iii && + test-genrandom "foo"$(expr $i + 1) 100 >> deep_delta_$iii && + test-genrandom "foo"$(expr $i + 2) 100 >> deep_delta_$iii && echo $iii >file_$iii && test-genrandom "$iii" 8192 >>file_$iii && git update-index --add file_$iii deep_delta_$iii wide_delta_$iii && - i=`expr $i + 1` || return 1 + i=$(expr $i + 1) || return 1 done && { echo 101 && test-genrandom 100 8192; } >file_101 && git update-index --add file_101 && - tree=`git write-tree` && - commit=`git commit-tree $tree </dev/null` && { + tree=$(git write-tree) && + commit=$(git commit-tree $tree </dev/null) && { echo $tree && git ls-tree $tree | sed -e "s/.* \\([0-9a-f]*\\) .*/\\1/" } >obj-list && @@ -152,10 +152,10 @@ test_expect_success \ '[index v1] 2) create a stealth corruption in a delta base reference' \ '# This test assumes file_101 is a delta smaller than 16 bytes. # It should be against file_100 but we substitute its base for file_099 - sha1_101=`git hash-object file_101` && - sha1_099=`git hash-object file_099` && - offs_101=`index_obj_offset 1.idx $sha1_101` && - nr_099=`index_obj_nr 1.idx $sha1_099` && + sha1_101=$(git hash-object file_101) && + sha1_099=$(git hash-object file_099) && + offs_101=$(index_obj_offset 1.idx $sha1_101) && + nr_099=$(index_obj_nr 1.idx $sha1_099) && chmod +w ".git/objects/pack/pack-${pack1}.pack" && dd of=".git/objects/pack/pack-${pack1}.pack" seek=$(($offs_101 + 1)) \ if=".git/objects/pack/pack-${pack1}.idx" \ @@ -193,10 +193,10 @@ test_expect_success \ '[index v2] 2) create a stealth corruption in a delta base reference' \ '# This test assumes file_101 is a delta smaller than 16 bytes. # It should be against file_100 but we substitute its base for file_099 - sha1_101=`git hash-object file_101` && - sha1_099=`git hash-object file_099` && - offs_101=`index_obj_offset 1.idx $sha1_101` && - nr_099=`index_obj_nr 1.idx $sha1_099` && + sha1_101=$(git hash-object file_101) && + sha1_099=$(git hash-object file_099) && + offs_101=$(index_obj_offset 1.idx $sha1_101) && + nr_099=$(index_obj_nr 1.idx $sha1_099) && chmod +w ".git/objects/pack/pack-${pack1}.pack" && dd of=".git/objects/pack/pack-${pack1}.pack" seek=$(($offs_101 + 1)) \ if=".git/objects/pack/pack-${pack1}.idx" \ @@ -222,11 +222,11 @@ test_expect_success \ 'rm -f .git/objects/pack/* && git index-pack --index-version=2 --stdin < "test-1-${pack1}.pack" && git verify-pack ".git/objects/pack/pack-${pack1}.pack" && - obj=`git hash-object file_001` && - nr=`index_obj_nr ".git/objects/pack/pack-${pack1}.idx" $obj` && + obj=$(git hash-object file_001) && + nr=$(index_obj_nr ".git/objects/pack/pack-${pack1}.idx" $obj) && chmod +w ".git/objects/pack/pack-${pack1}.idx" && printf xxxx | dd of=".git/objects/pack/pack-${pack1}.idx" conv=notrunc \ - bs=1 count=4 seek=$((8 + 256 * 4 + `wc -l <obj-list` * 20 + $nr * 4)) && + bs=1 count=4 seek=$((8 + 256 * 4 + $(wc -l <obj-list) * 20 + $nr * 4)) && ( while read obj do git cat-file -p $obj >/dev/null || exit 1 done <obj-list ) && diff --git a/t/t5303-pack-corruption-resilience.sh b/t/t5303-pack-corruption-resilience.sh index 663b02bbb1..5940ce2084 100755 --- a/t/t5303-pack-corruption-resilience.sh +++ b/t/t5303-pack-corruption-resilience.sh @@ -32,23 +32,23 @@ create_test_files() { create_new_pack() { rm -rf .git && git init && - blob_1=`git hash-object -t blob -w file_1` && - blob_2=`git hash-object -t blob -w file_2` && - blob_3=`git hash-object -t blob -w file_3` && - pack=`printf "$blob_1\n$blob_2\n$blob_3\n" | - git pack-objects $@ .git/objects/pack/pack` && + blob_1=$(git hash-object -t blob -w file_1) && + blob_2=$(git hash-object -t blob -w file_2) && + blob_3=$(git hash-object -t blob -w file_3) && + pack=$(printf "$blob_1\n$blob_2\n$blob_3\n" | + git pack-objects $@ .git/objects/pack/pack) && pack=".git/objects/pack/pack-${pack}" && git verify-pack -v ${pack}.pack } do_repack() { - pack=`printf "$blob_1\n$blob_2\n$blob_3\n" | - git pack-objects $@ .git/objects/pack/pack` && + pack=$(printf "$blob_1\n$blob_2\n$blob_3\n" | + git pack-objects $@ .git/objects/pack/pack) && pack=".git/objects/pack/pack-${pack}" } do_corrupt_object() { - ofs=`git show-index < ${pack}.idx | grep $1 | cut -f1 -d" "` && + ofs=$(git show-index < ${pack}.idx | grep $1 | cut -f1 -d" ") && ofs=$(($ofs + $2)) && chmod +w ${pack}.pack && dd of=${pack}.pack bs=1 conv=notrunc seek=$ofs && diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index def203c724..133b5842b1 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -266,7 +266,7 @@ EOF ' test_expect_success 'prune .git/shallow' ' - SHA1=`echo hi|git commit-tree HEAD^{tree}` && + SHA1=$(echo hi|git commit-tree HEAD^{tree}) && echo $SHA1 >.git/shallow && git prune --dry-run >out && grep $SHA1 .git/shallow && diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh index 21517c70cd..f314ad5079 100755 --- a/t/t5305-include-tag.sh +++ b/t/t5305-include-tag.sh @@ -3,20 +3,20 @@ test_description='git pack-object --include-tag' . ./test-lib.sh -TRASH=`pwd` +TRASH=$(pwd) test_expect_success setup ' echo c >d && git update-index --add d && - tree=`git write-tree` && - commit=`git commit-tree $tree </dev/null` && + tree=$(git write-tree) && + commit=$(git commit-tree $tree </dev/null) && echo "object $commit" >sig && echo "type commit" >>sig && echo "tag mytag" >>sig && echo "tagger $(git var GIT_COMMITTER_IDENT)" >>sig && echo >>sig && echo "our test tag" >>sig && - tag=`git mktag <sig` && + tag=$(git mktag <sig) && rm d sig && git update-ref refs/tags/mytag $tag && { echo $tree && diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index 3a9b77576f..e5f83bf5e4 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -14,7 +14,7 @@ test_description='Testing multi_ack pack fetching' add () { name=$1 && text="$@" && - branch=`echo $name | sed -e 's/^\(.\).*$/\1/'` && + branch=$(echo $name | sed -e 's/^\(.\).*$/\1/') && parents="" && shift && @@ -50,18 +50,18 @@ pull_to_client () { case "$heads" in *B*) echo $BTIP > .git/refs/heads/B;; esac && - git symbolic-ref HEAD refs/heads/`echo $heads \ - | sed -e "s/^\(.\).*$/\1/"` && + git symbolic-ref HEAD refs/heads/$(echo $heads \ + | sed -e "s/^\(.\).*$/\1/") && git fsck --full && mv .git/objects/pack/pack-* . && - p=`ls -1 pack-*.pack` && + p=$(ls -1 pack-*.pack) && git unpack-objects <$p && git fsck --full && - idx=`echo pack-*.idx` && - pack_count=`git show-index <$idx | wc -l` && + idx=$(echo pack-*.idx) && + pack_count=$(git show-index <$idx | wc -l) && test $pack_count = $count && rm -f pack-* ) @@ -132,13 +132,13 @@ test_expect_success 'single given branch clone' ' test_expect_success 'clone shallow depth 1' ' git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0 && - test "`git --git-dir=shallow0/.git rev-list --count HEAD`" = 1 + test "$(git --git-dir=shallow0/.git rev-list --count HEAD)" = 1 ' test_expect_success 'clone shallow depth 1 with fsck' ' git config --global fetch.fsckobjects true && git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0fsck && - test "`git --git-dir=shallow0fsck/.git rev-list --count HEAD`" = 1 && + test "$(git --git-dir=shallow0fsck/.git rev-list --count HEAD)" = 1 && git config --global --unset fetch.fsckobjects ' @@ -147,7 +147,7 @@ test_expect_success 'clone shallow' ' ' test_expect_success 'clone shallow depth count' ' - test "`git --git-dir=shallow/.git rev-list --count HEAD`" = 2 + test "$(git --git-dir=shallow/.git rev-list --count HEAD)" = 2 ' test_expect_success 'clone shallow object count' ' @@ -273,7 +273,7 @@ test_expect_success 'additional simple shallow deepenings' ' ' test_expect_success 'clone shallow depth count' ' - test "`git --git-dir=shallow/.git rev-list --count HEAD`" = 11 + test "$(git --git-dir=shallow/.git rev-list --count HEAD)" = 11 ' test_expect_success 'clone shallow object count' ' diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index dfaf9d9f68..1a8e3b81c8 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -85,7 +85,7 @@ test_expect_success C_LOCALE_OUTPUT 'check remote-tracking' ' test_expect_success 'remote forces tracking branches' ' ( cd test && - case `git config remote.second.fetch` in + case $(git config remote.second.fetch) in +*) true ;; *) false ;; esac diff --git a/t/t5506-remote-groups.sh b/t/t5506-remote-groups.sh index 530b01678e..83d5558c0e 100755 --- a/t/t5506-remote-groups.sh +++ b/t/t5506-remote-groups.sh @@ -20,7 +20,7 @@ update_repos() { } repo_fetched() { - if test "`git log -1 --pretty=format:%s $1 --`" = "`cat mark`"; then + if test "$(git log -1 --pretty=format:%s $1 --)" = "$(cat mark)"; then echo >&2 "repo was fetched: $1" return 0 fi diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 0ba9db0884..9203a6507f 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -7,7 +7,7 @@ test_description='Per branch config variables affects "git fetch". . ./test-lib.sh -D=`pwd` +D=$(pwd) test_bundle_object_count () { git verify-pack -v "$1" >verify.out && @@ -64,8 +64,8 @@ test_expect_success "fetch test" ' cd two && git fetch && test -f .git/refs/heads/one && - mine=`git rev-parse refs/heads/one` && - his=`cd ../one && git rev-parse refs/heads/master` && + mine=$(git rev-parse refs/heads/one) && + his=$(cd ../one && git rev-parse refs/heads/master) && test "z$mine" = "z$his" ' @@ -75,8 +75,8 @@ test_expect_success "fetch test for-merge" ' git fetch && test -f .git/refs/heads/two && test -f .git/refs/heads/one && - master_in_two=`cd ../two && git rev-parse master` && - one_in_two=`cd ../two && git rev-parse one` && + master_in_two=$(cd ../two && git rev-parse master) && + one_in_two=$(cd ../two && git rev-parse one) && { echo "$one_in_two " echo "$master_in_two not-for-merge" @@ -708,4 +708,17 @@ test_expect_success 'fetching a one-level ref works' ' ) ' +test_expect_success 'fetching with auto-gc does not lock up' ' + write_script askyesno <<-\EOF && + echo "$*" && + false + EOF + git clone "file://$D" auto-gc && + test_commit test2 && + cd auto-gc && + git config gc.autoPackLimit 1 && + GIT_ASK_YESNO="$D/askyesno" git fetch >fetch.out 2>&1 && + ! grep "Should I try again" fetch.out +' + test_done diff --git a/t/t5512-ls-remote.sh b/t/t5512-ls-remote.sh index aadaac515e..819b9ddd0f 100755 --- a/t/t5512-ls-remote.sh +++ b/t/t5512-ls-remote.sh @@ -163,4 +163,49 @@ test_expect_success 'overrides work between mixed transfer/upload-pack hideRefs' grep refs/tags/magic actual ' +test_expect_success 'ls-remote --symref' ' + cat >expect <<-\EOF && + ref: refs/heads/master HEAD + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a HEAD + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/heads/master + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/remotes/origin/HEAD + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/remotes/origin/master + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/tags/mark + EOF + git ls-remote --symref >actual && + test_cmp expect actual +' + +test_expect_success 'ls-remote with filtered symref (refname)' ' + cat >expect <<-\EOF && + ref: refs/heads/master HEAD + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a HEAD + EOF + git ls-remote --symref . HEAD >actual && + test_cmp expect actual +' + +test_expect_failure 'ls-remote with filtered symref (--heads)' ' + git symbolic-ref refs/heads/foo refs/tags/mark && + cat >expect <<-\EOF && + ref: refs/tags/mark refs/heads/foo + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/heads/foo + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/heads/master + EOF + git ls-remote --symref --heads . >actual && + test_cmp expect actual +' + +test_expect_success 'ls-remote --symref omits filtered-out matches' ' + cat >expect <<-\EOF && + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/heads/foo + 1bd44cb9d13204b0fe1958db0082f5028a16eb3a refs/heads/master + EOF + git ls-remote --symref --heads . >actual && + test_cmp expect actual && + git ls-remote --symref . "refs/heads/*" >actual && + test_cmp expect actual +' + + test_done diff --git a/t/t5515-fetch-merge-logic.sh b/t/t5515-fetch-merge-logic.sh index dbb927dec8..36b0dbc01c 100755 --- a/t/t5515-fetch-merge-logic.sh +++ b/t/t5515-fetch-merge-logic.sh @@ -128,8 +128,8 @@ do case "$cmd" in '' | '#'*) continue ;; esac - test=`echo "$cmd" | sed -e 's|[/ ][/ ]*|_|g'` - pfx=`printf "%04d" $test_count` + test=$(echo "$cmd" | sed -e 's|[/ ][/ ]*|_|g') + pfx=$(printf "%04d" $test_count) expect_f="$TEST_DIRECTORY/t5515/fetch.$test" actual_f="$pfx-fetch.$test" expect_r="$TEST_DIRECTORY/t5515/refs.$test" diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 0a87e195ea..26b2cafc47 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -16,7 +16,7 @@ This test checks the following functionality: . ./test-lib.sh -D=`pwd` +D=$(pwd) mk_empty () { repo_name="$1" @@ -422,7 +422,7 @@ test_expect_success 'push tag with non-existent, incomplete dest' ' test_expect_success 'push sha1 with non-existent, incomplete dest' ' mk_test testrepo && - test_must_fail git push testrepo `git rev-parse master`:foo + test_must_fail git push testrepo $(git rev-parse master):foo ' diff --git a/t/t5517-push-mirror.sh b/t/t5517-push-mirror.sh index 12a5dfb17e..02f160aae0 100755 --- a/t/t5517-push-mirror.sh +++ b/t/t5517-push-mirror.sh @@ -4,7 +4,7 @@ test_description='pushing to a mirror repository' . ./test-lib.sh -D=`pwd` +D=$(pwd) invert () { if "$@"; then diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index a0013ee32f..c952d5ef5c 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -326,6 +326,16 @@ test_expect_success 'pull.rebase=preserve rebases and merges keep-merge' ' test "$(git rev-parse HEAD^2)" = "$(git rev-parse keep-merge)" ' +test_expect_success 'pull.rebase=interactive' ' + write_script "$TRASH_DIRECTORY/fake-editor" <<-\EOF && + echo I was here >fake.out && + false + EOF + test_set_editor "$TRASH_DIRECTORY/fake-editor" && + test_must_fail git pull --rebase=interactive . copy && + test "I was here" = "$(cat fake.out)" +' + test_expect_success 'pull.rebase=invalid fails' ' git reset --hard before-preserve-rebase && test_config pull.rebase invalid && diff --git a/t/t5522-pull-symlink.sh b/t/t5522-pull-symlink.sh index 8e9b204e02..bcff460d0a 100755 --- a/t/t5522-pull-symlink.sh +++ b/t/t5522-pull-symlink.sh @@ -54,7 +54,7 @@ test_expect_success SYMLINKS 'pulling from real subdir' ' # git rev-parse --show-cdup printed a path relative to # clone-repo/subdir/, not subdir-link/. Git rev-parse --show-cdup # used the correct .git, but when the git pull shell script did -# "cd `git rev-parse --show-cdup`", it ended up in the wrong +# "cd $(git rev-parse --show-cdup)", it ended up in the wrong # directory. A POSIX shell's "cd" works a little differently # than chdir() in C; "cd -P" is much closer to chdir(). # diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index a4532b00d6..1241146227 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -16,7 +16,8 @@ add_upstream_commit() { git add subfile && git commit -m new subfile && head2=$(git rev-parse --short HEAD) && - echo "From $pwd/submodule" > ../expect.err && + echo "Fetching submodule submodule" > ../expect.err && + echo "From $pwd/submodule" >> ../expect.err && echo " $head1..$head2 master -> origin/master" >> ../expect.err ) && ( @@ -27,6 +28,7 @@ add_upstream_commit() { git add deepsubfile && git commit -m new deepsubfile && head2=$(git rev-parse --short HEAD) && + echo "Fetching submodule submodule/subdir/deepsubmodule" >> ../expect.err echo "From $pwd/deepsubmodule" >> ../expect.err && echo " $head1..$head2 master -> origin/master" >> ../expect.err ) @@ -56,9 +58,7 @@ test_expect_success setup ' ( cd downstream && git submodule update --init --recursive - ) && - echo "Fetching submodule submodule" > expect.out && - echo "Fetching submodule submodule/subdir/deepsubmodule" >> expect.out + ) ' test_expect_success "fetch --recurse-submodules recurses into submodules" ' @@ -67,10 +67,21 @@ test_expect_success "fetch --recurse-submodules recurses into submodules" ' cd downstream && git fetch --recurse-submodules >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' +test_expect_success "fetch --recurse-submodules -j2 has the same output behaviour" ' + add_upstream_commit && + ( + cd downstream && + GIT_TRACE=$(pwd)/../trace.out git fetch --recurse-submodules -j2 2>../actual.err + ) && + test_must_be_empty actual.out && + test_i18ncmp expect.err actual.err && + grep "2 tasks" trace.out +' + test_expect_success "fetch alone only fetches superproject" ' add_upstream_commit && ( @@ -96,7 +107,7 @@ test_expect_success "using fetchRecurseSubmodules=true in .gitmodules recurses i git config -f .gitmodules submodule.submodule.fetchRecurseSubmodules true && git fetch >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -127,7 +138,7 @@ test_expect_success "--recurse-submodules overrides fetchRecurseSubmodules setti git config --unset -f .gitmodules submodule.submodule.fetchRecurseSubmodules && git config --unset submodule.submodule.fetchRecurseSubmodules ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -140,13 +151,22 @@ test_expect_success "--quiet propagates to submodules" ' ! test -s actual.err ' +test_expect_success "--quiet propagates to parallel submodules" ' + ( + cd downstream && + git fetch --recurse-submodules -j 2 --quiet >../actual.out 2>../actual.err + ) && + ! test -s actual.out && + ! test -s actual.err +' + test_expect_success "--dry-run propagates to submodules" ' add_upstream_commit && ( cd downstream && git fetch --recurse-submodules --dry-run >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -155,7 +175,7 @@ test_expect_success "Without --dry-run propagates to submodules" ' cd downstream && git fetch --recurse-submodules >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -166,7 +186,7 @@ test_expect_success "recurseSubmodules=true propagates into submodules" ' git config fetch.recurseSubmodules true git fetch >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -180,7 +200,7 @@ test_expect_success "--recurse-submodules overrides config in submodule" ' ) && git fetch --recurse-submodules >../actual.out 2>../actual.err ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -214,16 +234,15 @@ test_expect_success "Recursion stops when no new submodule commits are fetched" git add submodule && git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && - echo "Fetching submodule submodule" > expect.out.sub && echo "From $pwd/." > expect.err.sub && echo " $head1..$head2 master -> origin/master" >>expect.err.sub && - head -2 expect.err >> expect.err.sub && + head -3 expect.err >> expect.err.sub && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && test_i18ncmp expect.err.sub actual.err && - test_i18ncmp expect.out.sub actual.out + test_must_be_empty actual.out ' test_expect_success "Recursion doesn't happen when new superproject commits don't change any submodules" ' @@ -269,7 +288,7 @@ test_expect_success "Recursion picks up config in submodule" ' ) ) && test_i18ncmp expect.err.sub actual.err && - test_i18ncmp expect.out actual.out + test_must_be_empty actual.out ' test_expect_success "Recursion picks up all submodules when necessary" ' @@ -285,7 +304,8 @@ test_expect_success "Recursion picks up all submodules when necessary" ' git add subdir/deepsubmodule && git commit -m "new deepsubmodule" head2=$(git rev-parse --short HEAD) && - echo "From $pwd/submodule" > ../expect.err.sub && + echo "Fetching submodule submodule" > ../expect.err.sub && + echo "From $pwd/submodule" >> ../expect.err.sub && echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub ) && head1=$(git rev-parse --short HEAD) && @@ -295,13 +315,13 @@ test_expect_success "Recursion picks up all submodules when necessary" ' echo "From $pwd/." > expect.err.2 && echo " $head1..$head2 master -> origin/master" >> expect.err.2 && cat expect.err.sub >> expect.err.2 && - tail -2 expect.err >> expect.err.2 && + tail -3 expect.err >> expect.err.2 && ( cd downstream && git fetch >../actual.out 2>../actual.err ) && test_i18ncmp expect.err.2 actual.err && - test_i18ncmp expect.out actual.out + test_must_be_empty actual.out ' test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no new commits are fetched in the superproject (and ignores config)" ' @@ -317,7 +337,8 @@ test_expect_success "'--recurse-submodules=on-demand' doesn't recurse when no ne git add subdir/deepsubmodule && git commit -m "new deepsubmodule" && head2=$(git rev-parse --short HEAD) && - echo "From $pwd/submodule" > ../expect.err.sub && + echo Fetching submodule submodule > ../expect.err.sub && + echo "From $pwd/submodule" >> ../expect.err.sub && echo " $head1..$head2 master -> origin/master" >> ../expect.err.sub ) && ( @@ -335,7 +356,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess git add submodule && git commit -m "new submodule" && head2=$(git rev-parse --short HEAD) && - tail -2 expect.err > expect.err.deepsub && + tail -3 expect.err > expect.err.deepsub && echo "From $pwd/." > expect.err && echo " $head1..$head2 master -> origin/master" >>expect.err && cat expect.err.sub >> expect.err && @@ -354,7 +375,7 @@ test_expect_success "'--recurse-submodules=on-demand' recurses as deep as necess git config --unset -f .gitmodules submodule.subdir/deepsubmodule.fetchRecursive ) ) && - test_i18ncmp expect.out actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err actual.err ' @@ -388,7 +409,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && echo " $head1..$head2 master -> origin/master" >>expect.err.2 && - head -2 expect.err >> expect.err.2 && + head -3 expect.err >> expect.err.2 && ( cd downstream && git config fetch.recurseSubmodules on-demand && @@ -399,7 +420,7 @@ test_expect_success "'fetch.recurseSubmodules=on-demand' overrides global config cd downstream && git config --unset fetch.recurseSubmodules ) && - test_i18ncmp expect.out.sub actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err.2 actual.err ' @@ -416,7 +437,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override head2=$(git rev-parse --short HEAD) && echo "From $pwd/." > expect.err.2 && echo " $head1..$head2 master -> origin/master" >>expect.err.2 && - head -2 expect.err >> expect.err.2 && + head -3 expect.err >> expect.err.2 && ( cd downstream && git config submodule.submodule.fetchRecurseSubmodules on-demand && @@ -427,7 +448,7 @@ test_expect_success "'submodule.<sub>.fetchRecurseSubmodules=on-demand' override cd downstream && git config --unset submodule.submodule.fetchRecurseSubmodules ) && - test_i18ncmp expect.out.sub actual.out && + test_must_be_empty actual.out && test_i18ncmp expect.err.2 actual.err ' diff --git a/t/t5530-upload-pack-error.sh b/t/t5530-upload-pack-error.sh index 3932e797f7..4f6e32b04c 100755 --- a/t/t5530-upload-pack-error.sh +++ b/t/t5530-upload-pack-error.sh @@ -4,7 +4,7 @@ test_description='errors in upload-pack' . ./test-lib.sh -D=`pwd` +D=$(pwd) corrupt_repo () { object_sha1=$(git rev-parse "$1") && diff --git a/t/t5532-fetch-proxy.sh b/t/t5532-fetch-proxy.sh index 5531bd1af4..d75ef0ea2b 100755 --- a/t/t5532-fetch-proxy.sh +++ b/t/t5532-fetch-proxy.sh @@ -15,7 +15,7 @@ test_expect_success 'setup remote repo' ' cat >proxy <<'EOF' #!/bin/sh echo >&2 "proxying for $*" -cmd=`"$PERL_PATH" -e ' +cmd=$("$PERL_PATH" -e ' read(STDIN, $buf, 4); my $n = hex($buf) - 4; read(STDIN, $buf, $n); @@ -23,7 +23,7 @@ cmd=`"$PERL_PATH" -e ' # drop absolute-path on repo name $cmd =~ s{ /}{ }; print $cmd; -'` +') echo >&2 "Running '$cmd'" exec $cmd EOF diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh index a980574682..df8d2f095a 100755 --- a/t/t5537-fetch-shallow.sh +++ b/t/t5537-fetch-shallow.sh @@ -98,7 +98,7 @@ EOF test_expect_success 'fetch something upstream has but hidden by clients shallow boundaries' ' # the blob "1" is available in .git but hidden by the # shallow2/.git/shallow and it should be resent - ! git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` >/dev/null && + ! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null && echo 1 >1.t && git add 1.t && git commit -m add-1-back && @@ -114,7 +114,7 @@ add-1-back EOF test_cmp expect actual ) && - git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` >/dev/null + git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null ' diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh index ceee95b8a4..ecbf84d21c 100755 --- a/t/t5538-push-shallow.sh +++ b/t/t5538-push-shallow.sh @@ -104,7 +104,7 @@ EOF ' test_expect_success 'push from full to shallow' ' - ! git --git-dir=shallow2/.git cat-file blob `echo 1|git hash-object --stdin` && + ! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) && commit 1 && git push shallow2/.git +master:refs/remotes/top/master && ( @@ -117,7 +117,7 @@ test_expect_success 'push from full to shallow' ' 3 EOF test_cmp expect actual && - git cat-file blob `echo 1|git hash-object --stdin` >/dev/null + git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null ) ' test_done diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index 87a7aa04ae..64146352ae 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -132,7 +132,7 @@ test_expect_success 'fetch packed objects' ' test_expect_success 'fetch notices corrupt pack' ' cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git && - p=`ls objects/pack/pack-*.pack` && + p=$(ls objects/pack/pack-*.pack) && chmod u+w $p && printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc ) && @@ -140,14 +140,14 @@ test_expect_success 'fetch notices corrupt pack' ' (cd repo_bad1.git && git --bare init && test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad1.git && - test 0 = `ls objects/pack/pack-*.pack | wc -l` + test 0 = $(ls objects/pack/pack-*.pack | wc -l) ) ' test_expect_success 'fetch notices corrupt idx' ' cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git && - p=`ls objects/pack/pack-*.idx` && + p=$(ls objects/pack/pack-*.idx) && chmod u+w $p && printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc ) && @@ -155,7 +155,7 @@ test_expect_success 'fetch notices corrupt idx' ' (cd repo_bad2.git && git --bare init && test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad2.git && - test 0 = `ls objects/pack | wc -l` + test 0 = $(ls objects/pack | wc -l) ) ' diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index b7e283252d..d76269a8fc 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -57,7 +57,7 @@ test_expect_success 'prepare pack objects' ' test_expect_success 'fetch notices corrupt pack' ' cp -R "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_pack.git "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_bad1.git && (cd "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_bad1.git && - p=`ls objects/pack/pack-*.pack` && + p=$(ls objects/pack/pack-*.pack) && chmod u+w $p && printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc ) && @@ -65,14 +65,14 @@ test_expect_success 'fetch notices corrupt pack' ' (cd repo_bad1.git && git --bare init && test_must_fail git --bare fetch "$GIT_DAEMON_URL/repo_bad1.git" && - test 0 = `ls objects/pack/pack-*.pack | wc -l` + test 0 = $(ls objects/pack/pack-*.pack | wc -l) ) ' test_expect_success 'fetch notices corrupt idx' ' cp -R "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_pack.git "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_bad2.git && (cd "$GIT_DAEMON_DOCUMENT_ROOT_PATH"/repo_bad2.git && - p=`ls objects/pack/pack-*.idx` && + p=$(ls objects/pack/pack-*.idx) && chmod u+w $p && printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc ) && @@ -80,7 +80,7 @@ test_expect_success 'fetch notices corrupt idx' ' (cd repo_bad2.git && git --bare init && test_must_fail git --bare fetch "$GIT_DAEMON_URL/repo_bad2.git" && - test 0 = `ls objects/pack | wc -l` + test 0 = $(ls objects/pack | wc -l) ) ' diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 9b34f3c615..669ec9ba81 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -65,6 +65,29 @@ test_expect_success 'clone respects GIT_WORK_TREE' ' ' +test_expect_success 'clone from hooks' ' + + test_create_repo r0 && + cd r0 && + test_commit initial && + cd .. && + git init r1 && + cd r1 && + cat >.git/hooks/pre-commit <<-\EOF && + #!/bin/sh + git clone ../r0 ../r2 + exit 1 + EOF + chmod u+x .git/hooks/pre-commit && + : >file && + git add file && + test_must_fail git commit -m invoke-hook && + cd .. && + test_cmp r0/.git/HEAD r2/.git/HEAD && + test_cmp r0/initial.t r2/initial.t + +' + test_expect_success 'clone creates intermediate directories' ' git clone src long/path/to/dst && @@ -221,7 +244,7 @@ test_expect_success 'clone separate gitdir' ' ' test_expect_success 'clone separate gitdir: output' ' - echo "gitdir: `pwd`/realgitdir" >expected && + echo "gitdir: $(pwd)/realgitdir" >expected && test_cmp expected dst/.git ' diff --git a/t/t5700-clone-reference.sh b/t/t5700-clone-reference.sh index dfa1bf79c5..4320082b1b 100755 --- a/t/t5700-clone-reference.sh +++ b/t/t5700-clone-reference.sh @@ -6,7 +6,7 @@ test_description='test clone --reference' . ./test-lib.sh -base_dir=`pwd` +base_dir=$(pwd) U=$base_dir/UPLOAD_LOG diff --git a/t/t5710-info-alternate.sh b/t/t5710-info-alternate.sh index 5a6e49d18d..9cd2626dba 100755 --- a/t/t5710-info-alternate.sh +++ b/t/t5710-info-alternate.sh @@ -21,7 +21,7 @@ test_valid_repo() { test_line_count = 0 fsck.log } -base_dir=`pwd` +base_dir=$(pwd) test_expect_success 'preparing first repository' \ 'test_create_repo A && cd A && diff --git a/t/t5900-repo-selection.sh b/t/t5900-repo-selection.sh index 3d5b418bb4..14e59c5b3e 100755 --- a/t/t5900-repo-selection.sh +++ b/t/t5900-repo-selection.sh @@ -15,7 +15,7 @@ make_tree() { make_bare() { git init --bare "$1" && (cd "$1" && - tree=`git hash-object -w -t tree /dev/null` && + tree=$(git hash-object -w -t tree /dev/null) && commit=$(echo "$1" | git commit-tree $tree) && git update-ref HEAD $commit ) diff --git a/t/t6001-rev-list-graft.sh b/t/t6001-rev-list-graft.sh index 8efcd13079..05ddc69cf2 100755 --- a/t/t6001-rev-list-graft.sh +++ b/t/t6001-rev-list-graft.sh @@ -10,15 +10,15 @@ test_expect_success setup ' echo >subdir/fileB fileB && git add fileA subdir/fileB && git commit -a -m "Initial in one history." && - A0=`git rev-parse --verify HEAD` && + A0=$(git rev-parse --verify HEAD) && echo >fileA fileA modified && git commit -a -m "Second in one history." && - A1=`git rev-parse --verify HEAD` && + A1=$(git rev-parse --verify HEAD) && echo >subdir/fileB fileB modified && git commit -a -m "Third in one history." && - A2=`git rev-parse --verify HEAD` && + A2=$(git rev-parse --verify HEAD) && rm -f .git/refs/heads/master .git/index && @@ -26,15 +26,15 @@ test_expect_success setup ' echo >subdir/fileB fileB again && git add fileA subdir/fileB && git commit -a -m "Initial in alternate history." && - B0=`git rev-parse --verify HEAD` && + B0=$(git rev-parse --verify HEAD) && echo >fileA fileA modified in alternate history && git commit -a -m "Second in alternate history." && - B1=`git rev-parse --verify HEAD` && + B1=$(git rev-parse --verify HEAD) && echo >subdir/fileB fileB modified in alternate history && git commit -a -m "Third in alternate history." && - B2=`git rev-parse --verify HEAD` && + B2=$(git rev-parse --verify HEAD) && : done ' diff --git a/t/t6002-rev-list-bisect.sh b/t/t6002-rev-list-bisect.sh index 43ad772484..3bf2759eae 100755 --- a/t/t6002-rev-list-bisect.sh +++ b/t/t6002-rev-list-bisect.sh @@ -27,9 +27,9 @@ test_bisection_diff() # Test if bisection size is close to half of list size within # tolerance. # - _bisect_err=`expr $_list_size - $_bisection_size \* 2` - test "$_bisect_err" -lt 0 && _bisect_err=`expr 0 - $_bisect_err` - _bisect_err=`expr $_bisect_err / 2` ; # floor + _bisect_err=$(expr $_list_size - $_bisection_size \* 2) + test "$_bisect_err" -lt 0 && _bisect_err=$(expr 0 - $_bisect_err) + _bisect_err=$(expr $_bisect_err / 2) ; # floor test_expect_success \ "bisection diff $_bisect_option $_head $* <= $_max_diff" \ diff --git a/t/t6015-rev-list-show-all-parents.sh b/t/t6015-rev-list-show-all-parents.sh index 8b146fb432..3c73c93ba6 100755 --- a/t/t6015-rev-list-show-all-parents.sh +++ b/t/t6015-rev-list-show-all-parents.sh @@ -6,11 +6,11 @@ test_description='--show-all --parents does not rewrite TREESAME commits' test_expect_success 'set up --show-all --parents test' ' test_commit one foo.txt && - commit1=`git rev-list -1 HEAD` && + commit1=$(git rev-list -1 HEAD) && test_commit two bar.txt && - commit2=`git rev-list -1 HEAD` && + commit2=$(git rev-list -1 HEAD) && test_commit three foo.txt && - commit3=`git rev-list -1 HEAD` + commit3=$(git rev-list -1 HEAD) ' test_expect_success '--parents rewrites TREESAME parents correctly' ' diff --git a/t/t6032-merge-large-rename.sh b/t/t6032-merge-large-rename.sh index 0f79268917..80777386dc 100755 --- a/t/t6032-merge-large-rename.sh +++ b/t/t6032-merge-large-rename.sh @@ -20,7 +20,7 @@ test_expect_success 'setup (initial)' ' make_text() { echo $1: $2 - for i in `count 20`; do + for i in $(count 20); do echo $1: $i done echo $1: $3 diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index 4d5a25eedf..c630aba657 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -351,11 +351,15 @@ test_expect_success 'test --format long' ' test_cmp expected actual ' -test_expect_success 'setup a fake editor' ' - write_script fakeeditor <<-\EOF +test_expect_success 'setup fake editors' ' + write_script fakeeditor <<-\EOF && sed -e "s/A U Thor/A fake Thor/" "$1" >"$1.new" mv "$1.new" "$1" EOF + write_script failingfakeeditor <<-\EOF + ./fakeeditor "$@" + false + EOF ' test_expect_success '--edit with and without already replaced object' ' @@ -372,7 +376,7 @@ test_expect_success '--edit with and without already replaced object' ' test_expect_success '--edit and change nothing or command failed' ' git replace -d "$PARA3" && test_must_fail env GIT_EDITOR=true git replace --edit "$PARA3" && - test_must_fail env GIT_EDITOR="./fakeeditor;false" git replace --edit "$PARA3" && + test_must_fail env GIT_EDITOR="./failingfakeeditor" git replace --edit "$PARA3" && GIT_EDITOR=./fakeeditor git replace --edit "$PARA3" && git replace -l | grep "$PARA3" && git cat-file commit "$PARA3" | grep "A fake Thor" diff --git a/t/t6132-pathspec-exclude.sh b/t/t6132-pathspec-exclude.sh index e1e1b1fa38..d51595cf6b 100755 --- a/t/t6132-pathspec-exclude.sh +++ b/t/t6132-pathspec-exclude.sh @@ -7,7 +7,7 @@ test_description='test case exclude pathspec' test_expect_success 'setup' ' for p in file sub/file sub/sub/file sub/file2 sub/sub/sub/file sub2/file; do if echo $p | grep /; then - mkdir -p `dirname $p` + mkdir -p $(dirname $p) fi && : >$p && git add $p && diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 03873b09d1..19a2823025 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -49,11 +49,17 @@ test_atom() { } test_atom head refname refs/heads/master +test_atom head refname:short master +test_atom head refname:strip=1 heads/master +test_atom head refname:strip=2 master test_atom head upstream refs/remotes/origin/master +test_atom head upstream:short origin/master test_atom head push refs/remotes/myfork/master +test_atom head push:short myfork/master test_atom head objecttype commit test_atom head objectsize 171 test_atom head objectname $(git rev-parse refs/heads/master) +test_atom head objectname:short $(git rev-parse --short refs/heads/master) test_atom head tree $(git rev-parse refs/heads/master^{tree}) test_atom head parent '' test_atom head numparent 0 @@ -86,11 +92,13 @@ test_atom head contents 'Initial test_atom head HEAD '*' test_atom tag refname refs/tags/testtag +test_atom tag refname:short testtag test_atom tag upstream '' test_atom tag push '' test_atom tag objecttype tag test_atom tag objectsize 154 test_atom tag objectname $(git rev-parse refs/tags/testtag) +test_atom tag objectname:short $(git rev-parse --short refs/tags/testtag) test_atom tag tree '' test_atom tag parent '' test_atom tag numparent '' @@ -126,6 +134,16 @@ test_expect_success 'Check invalid atoms names are errors' ' test_must_fail git for-each-ref --format="%(INVALID)" refs/heads ' +test_expect_success 'arguments to :strip must be positive integers' ' + test_must_fail git for-each-ref --format="%(refname:strip=0)" && + test_must_fail git for-each-ref --format="%(refname:strip=-1)" && + test_must_fail git for-each-ref --format="%(refname:strip=foo)" +' + +test_expect_success 'stripping refnames too far gives an error' ' + test_must_fail git for-each-ref --format="%(refname:strip=3)" +' + test_expect_success 'Check format specifiers are ignored in naming date atoms' ' git for-each-ref --format="%(authordate)" refs/heads && git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads && @@ -338,47 +356,14 @@ for i in "--perl --shell" "-s --python" "--python --tcl" "--tcl --perl"; do " done -cat >expected <<\EOF -master -testtag -EOF - -test_expect_success 'Check short refname format' ' - (git for-each-ref --format="%(refname:short)" refs/heads && - git for-each-ref --format="%(refname:short)" refs/tags) >actual && - test_cmp expected actual -' - -cat >expected <<EOF -origin/master -EOF - -test_expect_success 'Check short upstream format' ' - git for-each-ref --format="%(upstream:short)" refs/heads >actual && - test_cmp expected actual -' - test_expect_success 'setup for upstream:track[short]' ' test_commit two ' -cat >expected <<EOF -[ahead 1] -EOF - -test_expect_success 'Check upstream:track format' ' - git for-each-ref --format="%(upstream:track)" refs/heads >actual && - test_cmp expected actual -' - -cat >expected <<EOF -> -EOF - -test_expect_success 'Check upstream:trackshort format' ' - git for-each-ref --format="%(upstream:trackshort)" refs/heads >actual && - test_cmp expected actual -' +test_atom head upstream:track '[ahead 1]' +test_atom head upstream:trackshort '>' +test_atom head push:track '[ahead 1]' +test_atom head push:trackshort '>' test_expect_success 'Check that :track[short] cannot be used with other atoms' ' test_must_fail git for-each-ref --format="%(refname:track)" 2>/dev/null && @@ -398,21 +383,6 @@ test_expect_success 'Check that :track[short] works when upstream is invalid' ' test_cmp expected actual ' -test_expect_success '%(push) supports tracking specifiers, too' ' - echo "[ahead 1]" >expected && - git for-each-ref --format="%(push:track)" refs/heads >actual && - test_cmp expected actual -' - -cat >expected <<EOF -$(git rev-parse --short HEAD) -EOF - -test_expect_success 'Check short objectname format' ' - git for-each-ref --format="%(objectname:short)" refs/heads >actual && - test_cmp expected actual -' - test_expect_success 'Check for invalid refname format' ' test_must_fail git for-each-ref --format="%(refname:INVALID)" ' diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh index 7b56081137..51dd2b4e0e 100755 --- a/t/t7001-mv.sh +++ b/t/t7001-mv.sh @@ -156,11 +156,11 @@ test_expect_success "Michael Cassar's test case" ' echo b > partA/outline.txt && echo c > papers/unsorted/_another && git add papers partA && - T1=`git write-tree` && + T1=$(git write-tree) && git mv papers/unsorted/Thesis.pdf papers/all-papers/moo-blah.pdf && - T=`git write-tree` && + T=$(git write-tree) && git ls-tree -r $T | verbose grep partA/outline.txt ' diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 869e0bf073..cb8fbd8e5e 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -333,6 +333,14 @@ test_expect_success 'prune empty collapsed merges' ' test_cmp expect actual ' +test_expect_success 'prune empty works even without index/tree filters' ' + git rev-list HEAD >expect && + git commit --allow-empty -m empty && + git filter-branch -f --prune-empty HEAD && + git rev-list HEAD >actual && + test_cmp expect actual +' + test_expect_success '--remap-to-ancestor with filename filters' ' git checkout master && git reset --hard A && @@ -387,7 +395,7 @@ test_expect_success 'setup submodule' ' git branch original HEAD ' -orig_head=`git show-ref --hash --head HEAD` +orig_head=$(git show-ref --hash --head HEAD) test_expect_success 'rewrite submodule with another content' ' git filter-branch --tree-filter "test -d submod && { @@ -396,7 +404,7 @@ test_expect_success 'rewrite submodule with another content' ' mkdir submod && : > submod/file } || :" HEAD && - test $orig_head != `git show-ref --hash --head HEAD` + test $orig_head != $(git show-ref --hash --head HEAD) ' test_expect_success 'replace submodule revision' ' @@ -405,7 +413,7 @@ test_expect_success 'replace submodule revision' ' "if git ls-files --error-unmatch -- submod > /dev/null 2>&1 then git update-index --cacheinfo 160000 0123456789012345678901234567890123456789 submod fi" HEAD && - test $orig_head != `git show-ref --hash --head HEAD` + test $orig_head != $(git show-ref --hash --head HEAD) ' test_expect_success 'filter commit message without trailing newline' ' diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index 3dd2f51e49..cf3469b142 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -23,8 +23,8 @@ test_expect_success 'listing all tags in an empty tree should succeed' ' ' test_expect_success 'listing all tags in an empty tree should output nothing' ' - test `git tag -l | wc -l` -eq 0 && - test `git tag | wc -l` -eq 0 + test $(git tag -l | wc -l) -eq 0 && + test $(git tag | wc -l) -eq 0 ' test_expect_success 'looking for a tag in an empty tree should fail' \ @@ -72,8 +72,8 @@ test_expect_success 'listing all tags if one exists should succeed' ' ' test_expect_success 'listing all tags if one exists should output that tag' ' - test `git tag -l` = mytag && - test `git tag` = mytag + test $(git tag -l) = mytag && + test $(git tag) = mytag ' # pattern matching: @@ -83,7 +83,7 @@ test_expect_success 'listing a tag using a matching pattern should succeed' \ test_expect_success \ 'listing a tag using a matching pattern should output that tag' \ - 'test `git tag -l mytag` = mytag' + 'test $(git tag -l mytag) = mytag' # todo: git tag -l now returns always zero, when fixed, change this test test_expect_success \ @@ -92,7 +92,7 @@ test_expect_success \ test_expect_success \ 'listing tags using a non-matching pattern should output nothing' \ - 'test `git tag -l xxx | wc -l` -eq 0' + 'test $(git tag -l xxx | wc -l) -eq 0' # special cases for creating tags: @@ -102,13 +102,13 @@ test_expect_success \ test_expect_success \ 'trying to create a tag with a non-valid name should fail' ' - test `git tag -l | wc -l` -eq 1 && + test $(git tag -l | wc -l) -eq 1 && test_must_fail git tag "" && test_must_fail git tag .othertag && test_must_fail git tag "other tag" && test_must_fail git tag "othertag^" && test_must_fail git tag "other~tag" && - test `git tag -l | wc -l` -eq 1 + test $(git tag -l | wc -l) -eq 1 ' test_expect_success 'creating a tag using HEAD directly should succeed' ' @@ -1558,4 +1558,12 @@ test_expect_success '--no-merged show unmerged tags' ' test_cmp expect actual ' +test_expect_success 'ambiguous branch/tags not marked' ' + git tag ambiguous && + git branch ambiguous && + echo ambiguous >expect && + git tag -l ambiguous >actual && + test_cmp expect actual +' + test_done diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 6ea7ac4c41..e4fc5c826c 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -424,7 +424,7 @@ test_expect_success TTY 'command-specific pager works for external commands' ' echo "foo:initial" >expect && >actual && test_config pager.external "sed s/^/foo:/ >actual" && - test_terminal git --exec-path="`pwd`" external log --format=%s -1 && + test_terminal git --exec-path="$(pwd)" external log --format=%s -1 && test_cmp expect actual ' diff --git a/t/t7103-reset-bare.sh b/t/t7103-reset-bare.sh index 1eef93c2b2..afe36a533c 100755 --- a/t/t7103-reset-bare.sh +++ b/t/t7103-reset-bare.sh @@ -63,7 +63,7 @@ test_expect_success '"mixed" reset is not allowed in bare' ' test_expect_success '"soft" reset is allowed in bare' ' git reset --soft HEAD^ && - test "`git show --pretty=format:%s | head -n 1`" = "one" + test "$(git show --pretty=format:%s | head -n 1)" = "one" ' test_done diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index dda3929d99..68ea31d693 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -14,8 +14,8 @@ submodule and "git submodule update --rebase/--merge" does not detach the HEAD. compare_head() { - sha_master=`git rev-list --max-count=1 master` - sha_head=`git rev-list --max-count=1 HEAD` + sha_master=$(git rev-list --max-count=1 master) + sha_head=$(git rev-list --max-count=1 HEAD) test "$sha_master" = "$sha_head" } diff --git a/t/t7408-submodule-reference.sh b/t/t7408-submodule-reference.sh index b770b2f04d..eaea19b8f2 100755 --- a/t/t7408-submodule-reference.sh +++ b/t/t7408-submodule-reference.sh @@ -6,7 +6,7 @@ test_description='test clone --reference' . ./test-lib.sh -base_dir=`pwd` +base_dir=$(pwd) U=$base_dir/UPLOAD_LOG diff --git a/t/t7504-commit-msg-hook.sh b/t/t7504-commit-msg-hook.sh index 1f53ea8090..8728db61d3 100755 --- a/t/t7504-commit-msg-hook.sh +++ b/t/t7504-commit-msg-hook.sh @@ -179,7 +179,7 @@ EOF chmod +x "$HOOK" commit_msg_is () { - test "`git log --pretty=format:%s%b -1`" = "$1" + test "$(git log --pretty=format:%s%b -1)" = "$1" } test_expect_success 'hook edits commit message' ' diff --git a/t/t7505-prepare-commit-msg-hook.sh b/t/t7505-prepare-commit-msg-hook.sh index 03dce09cfe..b13f72975e 100755 --- a/t/t7505-prepare-commit-msg-hook.sh +++ b/t/t7505-prepare-commit-msg-hook.sh @@ -53,7 +53,7 @@ test_expect_success 'with hook (-m)' ' echo "more" >> file && git add file && git commit -m "more" && - test "`git log -1 --pretty=format:%s`" = "message (no editor)" + test "$(git log -1 --pretty=format:%s)" = "message (no editor)" ' @@ -62,7 +62,7 @@ test_expect_success 'with hook (-m editor)' ' echo "more" >> file && git add file && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -e -m "more more" && - test "`git log -1 --pretty=format:%s`" = message + test "$(git log -1 --pretty=format:%s)" = message ' @@ -71,7 +71,7 @@ test_expect_success 'with hook (-t)' ' echo "more" >> file && git add file && git commit -t "$(git rev-parse --git-dir)/template" && - test "`git log -1 --pretty=format:%s`" = template + test "$(git log -1 --pretty=format:%s)" = template ' @@ -80,7 +80,7 @@ test_expect_success 'with hook (-F)' ' echo "more" >> file && git add file && (echo more | git commit -F -) && - test "`git log -1 --pretty=format:%s`" = "message (no editor)" + test "$(git log -1 --pretty=format:%s)" = "message (no editor)" ' @@ -89,17 +89,17 @@ test_expect_success 'with hook (-F editor)' ' echo "more" >> file && git add file && (echo more more | GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -e -F -) && - test "`git log -1 --pretty=format:%s`" = message + test "$(git log -1 --pretty=format:%s)" = message ' test_expect_success 'with hook (-C)' ' - head=`git rev-parse HEAD` && + head=$(git rev-parse HEAD) && echo "more" >> file && git add file && git commit -C $head && - test "`git log -1 --pretty=format:%s`" = "$head (no editor)" + test "$(git log -1 --pretty=format:%s)" = "$head (no editor)" ' @@ -108,27 +108,27 @@ test_expect_success 'with hook (editor)' ' echo "more more" >> file && git add file && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit && - test "`git log -1 --pretty=format:%s`" = default + test "$(git log -1 --pretty=format:%s)" = default ' test_expect_success 'with hook (--amend)' ' - head=`git rev-parse HEAD` && + head=$(git rev-parse HEAD) && echo "more" >> file && git add file && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --amend && - test "`git log -1 --pretty=format:%s`" = "$head" + test "$(git log -1 --pretty=format:%s)" = "$head" ' test_expect_success 'with hook (-c)' ' - head=`git rev-parse HEAD` && + head=$(git rev-parse HEAD) && echo "more" >> file && git add file && GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head && - test "`git log -1 --pretty=format:%s`" = "$head" + test "$(git log -1 --pretty=format:%s)" = "$head" ' @@ -141,7 +141,7 @@ test_expect_success 'with hook (merge)' ' git commit -m other && git checkout - && git merge --no-ff other && - test "`git log -1 --pretty=format:%s`" = "merge (no editor)" + test "$(git log -1 --pretty=format:%s)" = "merge (no editor)" ' test_expect_success 'with hook and editor (merge)' ' @@ -153,7 +153,7 @@ test_expect_success 'with hook and editor (merge)' ' git commit -m other && git checkout - && env GIT_EDITOR="\"\$FAKE_EDITOR\"" git merge --no-ff -e other && - test "`git log -1 --pretty=format:%s`" = "merge" + test "$(git log -1 --pretty=format:%s)" = "merge" ' cat > "$HOOK" <<'EOF' @@ -164,7 +164,7 @@ EOF test_expect_success 'with failing hook' ' test_when_finished "git checkout -f master" && - head=`git rev-parse HEAD` && + head=$(git rev-parse HEAD) && echo "more" >> file && git add file && test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit -c $head @@ -174,7 +174,7 @@ test_expect_success 'with failing hook' ' test_expect_success 'with failing hook (--no-verify)' ' test_when_finished "git checkout -f master" && - head=`git rev-parse HEAD` && + head=$(git rev-parse HEAD) && echo "more" >> file && git add file && test_must_fail env GIT_EDITOR="\"\$FAKE_EDITOR\"" git commit --no-verify -c $head diff --git a/t/t7513-interpret-trailers.sh b/t/t7513-interpret-trailers.sh index 322c436a49..aee785cffa 100755 --- a/t/t7513-interpret-trailers.sh +++ b/t/t7513-interpret-trailers.sh @@ -326,6 +326,46 @@ test_expect_success 'with complex patch, args and --trim-empty' ' test_cmp expected actual ' +test_expect_success 'in-place editing with basic patch' ' + cat basic_message >message && + cat basic_patch >>message && + cat basic_message >expected && + echo >>expected && + cat basic_patch >>expected && + git interpret-trailers --in-place message && + test_cmp expected message +' + +test_expect_success 'in-place editing with additional trailer' ' + cat basic_message >message && + cat basic_patch >>message && + cat basic_message >expected && + echo >>expected && + cat >>expected <<-\EOF && + Reviewed-by: Alice + EOF + cat basic_patch >>expected && + git interpret-trailers --trailer "Reviewed-by: Alice" --in-place message && + test_cmp expected message +' + +test_expect_success 'in-place editing on stdin disallowed' ' + test_must_fail git interpret-trailers --trailer "Reviewed-by: Alice" --in-place < basic_message +' + +test_expect_success 'in-place editing on non-existing file' ' + test_must_fail git interpret-trailers --trailer "Reviewed-by: Alice" --in-place nonexisting && + test_path_is_missing nonexisting +' + +test_expect_success POSIXPERM,SANITY "in-place editing doesn't clobber original file on error" ' + cat basic_message >message && + chmod -r message && + test_must_fail git interpret-trailers --trailer "Reviewed-by: Alice" --in-place message && + chmod +r message && + test_cmp message basic_message +' + test_expect_success 'using "where = before"' ' git config trailer.bug.where "before" && cat complex_message_body >expected && diff --git a/t/t7602-merge-octopus-many.sh b/t/t7602-merge-octopus-many.sh index 955f09f8e8..6abe441ae3 100755 --- a/t/t7602-merge-octopus-many.sh +++ b/t/t7602-merge-octopus-many.sh @@ -19,7 +19,7 @@ test_expect_success 'setup' ' git add c$i.c && git commit -m c$i && git tag c$i && - i=`expr $i + 1` || return 1 + i=$(expr $i + 1) || return 1 done ' @@ -30,7 +30,7 @@ test_expect_success 'merge c1 with c2, c3, c4, ... c29' ' while test $i -le 30 do refs="$refs c$i" - i=`expr $i + 1` + i=$(expr $i + 1) done && git merge $refs && test "$(git rev-parse c1)" != "$(git rev-parse HEAD)" && @@ -38,14 +38,14 @@ test_expect_success 'merge c1 with c2, c3, c4, ... c29' ' while test $i -le 30 do test "$(git rev-parse c$i)" = "$(git rev-parse HEAD^$i)" && - i=`expr $i + 1` || return 1 + i=$(expr $i + 1) || return 1 done && git diff --exit-code && i=1 && while test $i -le 30 do test -f c$i.c && - i=`expr $i + 1` || return 1 + i=$(expr $i + 1) || return 1 done ' diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index 021c5479bd..6061a04147 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -69,7 +69,7 @@ test_expect_success 'writing bitmaps via config can duplicate .keep objects' ' test_expect_success 'loose objects in alternate ODB are not repacked' ' mkdir alt_objects && - echo `pwd`/alt_objects > .git/objects/info/alternates && + echo $(pwd)/alt_objects > .git/objects/info/alternates && echo content3 > file3 && objsha1=$(GIT_OBJECT_DIRECTORY=alt_objects git hash-object -w file3) && git add file3 && @@ -168,7 +168,7 @@ test_expect_success 'packed unreachable obs in alternate ODB are not loosened' ' ' test_expect_success 'local packed unreachable obs that exist in alternate ODB are not loosened' ' - echo `pwd`/alt_objects > .git/objects/info/alternates && + echo $(pwd)/alt_objects > .git/objects/info/alternates && echo "$csha1" | git pack-objects --non-empty --all --reflog pack && rm -f .git/objects/pack/* && mv pack-* .git/objects/pack/ && diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index 028ffe4a05..b540944408 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -791,12 +791,12 @@ test_expect_success 'outside of git repository' ' } >non/expect.full && echo file2:world >non/expect.sub && ( - GIT_CEILING_DIRECTORIES="$(pwd)/non/git" && + GIT_CEILING_DIRECTORIES="$(pwd)/non" && export GIT_CEILING_DIRECTORIES && cd non/git && test_must_fail git grep o && git grep --no-index o >../actual.full && - test_cmp ../expect.full ../actual.full + test_cmp ../expect.full ../actual.full && cd sub && test_must_fail git grep o && git grep --no-index o >../../actual.sub && @@ -805,7 +805,7 @@ test_expect_success 'outside of git repository' ' echo ".*o*" >non/git/.gitignore && ( - GIT_CEILING_DIRECTORIES="$(pwd)/non/git" && + GIT_CEILING_DIRECTORIES="$(pwd)/non" && export GIT_CEILING_DIRECTORIES && cd non/git && test_must_fail git grep o && @@ -813,7 +813,7 @@ test_expect_success 'outside of git repository' ' test_cmp ../expect.full ../actual.full && { - echo ".gitignore:.*o*" + echo ".gitignore:.*o*" && cat ../expect.full } >../expect.with.ignored && git grep --no-index --no-exclude o >../actual.full && @@ -821,6 +821,47 @@ test_expect_success 'outside of git repository' ' ) ' +test_expect_success 'outside of git repository with fallbackToNoIndex' ' + rm -fr non && + mkdir -p non/git/sub && + echo hello >non/git/file1 && + echo world >non/git/sub/file2 && + cat <<-\EOF >non/expect.full && + file1:hello + sub/file2:world + EOF + echo file2:world >non/expect.sub && + ( + GIT_CEILING_DIRECTORIES="$(pwd)/non" && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_must_fail git -c grep.fallbackToNoIndex=false grep o && + git -c grep.fallbackToNoIndex=true grep o >../actual.full && + test_cmp ../expect.full ../actual.full && + cd sub && + test_must_fail git -c grep.fallbackToNoIndex=false grep o && + git -c grep.fallbackToNoIndex=true grep o >../../actual.sub && + test_cmp ../../expect.sub ../../actual.sub + ) && + + echo ".*o*" >non/git/.gitignore && + ( + GIT_CEILING_DIRECTORIES="$(pwd)/non" && + export GIT_CEILING_DIRECTORIES && + cd non/git && + test_must_fail git -c grep.fallbackToNoIndex=false grep o && + git -c grep.fallbackToNoIndex=true grep --exclude-standard o >../actual.full && + test_cmp ../expect.full ../actual.full && + + { + echo ".gitignore:.*o*" && + cat ../expect.full + } >../expect.with.ignored && + git -c grep.fallbackToNoIndex grep --no-exclude o >../actual.full && + test_cmp ../expect.with.ignored ../actual.full + ) +' + test_expect_success 'inside git repository but with --no-index' ' rm -fr is && mkdir -p is/git/sub && diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh index 16f1442c1e..6568429753 100755 --- a/t/t8003-blame-corner-cases.sh +++ b/t/t8003-blame-corner-cases.sh @@ -153,7 +153,7 @@ test_expect_success 'blame path that used to be a directory' ' ' test_expect_success 'blame to a commit with no author name' ' - TREE=`git rev-parse HEAD:` && + TREE=$(git rev-parse HEAD:) && cat >badcommit <<EOF && tree $TREE author <noname> 1234567890 +0000 @@ -161,7 +161,7 @@ committer David Reiss <dreiss@facebook.com> 1234567890 +0000 some message EOF - COMMIT=`git hash-object -t commit -w badcommit` && + COMMIT=$(git hash-object -t commit -w badcommit) && git --no-pager blame $COMMIT -- uno >/dev/null ' diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 3c49536e0e..b3355d2c70 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -36,7 +36,7 @@ clean_fake_sendmail () { } test_expect_success $PREREQ 'Extract patches' ' - patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1` + patches=$(git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1) ' # Test no confirm early to ensure remaining tests will not hang @@ -1151,7 +1151,7 @@ test_expect_success $PREREQ '--no-bcc overrides sendemail.bcc' ' ' test_expect_success $PREREQ 'patches To headers are used by default' ' - patch=`git format-patch -1 --to="bodies@example.com"` && + patch=$(git format-patch -1 --to="bodies@example.com") && test_when_finished "rm $patch" && git send-email \ --dry-run \ @@ -1162,7 +1162,7 @@ test_expect_success $PREREQ 'patches To headers are used by default' ' ' test_expect_success $PREREQ 'patches To headers are appended to' ' - patch=`git format-patch -1 --to="bodies@example.com"` && + patch=$(git format-patch -1 --to="bodies@example.com") && test_when_finished "rm $patch" && git send-email \ --dry-run \ @@ -1175,8 +1175,8 @@ test_expect_success $PREREQ 'patches To headers are appended to' ' ' test_expect_success $PREREQ 'To headers from files reset each patch' ' - patch1=`git format-patch -1 --to="bodies@example.com"` && - patch2=`git format-patch -1 --to="other@example.com" HEAD~` && + patch1=$(git format-patch -1 --to="bodies@example.com") && + patch2=$(git format-patch -1 --to="other@example.com" HEAD~) && test_when_finished "rm $patch1 && rm $patch2" && git send-email \ --dry-run \ @@ -1488,7 +1488,7 @@ test_cover_addresses () { clean_fake_sendmail && rm -fr outdir && git format-patch --cover-letter -2 -o outdir && - cover=`echo outdir/0000-*.patch` && + cover=$(echo outdir/0000-*.patch) && mv $cover cover-to-edit.patch && perl -pe "s/^From:/$header: extra\@address.com\nFrom:/" cover-to-edit.patch >"$cover" && git send-email \ @@ -1527,6 +1527,21 @@ test_expect_success $PREREQ 'cccover adds Cc to all mail' ' test_cover_addresses "Cc" ' +test_expect_success $PREREQ 'escaped quotes in sendemail.aliasfiletype=mutt' ' + clean_fake_sendmail && + echo "alias sbd \\\"Dot U. Sir\\\" <somebody@example.org>" >.mutt && + git config --replace-all sendemail.aliasesfile "$(pwd)/.mutt" && + git config sendemail.aliasfiletype mutt && + git send-email \ + --from="Example <nobody@example.com>" \ + --to=sbd \ + --smtp-server="$(pwd)/fake.sendmail" \ + outdir/0001-*.patch \ + 2>errors >out && + grep "^!somebody@example\.org!$" commandline1 && + grep -F "To: \"Dot U. Sir\" <somebody@example.org>" out +' + test_expect_success $PREREQ 'sendemail.aliasfiletype=mailrc' ' clean_fake_sendmail && echo "alias sbd somebody@example.org" >.mailrc && diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh index 4fea8d901b..258d9b8cef 100755 --- a/t/t9100-git-svn-basic.sh +++ b/t/t9100-git-svn-basic.sh @@ -265,18 +265,18 @@ test_expect_success 'able to dcommit to a subdirectory' " git update-index --add d && git commit -m '/bar/d should be in the log' && git svn dcommit -i bar && - test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" && + test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" && mkdir newdir && echo new > newdir/dir && git update-index --add newdir/dir && git commit -m 'add a new directory' && git svn dcommit -i bar && - test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" && + test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" && echo foo >> newdir/dir && git update-index newdir/dir && git commit -m 'modify a file in new directory' && git svn dcommit -i bar && - test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" + test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" " test_expect_success 'dcommit should not fail with a touched file' ' @@ -295,7 +295,7 @@ test_expect_success 'able to set-tree to a subdirectory' " git update-index d && git commit -m 'update /bar/d' && git svn set-tree -i bar HEAD && - test -z \"\`git diff refs/heads/my-bar refs/remotes/bar\`\" + test -z \"\$(git diff refs/heads/my-bar refs/remotes/bar)\" " test_expect_success 'git-svn works in a bare repository' ' diff --git a/t/t9101-git-svn-props.sh b/t/t9101-git-svn-props.sh index 8869f5018e..e8173d5fef 100755 --- a/t/t9101-git-svn-props.sh +++ b/t/t9101-git-svn-props.sh @@ -26,27 +26,27 @@ cd import EOF printf "Hello\r\nWorld\r\n" > crlf - a_crlf=`git hash-object -w crlf` + a_crlf=$(git hash-object -w crlf) printf "Hello\rWorld\r" > cr - a_cr=`git hash-object -w cr` + a_cr=$(git hash-object -w cr) printf "Hello\nWorld\n" > lf - a_lf=`git hash-object -w lf` + a_lf=$(git hash-object -w lf) printf "Hello\r\nWorld" > ne_crlf - a_ne_crlf=`git hash-object -w ne_crlf` + a_ne_crlf=$(git hash-object -w ne_crlf) printf "Hello\nWorld" > ne_lf - a_ne_lf=`git hash-object -w ne_lf` + a_ne_lf=$(git hash-object -w ne_lf) printf "Hello\rWorld" > ne_cr - a_ne_cr=`git hash-object -w ne_cr` + a_ne_cr=$(git hash-object -w ne_cr) touch empty - a_empty=`git hash-object -w empty` + a_empty=$(git hash-object -w empty) printf "\n" > empty_lf - a_empty_lf=`git hash-object -w empty_lf` + a_empty_lf=$(git hash-object -w empty_lf) printf "\r" > empty_cr - a_empty_cr=`git hash-object -w empty_cr` + a_empty_cr=$(git hash-object -w empty_cr) printf "\r\n" > empty_crlf - a_empty_crlf=`git hash-object -w empty_crlf` + a_empty_crlf=$(git hash-object -w empty_crlf) svn_cmd import --no-auto-props -m 'import for git svn' . "$svnrepo" >/dev/null cd .. @@ -80,7 +80,7 @@ test_expect_success "$name" \ git pull . ${remotes_git_svn}' expect='/* $Id$ */' -got="`sed -ne 2p kw.c`" +got="$(sed -ne 2p kw.c)" test_expect_success 'raw $Id$ found in kw.c' "test '$expect' = '$got'" test_expect_success "propset CR on crlf files" ' @@ -107,8 +107,8 @@ done cd test_wc printf '$Id$\rHello\rWorld\r' > cr printf '$Id$\rHello\rWorld' > ne_cr - a_cr=`printf '$Id$\r\nHello\r\nWorld\r\n' | git hash-object --stdin` - a_ne_cr=`printf '$Id$\r\nHello\r\nWorld' | git hash-object --stdin` + a_cr=$(printf '$Id$\r\nHello\r\nWorld\r\n' | git hash-object --stdin) + a_ne_cr=$(printf '$Id$\r\nHello\r\nWorld' | git hash-object --stdin) test_expect_success 'Set CRLF on cr files' \ 'svn_cmd propset svn:eol-style CRLF cr && svn_cmd propset svn:eol-style CRLF ne_cr && @@ -119,8 +119,8 @@ cd .. test_expect_success 'fetch and pull latest from svn' \ 'git svn fetch && git pull . ${remotes_git_svn}' -b_cr="`git hash-object cr`" -b_ne_cr="`git hash-object ne_cr`" +b_cr="$(git hash-object cr)" +b_ne_cr="$(git hash-object ne_cr)" test_expect_success 'CRLF + $Id$' "test '$a_cr' = '$b_cr'" test_expect_success 'CRLF + $Id$ (no newline)' "test '$a_ne_cr' = '$b_ne_cr'" diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh index 83f17e13e8..cd480edf16 100755 --- a/t/t9104-git-svn-follow-parent.sh +++ b/t/t9104-git-svn-follow-parent.sh @@ -31,12 +31,12 @@ test_expect_success 'initialize repo' ' test_expect_success 'init and fetch a moved directory' ' git svn init --minimize-url -i thunk "$svnrepo"/thunk && git svn fetch -i thunk && - test "`git rev-parse --verify refs/remotes/thunk@2`" \ - = "`git rev-parse --verify refs/remotes/thunk~1`" && - test "`git cat-file blob refs/remotes/thunk:readme |\ - sed -n -e "3p"`" = goodbye && - test -z "`git config --get svn-remote.svn.fetch \ - "^trunk:refs/remotes/thunk@2$"`" + test "$(git rev-parse --verify refs/remotes/thunk@2)" \ + = "$(git rev-parse --verify refs/remotes/thunk~1)" && + test "$(git cat-file blob refs/remotes/thunk:readme |\ + sed -n -e "3p")" = goodbye && + test -z "$(git config --get svn-remote.svn.fetch \ + "^trunk:refs/remotes/thunk@2$")" ' test_expect_success 'init and fetch from one svn-remote' ' @@ -46,10 +46,10 @@ test_expect_success 'init and fetch from one svn-remote' ' git config --add svn-remote.svn.fetch \ thunk:refs/remotes/svn/thunk && git svn fetch -i svn/thunk && - test "`git rev-parse --verify refs/remotes/svn/trunk`" \ - = "`git rev-parse --verify refs/remotes/svn/thunk~1`" && - test "`git cat-file blob refs/remotes/svn/thunk:readme |\ - sed -n -e "3p"`" = goodbye + test "$(git rev-parse --verify refs/remotes/svn/trunk)" \ + = "$(git rev-parse --verify refs/remotes/svn/thunk~1)" && + test "$(git cat-file blob refs/remotes/svn/thunk:readme |\ + sed -n -e "3p")" = goodbye ' test_expect_success 'follow deleted parent' ' @@ -61,9 +61,9 @@ test_expect_success 'follow deleted parent' ' junk:refs/remotes/svn/junk && git svn fetch -i svn/thunk && git svn fetch -i svn/junk && - test -z "`git diff svn/junk svn/trunk`" && - test "`git merge-base svn/junk svn/trunk`" \ - = "`git rev-parse svn/trunk`" + test -z "$(git diff svn/junk svn/trunk)" && + test "$(git merge-base svn/junk svn/trunk)" \ + = "$(git rev-parse svn/trunk)" ' test_expect_success 'follow larger parent' ' @@ -80,10 +80,10 @@ test_expect_success 'follow larger parent' ' git rev-parse --verify refs/remotes/larger && git rev-parse --verify \ refs/remotes/larger-parent && - test "`git merge-base \ + test "$(git merge-base \ refs/remotes/larger-parent \ - refs/remotes/larger`" = \ - "`git rev-parse refs/remotes/larger`" + refs/remotes/larger)" = \ + "$(git rev-parse refs/remotes/larger)" ' test_expect_success 'follow higher-level parent' ' @@ -106,8 +106,8 @@ test_expect_success 'follow deleted directory' ' svn_cmd rm -m "remove glob" "$svnrepo"/glob && git svn init --minimize-url -i glob "$svnrepo"/glob && git svn fetch -i glob && - test "`git cat-file blob refs/remotes/glob:blob/bye`" = hi && - test "`git ls-tree refs/remotes/glob | wc -l `" -eq 1 + test "$(git cat-file blob refs/remotes/glob:blob/bye)" = hi && + test "$(git ls-tree refs/remotes/glob | wc -l )" -eq 1 ' # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn) @@ -142,9 +142,9 @@ test_expect_success 'follow-parent avoids deleting relevant info' ' git svn init --minimize-url -i r9270-t \ "$svnrepo"/r9270/trunk/subversion/bindings/swig/perl/native/t && git svn fetch -i r9270-t && - test `git rev-list r9270-t | wc -l` -eq 2 && - test "`git ls-tree --name-only r9270-t~1`" = \ - "`git ls-tree --name-only r9270-t`" + test $(git rev-list r9270-t | wc -l) -eq 2 && + test "$(git ls-tree --name-only r9270-t~1)" = \ + "$(git ls-tree --name-only r9270-t)" ' test_expect_success "track initial change if it was only made to parent" ' @@ -152,11 +152,11 @@ test_expect_success "track initial change if it was only made to parent" ' git svn init --minimize-url -i r9270-d \ "$svnrepo"/r9270/drunk/subversion/bindings/swig/perl/native/t && git svn fetch -i r9270-d && - test `git rev-list r9270-d | wc -l` -eq 3 && - test "`git ls-tree --name-only r9270-t`" = \ - "`git ls-tree --name-only r9270-d`" && - test "`git rev-parse r9270-t`" = \ - "`git rev-parse r9270-d~1`" + test $(git rev-list r9270-d | wc -l) -eq 3 && + test "$(git ls-tree --name-only r9270-t)" = \ + "$(git ls-tree --name-only r9270-d)" && + test "$(git rev-parse r9270-t)" = \ + "$(git rev-parse r9270-d~1)" ' test_expect_success "follow-parent is atomic" ' @@ -193,19 +193,19 @@ test_expect_success "follow-parent is atomic" ' git svn fetch -i stunk && git svn init --minimize-url -i flunked "$svnrepo"/flunked && git svn fetch -i flunked && - test "`git rev-parse --verify refs/remotes/flunk@18`" \ - = "`git rev-parse --verify refs/remotes/stunk`" && - test "`git rev-parse --verify refs/remotes/flunk~1`" \ - = "`git rev-parse --verify refs/remotes/stunk`" && - test "`git rev-parse --verify refs/remotes/flunked~1`" \ - = "`git rev-parse --verify refs/remotes/stunk~1`" + test "$(git rev-parse --verify refs/remotes/flunk@18)" \ + = "$(git rev-parse --verify refs/remotes/stunk)" && + test "$(git rev-parse --verify refs/remotes/flunk~1)" \ + = "$(git rev-parse --verify refs/remotes/stunk)" && + test "$(git rev-parse --verify refs/remotes/flunked~1)" \ + = "$(git rev-parse --verify refs/remotes/stunk~1)" ' test_expect_success "track multi-parent paths" ' svn_cmd cp -m "resurrect /glob" "$svnrepo"/r9270 "$svnrepo"/glob && git svn multi-fetch && - test `git cat-file commit refs/remotes/glob | \ - grep "^parent " | wc -l` -eq 2 + test $(git cat-file commit refs/remotes/glob | \ + grep "^parent " | wc -l) -eq 2 ' test_expect_success "multi-fetch continues to work" " diff --git a/t/t9105-git-svn-commit-diff.sh b/t/t9105-git-svn-commit-diff.sh index 5d0afeae6c..6ed5f74e25 100755 --- a/t/t9105-git-svn-commit-diff.sh +++ b/t/t9105-git-svn-commit-diff.sh @@ -18,8 +18,8 @@ test_expect_success 'initialize repo' ' git commit -a -m "another" ' -head=`git rev-parse --verify HEAD^0` -prev=`git rev-parse --verify HEAD^1` +head=$(git rev-parse --verify HEAD^0) +prev=$(git rev-parse --verify HEAD^1) # the internals of the commit-diff command are the same as the regular # commit, so only a basic test of functionality is needed since we've diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh index 6e69fc4c65..9060198037 100755 --- a/t/t9107-git-svn-migrate.sh +++ b/t/t9107-git-svn-migrate.sh @@ -24,10 +24,10 @@ test_expect_success 'setup old-looking metadata' ' git update-ref -d refs/${remotes_git_svn} refs/${remotes_git_svn} ' -head=`git rev-parse --verify refs/heads/git-svn-HEAD^0` +head=$(git rev-parse --verify refs/heads/git-svn-HEAD^0) test_expect_success 'git-svn-HEAD is a real HEAD' "test -n '$head'" -svnrepo_escaped=`echo $svnrepo | sed 's/ /%20/'` +svnrepo_escaped=$(echo $svnrepo | sed 's/ /%20/') test_expect_success 'initialize old-style (v0) git svn layout' ' mkdir -p "$GIT_DIR"/git-svn/info "$GIT_DIR"/svn/info && @@ -38,7 +38,7 @@ test_expect_success 'initialize old-style (v0) git svn layout' ' git rev-parse --verify refs/${remotes_git_svn}^0 && git rev-parse --verify refs/remotes/svn^0 && test "$(git config --get svn-remote.svn.url)" = "$svnrepo_escaped" && - test `git config --get svn-remote.svn.fetch` = \ + test $(git config --get svn-remote.svn.fetch) = \ ":refs/${remotes_git_svn}" ' @@ -46,10 +46,10 @@ test_expect_success 'initialize a multi-repository repo' ' git svn init "$svnrepo" -T trunk -t tags -b branches && git config --get-all svn-remote.svn.fetch > fetch.out && grep "^trunk:refs/remotes/origin/trunk$" fetch.out && - test -n "`git config --get svn-remote.svn.branches \ - "^branches/\*:refs/remotes/origin/\*$"`" && - test -n "`git config --get svn-remote.svn.tags \ - "^tags/\*:refs/remotes/origin/tags/\*$"`" && + test -n "$(git config --get svn-remote.svn.branches \ + "^branches/\*:refs/remotes/origin/\*$")" && + test -n "$(git config --get svn-remote.svn.tags \ + "^tags/\*:refs/remotes/origin/tags/\*$")" && git config --unset svn-remote.svn.branches \ "^branches/\*:refs/remotes/origin/\*$" && git config --unset svn-remote.svn.tags \ @@ -75,28 +75,28 @@ test_expect_success 'multi-fetch works on partial urls + paths' " for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do git rev-parse --verify refs/remotes/origin/\$i^0 >> refs.out || exit 1; done && - test -z \"\`sort < refs.out | uniq -d\`\" && + test -z \"\$(sort < refs.out | uniq -d)\" && for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do for j in trunk a b tags/0.1 tags/0.2 tags/0.3; do if test \$j != \$i; then continue; fi - test -z \"\`git diff refs/remotes/origin/\$i \ - refs/remotes/origin/\$j\`\" ||exit 1; done; done + test -z \"\$(git diff refs/remotes/origin/\$i \ + refs/remotes/origin/\$j)\" ||exit 1; done; done " test_expect_success 'migrate --minimize on old inited layout' ' git config --unset-all svn-remote.svn.fetch && git config --unset-all svn-remote.svn.url && rm -rf "$GIT_DIR"/svn && - for i in `cat fetch.out`; do - path=`expr $i : "\([^:]*\):.*$"` - ref=`expr $i : "[^:]*:\(refs/remotes/.*\)$"` + for i in $(cat fetch.out); do + path=$(expr $i : "\([^:]*\):.*$") + ref=$(expr $i : "[^:]*:\(refs/remotes/.*\)$") if test -z "$ref"; then continue; fi if test -n "$path"; then path="/$path"; fi ( mkdir -p "$GIT_DIR"/svn/$ref/info/ && echo "$svnrepo"$path > "$GIT_DIR"/svn/$ref/info/url ) || exit 1; done && git svn migrate --minimize && - test -z "`git config -l | grep "^svn-remote\.git-svn\."`" && + test -z "$(git config -l | grep "^svn-remote\.git-svn\.")" && git config --get-all svn-remote.svn.fetch > fetch.out && grep "^trunk:refs/remotes/origin/trunk$" fetch.out && grep "^branches/a:refs/remotes/origin/a$" fetch.out && diff --git a/t/t9108-git-svn-glob.sh b/t/t9108-git-svn-glob.sh index d732d31302..a526d60379 100755 --- a/t/t9108-git-svn-glob.sh +++ b/t/t9108-git-svn-glob.sh @@ -50,10 +50,10 @@ test_expect_success 'test refspec globbing' ' git log --pretty=oneline refs/remotes/tags/end | \ sed -e "s/^.\{41\}//" > output.end && test_cmp expect.end output.end && - test "`git rev-parse refs/remotes/tags/end~1`" = \ - "`git rev-parse refs/remotes/branches/start`" && - test "`git rev-parse refs/remotes/branches/start~2`" = \ - "`git rev-parse refs/remotes/trunk`" && + test "$(git rev-parse refs/remotes/tags/end~1)" = \ + "$(git rev-parse refs/remotes/branches/start)" && + test "$(git rev-parse refs/remotes/branches/start~2)" = \ + "$(git rev-parse refs/remotes/trunk)" && test_must_fail git rev-parse refs/remotes/tags/end@3 ' @@ -75,12 +75,12 @@ test_expect_success 'test left-hand-side only globbing' ' svn_cmd commit -m "try to try" ) && git svn fetch two && - test `git rev-list refs/remotes/two/tags/end | wc -l` -eq 6 && - test `git rev-list refs/remotes/two/branches/start | wc -l` -eq 3 && - test `git rev-parse refs/remotes/two/branches/start~2` = \ - `git rev-parse refs/remotes/two/trunk` && - test `git rev-parse refs/remotes/two/tags/end~3` = \ - `git rev-parse refs/remotes/two/branches/start` && + test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 && + test $(git rev-list refs/remotes/two/branches/start | wc -l) -eq 3 && + test $(git rev-parse refs/remotes/two/branches/start~2) = \ + $(git rev-parse refs/remotes/two/trunk) && + test $(git rev-parse refs/remotes/two/tags/end~3) = \ + $(git rev-parse refs/remotes/two/branches/start) && git log --pretty=oneline refs/remotes/two/tags/end | \ sed -e "s/^.\{41\}//" > output.two && test_cmp expect.two output.two diff --git a/t/t9109-git-svn-multi-glob.sh b/t/t9109-git-svn-multi-glob.sh index c318f9f946..f36b749242 100755 --- a/t/t9109-git-svn-multi-glob.sh +++ b/t/t9109-git-svn-multi-glob.sh @@ -50,10 +50,10 @@ test_expect_success 'test refspec globbing' ' git log --pretty=oneline refs/remotes/tags/end | \ sed -e "s/^.\{41\}//" > output.end && test_cmp expect.end output.end && - test "`git rev-parse refs/remotes/tags/end~1`" = \ - "`git rev-parse refs/remotes/branches/v1/start`" && - test "`git rev-parse refs/remotes/branches/v1/start~2`" = \ - "`git rev-parse refs/remotes/trunk`" && + test "$(git rev-parse refs/remotes/tags/end~1)" = \ + "$(git rev-parse refs/remotes/branches/v1/start)" && + test "$(git rev-parse refs/remotes/branches/v1/start~2)" = \ + "$(git rev-parse refs/remotes/trunk)" && test_must_fail git rev-parse refs/remotes/tags/end@3 ' @@ -75,12 +75,12 @@ test_expect_success 'test left-hand-side only globbing' ' svn_cmd commit -m "try to try" ) && git svn fetch two && - test `git rev-list refs/remotes/two/tags/end | wc -l` -eq 6 && - test `git rev-list refs/remotes/two/branches/v1/start | wc -l` -eq 3 && - test `git rev-parse refs/remotes/two/branches/v1/start~2` = \ - `git rev-parse refs/remotes/two/trunk` && - test `git rev-parse refs/remotes/two/tags/end~3` = \ - `git rev-parse refs/remotes/two/branches/v1/start` && + test $(git rev-list refs/remotes/two/tags/end | wc -l) -eq 6 && + test $(git rev-list refs/remotes/two/branches/v1/start | wc -l) -eq 3 && + test $(git rev-parse refs/remotes/two/branches/v1/start~2) = \ + $(git rev-parse refs/remotes/two/trunk) && + test $(git rev-parse refs/remotes/two/tags/end~3) = \ + $(git rev-parse refs/remotes/two/branches/v1/start) && git log --pretty=oneline refs/remotes/two/tags/end | \ sed -e "s/^.\{41\}//" > output.two && test_cmp expect.two output.two @@ -124,12 +124,12 @@ test_expect_success 'test another branch' ' git config --add svn-remote.four.tags \ "tags/*:refs/remotes/four/tags/*" && git svn fetch four && - test `git rev-list refs/remotes/four/tags/next | wc -l` -eq 5 && - test `git rev-list refs/remotes/four/branches/v2/start | wc -l` -eq 3 && - test `git rev-parse refs/remotes/four/branches/v2/start~2` = \ - `git rev-parse refs/remotes/four/trunk` && - test `git rev-parse refs/remotes/four/tags/next~2` = \ - `git rev-parse refs/remotes/four/branches/v2/start` && + test $(git rev-list refs/remotes/four/tags/next | wc -l) -eq 5 && + test $(git rev-list refs/remotes/four/branches/v2/start | wc -l) -eq 3 && + test $(git rev-parse refs/remotes/four/branches/v2/start~2) = \ + $(git rev-parse refs/remotes/four/trunk) && + test $(git rev-parse refs/remotes/four/tags/next~2) = \ + $(git rev-parse refs/remotes/four/branches/v2/start) && git log --pretty=oneline refs/remotes/four/tags/next | \ sed -e "s/^.\{41\}//" > output.four && test_cmp expect.four output.four diff --git a/t/t9110-git-svn-use-svm-props.sh b/t/t9110-git-svn-use-svm-props.sh index a06e4c5b8e..29fbdfdd3f 100755 --- a/t/t9110-git-svn-use-svm-props.sh +++ b/t/t9110-git-svn-use-svm-props.sh @@ -51,7 +51,7 @@ test_expect_success 'verify metadata for /dir' " test_expect_success 'find commit based on SVN revision number' " git svn find-rev r12 | - grep `git rev-parse HEAD` + grep $(git rev-parse HEAD) " test_expect_success 'empty rebase' " diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh index fb41876677..a3d388228a 100755 --- a/t/t9114-git-svn-dcommit-merge.sh +++ b/t/t9114-git-svn-dcommit-merge.sh @@ -68,8 +68,8 @@ test_expect_success 'setup git mirror and merge' ' test_debug 'gitk --all & sleep 1' test_expect_success 'verify pre-merge ancestry' " - test x\`git rev-parse --verify refs/heads/svn^2\` = \ - x\`git rev-parse --verify refs/heads/merge\` && + test x\$(git rev-parse --verify refs/heads/svn^2) = \ + x\$(git rev-parse --verify refs/heads/merge) && git cat-file commit refs/heads/svn^ | grep '^friend$' " @@ -80,10 +80,10 @@ test_expect_success 'git svn dcommit merges' " test_debug 'gitk --all & sleep 1' test_expect_success 'verify post-merge ancestry' " - test x\`git rev-parse --verify refs/heads/svn\` = \ - x\`git rev-parse --verify refs/remotes/origin/trunk \` && - test x\`git rev-parse --verify refs/heads/svn^2\` = \ - x\`git rev-parse --verify refs/heads/merge\` && + test x\$(git rev-parse --verify refs/heads/svn) = \ + x\$(git rev-parse --verify refs/remotes/origin/trunk) && + test x\$(git rev-parse --verify refs/heads/svn^2) = \ + x\$(git rev-parse --verify refs/heads/merge) && git cat-file commit refs/heads/svn^ | grep '^friend$' " diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh index ed4d1369cc..a2219154b8 100755 --- a/t/t9118-git-svn-funky-branch-names.sh +++ b/t/t9118-git-svn-funky-branch-names.sh @@ -35,7 +35,7 @@ test_expect_success 'setup svnrepo' ' # SVN 1.7 will truncate "not-a%40{0]" to just "not-a". # Look at what SVN wound up naming the branch and use that. # Be sure to escape the @ if it shows up. -non_reflog=`svn_cmd ls "$svnrepo/pr ject/branches" | grep not-a | sed 's/\///' | sed 's/@/%40/'` +non_reflog=$(svn_cmd ls "$svnrepo/pr ject/branches" | grep not-a | sed 's/\///' | sed 's/@/%40/') test_expect_success 'test clone with funky branch names' ' git svn clone -s "$svnrepo/pr ject" project && diff --git a/t/t9119-git-svn-info.sh b/t/t9119-git-svn-info.sh index f16f3234a1..88241baee3 100755 --- a/t/t9119-git-svn-info.sh +++ b/t/t9119-git-svn-info.sh @@ -8,7 +8,7 @@ test_description='git svn info' # Tested with: svn, version 1.4.4 (r25188) # Tested with: svn, version 1.6.[12345689] -v=`svn_cmd --version | sed -n -e 's/^svn, version \(1\.[0-9]*\.[0-9]*\).*$/\1/p'` +v=$(svn_cmd --version | sed -n -e 's/^svn, version \(1\.[0-9]*\.[0-9]*\).*$/\1/p') case $v in 1.[456].*) ;; diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh index 8cfdfe790f..39b6bcb398 100755 --- a/t/t9129-git-svn-i18n-commitencoding.sh +++ b/t/t9129-git-svn-i18n-commitencoding.sh @@ -7,7 +7,7 @@ test_description='git svn honors i18n.commitEncoding in config' . ./lib-git-svn.sh compare_git_head_with () { - nr=`wc -l < "$1"` + nr=$(wc -l < "$1") a=7 b=$(($a + $nr - 1)) git cat-file commit HEAD | sed -ne "$a,${b}p" >current && @@ -29,7 +29,7 @@ fi compare_svn_head_with () { # extract just the log message and strip out committer info. # don't use --limit here since svn 1.1.x doesn't have it, - LC_ALL="$a_utf8_locale" svn log `git svn info --url` | perl -w -e ' + LC_ALL="$a_utf8_locale" svn log $(git svn info --url) | perl -w -e ' use bytes; $/ = ("-"x72) . "\n"; my @x = <STDIN>; diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh index c44de267a1..d306b77c31 100755 --- a/t/t9130-git-svn-authors-file.sh +++ b/t/t9130-git-svn-authors-file.sh @@ -26,7 +26,7 @@ test_expect_success 'start import with incomplete authors file' ' test_expect_success 'imported 2 revisions successfully' ' ( cd x - test "`git rev-list refs/remotes/git-svn | wc -l`" -eq 2 && + test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 2 && git rev-list -1 --pretty=raw refs/remotes/git-svn | \ grep "^author BBBBBBB BBBBBBB <bb@example\.com> " && git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \ @@ -43,7 +43,7 @@ test_expect_success 'continues to import once authors have been added' ' ( cd x git svn fetch --authors-file=../svn-authors && - test "`git rev-list refs/remotes/git-svn | wc -l`" -eq 4 && + test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 4 && git rev-list -1 --pretty=raw refs/remotes/git-svn | \ grep "^author DDDDDDD DDDDDDD <dd@example\.com> " && git rev-list -1 --pretty=raw refs/remotes/git-svn~1 | \ @@ -73,8 +73,8 @@ tmp_config_get () { test_expect_success 'failure happened without negative side effects' ' ( cd aa-work && - test 6 -eq "`tmp_config_get svn-remote.svn.branches-maxRev`" && - test 6 -eq "`tmp_config_get svn-remote.svn.tags-maxRev`" + test 6 -eq "$(tmp_config_get svn-remote.svn.branches-maxRev)" && + test 6 -eq "$(tmp_config_get svn-remote.svn.tags-maxRev)" ) ' @@ -86,8 +86,8 @@ test_expect_success 'fetch continues after authors-file is fixed' ' ( cd aa-work && git svn fetch --authors-file=../svn-authors && - test 8 -eq "`tmp_config_get svn-remote.svn.branches-maxRev`" && - test 8 -eq "`tmp_config_get svn-remote.svn.tags-maxRev`" + test 8 -eq "$(tmp_config_get svn-remote.svn.branches-maxRev)" && + test 8 -eq "$(tmp_config_get svn-remote.svn.tags-maxRev)" ) ' diff --git a/t/t9132-git-svn-broken-symlink.sh b/t/t9132-git-svn-broken-symlink.sh index 6c4c90b036..aeceffaf7b 100755 --- a/t/t9132-git-svn-broken-symlink.sh +++ b/t/t9132-git-svn-broken-symlink.sh @@ -87,7 +87,7 @@ test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" x' test_expect_success SYMLINKS '"bar" is a symlink that points to "asdf"' ' test -L x/bar && - (cd x && test xasdf = x"`git cat-file blob HEAD:bar`") + (cd x && test xasdf = x"$(git cat-file blob HEAD:bar)") ' test_expect_success 'get "bar" => symlink fix from svn' ' @@ -96,7 +96,7 @@ test_expect_success 'get "bar" => symlink fix from svn' ' test_expect_success SYMLINKS '"bar" remains a proper symlink' ' test -L x/bar && - (cd x && test xdoink = x"`git cat-file blob HEAD:bar`") + (cd x && test xdoink = x"$(git cat-file blob HEAD:bar)") ' test_done diff --git a/t/t9137-git-svn-dcommit-clobber-series.sh b/t/t9137-git-svn-dcommit-clobber-series.sh index d60da63f7a..5fa07a369f 100755 --- a/t/t9137-git-svn-dcommit-clobber-series.sh +++ b/t/t9137-git-svn-dcommit-clobber-series.sh @@ -16,15 +16,15 @@ test_expect_success 'initialize repo' ' ' test_expect_success '(supposedly) non-conflicting change from SVN' ' - test x"`sed -n -e 58p < file`" = x58 && - test x"`sed -n -e 61p < file`" = x61 && + test x"$(sed -n -e 58p < file)" = x58 && + test x"$(sed -n -e 61p < file)" = x61 && svn_cmd co "$svnrepo" tmp && (cd tmp && perl -i.bak -p -e "s/^58$/5588/" file && perl -i.bak -p -e "s/^61$/6611/" file && poke file && - test x"`sed -n -e 58p < file`" = x5588 && - test x"`sed -n -e 61p < file`" = x6611 && + test x"$(sed -n -e 58p < file)" = x5588 && + test x"$(sed -n -e 61p < file)" = x6611 && svn_cmd commit -m "58 => 5588, 61 => 6611" ) ' @@ -38,20 +38,20 @@ test_expect_success 'some unrelated changes to git' " " test_expect_success 'change file but in unrelated area' " - test x\"\`sed -n -e 4p < file\`\" = x4 && - test x\"\`sed -n -e 7p < file\`\" = x7 && + test x\"\$(sed -n -e 4p < file)\" = x4 && + test x\"\$(sed -n -e 7p < file)\" = x7 && perl -i.bak -p -e 's/^4\$/4444/' file && perl -i.bak -p -e 's/^7\$/7777/' file && - test x\"\`sed -n -e 4p < file\`\" = x4444 && - test x\"\`sed -n -e 7p < file\`\" = x7777 && + test x\"\$(sed -n -e 4p < file)\" = x4444 && + test x\"\$(sed -n -e 7p < file)\" = x7777 && git commit -m '4 => 4444, 7 => 7777' file && git svn dcommit && svn_cmd up tmp && cd tmp && - test x\"\`sed -n -e 4p < file\`\" = x4444 && - test x\"\`sed -n -e 7p < file\`\" = x7777 && - test x\"\`sed -n -e 58p < file\`\" = x5588 && - test x\"\`sed -n -e 61p < file\`\" = x6611 + test x\"\$(sed -n -e 4p < file)\" = x4444 && + test x\"\$(sed -n -e 7p < file)\" = x7777 && + test x\"\$(sed -n -e 58p < file)\" = x5588 && + test x\"\$(sed -n -e 61p < file)\" = x6611 " test_expect_success 'attempt to dcommit with a dirty index' ' diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh index 2937f4c265..7d7e9d46bc 100755 --- a/t/t9138-git-svn-authors-prog.sh +++ b/t/t9138-git-svn-authors-prog.sh @@ -37,7 +37,7 @@ test_expect_success 'import authors with prog and file' ' test_expect_success 'imported 6 revisions successfully' ' ( cd x - test "`git rev-list refs/remotes/git-svn | wc -l`" -eq 6 + test "$(git rev-list refs/remotes/git-svn | wc -l)" -eq 6 ) ' diff --git a/t/t9145-git-svn-master-branch.sh b/t/t9145-git-svn-master-branch.sh index 6559137493..3bbf341f6a 100755 --- a/t/t9145-git-svn-master-branch.sh +++ b/t/t9145-git-svn-master-branch.sh @@ -17,8 +17,8 @@ test_expect_success 'git svn clone --stdlayout sets up trunk as master' ' git svn clone -s "$svnrepo" g && ( cd g && - test x`git rev-parse --verify refs/remotes/origin/trunk^0` = \ - x`git rev-parse --verify refs/heads/master^0` + test x$(git rev-parse --verify refs/remotes/origin/trunk^0) = \ + x$(git rev-parse --verify refs/heads/master^0) ) ' diff --git a/t/t9150-svk-mergetickets.sh b/t/t9150-svk-mergetickets.sh index 24c2421bfc..1bb676bede 100755 --- a/t/t9150-svk-mergetickets.sh +++ b/t/t9150-svk-mergetickets.sh @@ -19,7 +19,7 @@ test_expect_success 'load svk depot' " uuid=b48289b2-9c08-4d72-af37-0358a40b9c15 test_expect_success 'svk merges were represented coming in' " - [ `git cat-file commit HEAD | grep parent | wc -l` -eq 2 ] + [ $(git cat-file commit HEAD | grep parent | wc -l) -eq 2 ] " test_done diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 14a938402e..4c5f3c9d41 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -171,10 +171,10 @@ test_expect_success 'A: verify tag/series-A-blob' ' test_expect_success 'A: verify marks output' ' cat >expect <<-EOF && - :2 `git rev-parse --verify master:file2` - :3 `git rev-parse --verify master:file3` - :4 `git rev-parse --verify master:file4` - :5 `git rev-parse --verify master^0` + :2 $(git rev-parse --verify master:file2) + :3 $(git rev-parse --verify master:file3) + :4 $(git rev-parse --verify master:file4) + :5 $(git rev-parse --verify master^0) EOF test_cmp expect marks.out ' @@ -264,8 +264,8 @@ test_expect_success 'A: verify diff' ' EOF git diff-tree -M -r master verify--import-marks >actual && compare_diff_raw expect actual && - test `git rev-parse --verify master:file2` \ - = `git rev-parse --verify verify--import-marks:copy-of-file2` + test $(git rev-parse --verify master:file2) \ + = $(git rev-parse --verify verify--import-marks:copy-of-file2) ' test_expect_success 'A: export marks with large values' ' @@ -364,7 +364,7 @@ test_expect_success 'B: accept branch name "TEMP_TAG"' ' git prune" && git fast-import <input && test -f .git/TEMP_TAG && - test `git rev-parse master` = `git rev-parse TEMP_TAG^` + test $(git rev-parse master) = $(git rev-parse TEMP_TAG^) ' test_expect_success 'B: accept empty committer' ' @@ -473,8 +473,8 @@ test_expect_success 'B: fail on invalid committer (5)' ' ### test_expect_success 'C: incremental import create pack from stdin' ' - newf=`echo hi newf | git hash-object -w --stdin` && - oldf=`git rev-parse --verify master:file2` && + newf=$(echo hi newf | git hash-object -w --stdin) && + oldf=$(git rev-parse --verify master:file2) && test_tick && cat >input <<-INPUT_END && commit refs/heads/branch @@ -499,13 +499,13 @@ test_expect_success 'C: verify pack' ' ' test_expect_success 'C: validate reuse existing blob' ' - test $newf = `git rev-parse --verify branch:file2/newf` && - test $oldf = `git rev-parse --verify branch:file2/oldf` + test $newf = $(git rev-parse --verify branch:file2/newf) && + test $oldf = $(git rev-parse --verify branch:file2/oldf) ' test_expect_success 'C: verify commit' ' cat >expect <<-EOF && - parent `git rev-parse --verify master^0` + parent $(git rev-parse --verify master^0) author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE @@ -624,7 +624,7 @@ test_expect_success 'E: verify commit' ' ### test_expect_success 'F: non-fast-forward update skips' ' - old_branch=`git rev-parse --verify branch^0` && + old_branch=$(git rev-parse --verify branch^0) && test_tick && cat >input <<-INPUT_END && commit refs/heads/branch @@ -642,7 +642,7 @@ test_expect_success 'F: non-fast-forward update skips' ' test_must_fail git fast-import <input && # branch must remain unaffected - test $old_branch = `git rev-parse --verify branch^0` + test $old_branch = $(git rev-parse --verify branch^0) ' test_expect_success 'F: verify pack' ' @@ -651,8 +651,8 @@ test_expect_success 'F: verify pack' ' test_expect_success 'F: verify other commit' ' cat >expect <<-EOF && - tree `git rev-parse branch~1^{tree}` - parent `git rev-parse branch~1` + tree $(git rev-parse branch~1^{tree}) + parent $(git rev-parse branch~1) author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE @@ -667,7 +667,7 @@ test_expect_success 'F: verify other commit' ' ### test_expect_success 'G: non-fast-forward update forced' ' - old_branch=`git rev-parse --verify branch^0` && + old_branch=$(git rev-parse --verify branch^0) && test_tick && cat >input <<-INPUT_END && commit refs/heads/branch @@ -687,8 +687,8 @@ test_expect_success 'G: verify pack' ' ' test_expect_success 'G: branch changed, but logged' ' - test $old_branch != `git rev-parse --verify branch^0` && - test $old_branch = `git rev-parse --verify branch@{1}` + test $old_branch != $(git rev-parse --verify branch^0) && + test $old_branch = $(git rev-parse --verify branch@{1}) ' ### @@ -763,7 +763,7 @@ test_expect_success 'I: export-pack-edges' ' test_expect_success 'I: verify edge list' ' cat >expect <<-EOF && - .git/objects/pack/pack-.pack: `git rev-parse --verify export-boundary` + .git/objects/pack/pack-.pack: $(git rev-parse --verify export-boundary) EOF sed -e s/pack-.*pack/pack-.pack/ edges.list >actual && test_cmp expect actual @@ -795,8 +795,8 @@ test_expect_success 'J: reset existing branch creates empty commit' ' git fast-import <input ' test_expect_success 'J: branch has 1 commit, empty tree' ' - test 1 = `git rev-list J | wc -l` && - test 0 = `git ls-tree J | wc -l` + test 1 = $(git rev-list J | wc -l) && + test 0 = $(git ls-tree J | wc -l) ' test_expect_success 'J: tag must fail on empty branch' ' @@ -838,8 +838,8 @@ test_expect_success 'K: reinit branch with from' ' git fast-import <input ' test_expect_success 'K: verify K^1 = branch^1' ' - test `git rev-parse --verify branch^1` \ - = `git rev-parse --verify K^1` + test $(git rev-parse --verify branch^1) \ + = $(git rev-parse --verify K^1) ' ### @@ -929,7 +929,7 @@ test_expect_success 'L: nested tree copy does not corrupt deltas' ' git ls-tree L2 g/b/ >tmp && cat tmp | cut -f 2 >actual && test_cmp expect actual && - git fsck `git rev-parse L2` + git fsck $(git rev-parse L2) ' ### @@ -1106,7 +1106,7 @@ test_expect_success 'N: copy dirty subdirectory' ' INPUT_END git fast-import <input && - test `git rev-parse N2^{tree}` = `git rev-parse N3^{tree}` + test $(git rev-parse N2^{tree}) = $(git rev-parse N3^{tree}) ' test_expect_success 'N: copy directory by id' ' @@ -1503,7 +1503,7 @@ test_expect_success 'O: comments are all skipped' ' INPUT_END git fast-import <input && - test `git rev-parse N3` = `git rev-parse O1` + test $(git rev-parse N3) = $(git rev-parse O1) ' test_expect_success 'O: blank lines not necessary after data commands' ' @@ -1524,7 +1524,7 @@ test_expect_success 'O: blank lines not necessary after data commands' ' INPUT_END git fast-import <input && - test `git rev-parse N3` = `git rev-parse O2` + test $(git rev-parse N3) = $(git rev-parse O2) ' test_expect_success 'O: repack before next test' ' @@ -1570,8 +1570,8 @@ test_expect_success 'O: blank lines not necessary after other commands' ' INPUT_END git fast-import <input && - test 8 = `find .git/objects/pack -type f | wc -l` && - test `git rev-parse refs/tags/O3-2nd` = `git rev-parse O3^` && + test 8 = $(find .git/objects/pack -type f | wc -l) && + test $(git rev-parse refs/tags/O3-2nd) = $(git rev-parse O3^) && git log --reverse --pretty=oneline O3 | sed s/^.*z// >actual && test_cmp expect actual ' @@ -1631,7 +1631,7 @@ test_expect_success 'P: superproject & submodule mix' ' data <<DATAEND [submodule "sub"] path = sub - url = "`pwd`/sub" + url = "$(pwd)/sub" DATAEND commit refs/heads/subuse1 @@ -1691,7 +1691,7 @@ test_expect_success 'P: verbatim SHA gitlinks' ' data <<DATAEND [submodule "sub"] path = sub - url = "`pwd`/sub" + url = "$(pwd)/sub" DATAEND commit refs/heads/subuse2 @@ -1978,7 +1978,7 @@ test_expect_success 'Q: verify first note for third commit' ' test_expect_success 'Q: verify second notes commit' ' cat >expect <<-EOF && - parent `git rev-parse --verify refs/notes/foobar~2` + parent $(git rev-parse --verify refs/notes/foobar~2) author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE @@ -2045,7 +2045,7 @@ test_expect_success 'Q: verify third note for first commit' ' test_expect_success 'Q: verify fourth notes commit' ' cat >expect <<-EOF && - parent `git rev-parse --verify refs/notes/foobar^` + parent $(git rev-parse --verify refs/notes/foobar^) author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh index 66c8b0a371..b5149fde6e 100755 --- a/t/t9350-fast-export.sh +++ b/t/t9350-fast-export.sh @@ -163,7 +163,7 @@ test_expect_success 'setup submodule' ' git add file && git commit -m sub_initial ) && - git submodule add "`pwd`/sub" sub && + git submodule add "$(pwd)/sub" sub && git commit -m initial && test_tick && ( @@ -377,7 +377,7 @@ test_expect_success 'full-tree re-shows unmodified files' ' test_expect_success 'set-up a few more tags for tag export tests' ' git checkout -f master && - HEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed "s/tree //"` && + HEAD_TREE=$(git show -s --pretty=raw HEAD | grep tree | sed "s/tree //") && git tag tree_tag -m "tagging a tree" $HEAD_TREE && git tag -a tree_tag-obj -m "tagging a tree" $HEAD_TREE && git tag tag-obj_tag -m "tagging a tag" tree_tag-obj && @@ -422,7 +422,7 @@ test_expect_success 'directory becomes symlink' ' test_expect_success 'fast-export quotes pathnames' ' git init crazy-paths && (cd crazy-paths && - blob=`echo foo | git hash-object -w --stdin` && + blob=$(echo foo | git hash-object -w --stdin) && git update-index --add \ --cacheinfo 100644 $blob "$(printf "path with\\nnewline")" \ --cacheinfo 100644 $blob "path with \"quote\"" \ diff --git a/t/t9501-gitweb-standalone-http-status.sh b/t/t9501-gitweb-standalone-http-status.sh index d3a5bac754..2a0ffed870 100755 --- a/t/t9501-gitweb-standalone-http-status.sh +++ b/t/t9501-gitweb-standalone-http-status.sh @@ -100,14 +100,14 @@ test_expect_success 'snapshots: bad tree-ish id (tagged object)' ' echo object > tag-object && git add tag-object && test_tick && git commit -m "Object to be tagged" && - git tag tagged-object `git hash-object tag-object` && + git tag tagged-object $(git hash-object tag-object) && gitweb_run "p=.git;a=snapshot;h=tagged-object;sf=tgz" && grep "400 - Object is not a tree-ish" gitweb.output ' test_debug 'cat gitweb.output' test_expect_success 'snapshots: good object id' ' - ID=`git rev-parse --verify HEAD` && + ID=$(git rev-parse --verify HEAD) && gitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" && grep "Status: 200 OK" gitweb.output ' @@ -173,7 +173,7 @@ test_expect_success DATE_PARSER 'modification: snapshot if-modified-since (unmod test_debug 'cat gitweb.headers' test_expect_success DATE_PARSER 'modification: tree snapshot' ' - ID=`git rev-parse --verify HEAD^{tree}` && + ID=$(git rev-parse --verify HEAD^{tree}) && HTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" && export HTTP_IF_MODIFIED_SINCE && test_when_finished "unset HTTP_IF_MODIFIED_SINCE" && diff --git a/t/t9827-git-p4-change-filetype.sh b/t/t9827-git-p4-change-filetype.sh new file mode 100755 index 0000000000..7433998f47 --- /dev/null +++ b/t/t9827-git-p4-change-filetype.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +test_description='git p4 support for file type change' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +test_expect_success 'create files' ' + ( + cd "$cli" && + p4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i && + cat >file1 <<-EOF && + text without any funny substitution business + EOF + cat >file2 <<-EOF && + second file whose type will change + EOF + p4 add file1 file2 && + p4 submit -d "add files" + ) +' + +test_expect_success SYMLINKS 'change file to symbolic link' ' + git p4 clone --dest="$git" //depot@all && + test_when_finished cleanup_git && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + + rm file2 && + ln -s file1 file2 && + git add file2 && + git commit -m "symlink file1 to file2" && + git p4 submit && + p4 filelog -m 1 //depot/file2 >filelog && + grep "(symlink)" filelog + ) +' + +test_expect_success SYMLINKS 'change symbolic link to file' ' + git p4 clone --dest="$git" //depot@all && + test_when_finished cleanup_git && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + + rm file2 && + cat >file2 <<-EOF && + This is another content for the second file. + EOF + git add file2 && + git commit -m "re-write file2" && + git p4 submit && + p4 filelog -m 1 //depot/file2 >filelog && + grep "(text)" filelog + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done diff --git a/t/t9901-git-web--browse.sh b/t/t9901-git-web--browse.sh index b0a6bad8dd..de7152f827 100755 --- a/t/t9901-git-web--browse.sh +++ b/t/t9901-git-web--browse.sh @@ -43,7 +43,7 @@ test_expect_success \ echo fake: "$@" EOF chmod +x "fake browser" && - git config browser.w3m.path "`pwd`/fake browser" && + git config browser.w3m.path "$(pwd)/fake browser" && test_web_browse w3m http://example.com/foo ' diff --git a/t/test-lib.sh b/t/test-lib.sh index 16c4d7b516..bd4b02e9db 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -1054,20 +1054,28 @@ test_lazy_prereq NOT_ROOT ' test "$uid" != 0 ' -# On a filesystem that lacks SANITY, a file can be deleted even if -# the containing directory doesn't have write permissions, or a file -# can be accessed even if the containing directory doesn't have read -# or execute permissions, causing our tests that validate that Git -# works sensibly in such situations. +# SANITY is about "can you correctly predict what the filesystem would +# do by only looking at the permission bits of the files and +# directories?" A typical example of !SANITY is running the test +# suite as root, where a test may expect "chmod -r file && cat file" +# to fail because file is supposed to be unreadable after a successful +# chmod. In an environment (i.e. combination of what filesystem is +# being used and who is running the tests) that lacks SANITY, you may +# be able to delete or create a file when the containing directory +# doesn't have write permissions, or access a file even if the +# containing directory doesn't have read or execute permissions. + test_lazy_prereq SANITY ' mkdir SANETESTD.1 SANETESTD.2 && chmod +w SANETESTD.1 SANETESTD.2 && >SANETESTD.1/x 2>SANETESTD.2/x && chmod -w SANETESTD.1 && + chmod -r SANETESTD.1/x && chmod -rx SANETESTD.2 || error "bug in test sript: cannot prepare SANETESTD" + ! test -r SANETESTD.1/x && ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x status=$? diff --git a/test-path-utils.c b/test-path-utils.c index c67bf65b34..c3adcd87b8 100644 --- a/test-path-utils.c +++ b/test-path-utils.c @@ -39,6 +39,130 @@ static void normalize_argv_string(const char **var, const char *input) die("Bad value: %s\n", input); } +struct test_data { + const char *from; /* input: transform from this ... */ + const char *to; /* output: ... to this. */ + const char *alternative; /* output: ... or this. */ +}; + +static int test_function(struct test_data *data, char *(*func)(char *input), + const char *funcname) +{ + int failed = 0, i; + char buffer[1024]; + char *to; + + for (i = 0; data[i].to; i++) { + if (!data[i].from) + to = func(NULL); + else { + strcpy(buffer, data[i].from); + to = func(buffer); + } + if (!strcmp(to, data[i].to)) + continue; + if (!data[i].alternative) + error("FAIL: %s(%s) => '%s' != '%s'\n", + funcname, data[i].from, to, data[i].to); + else if (!strcmp(to, data[i].alternative)) + continue; + else + error("FAIL: %s(%s) => '%s' != '%s', '%s'\n", + funcname, data[i].from, to, data[i].to, + data[i].alternative); + failed = 1; + } + return failed; +} + +static struct test_data basename_data[] = { + /* --- POSIX type paths --- */ + { NULL, "." }, + { "", "." }, + { ".", "." }, + { "..", ".." }, + { "/", "/" }, + { "//", "/", "//" }, + { "///", "/", "//" }, + { "////", "/", "//" }, + { "usr", "usr" }, + { "/usr", "usr" }, + { "/usr/", "usr" }, + { "/usr//", "usr" }, + { "/usr/lib", "lib" }, + { "usr/lib", "lib" }, + { "usr/lib///", "lib" }, + +#if defined(__MINGW32__) || defined(_MSC_VER) + /* --- win32 type paths --- */ + { "\\usr", "usr" }, + { "\\usr\\", "usr" }, + { "\\usr\\\\", "usr" }, + { "\\usr\\lib", "lib" }, + { "usr\\lib", "lib" }, + { "usr\\lib\\\\\\", "lib" }, + { "C:/usr", "usr" }, + { "C:/usr", "usr" }, + { "C:/usr/", "usr" }, + { "C:/usr//", "usr" }, + { "C:/usr/lib", "lib" }, + { "C:usr/lib", "lib" }, + { "C:usr/lib///", "lib" }, + { "C:", "." }, + { "C:a", "a" }, + { "C:/", "/" }, + { "C:///", "/" }, + { "\\", "\\", "/" }, + { "\\\\", "\\", "/" }, + { "\\\\\\", "\\", "/" }, +#endif + { NULL, NULL } +}; + +static struct test_data dirname_data[] = { + /* --- POSIX type paths --- */ + { NULL, "." }, + { "", "." }, + { ".", "." }, + { "..", "." }, + { "/", "/" }, + { "//", "/", "//" }, + { "///", "/", "//" }, + { "////", "/", "//" }, + { "usr", "." }, + { "/usr", "/" }, + { "/usr/", "/" }, + { "/usr//", "/" }, + { "/usr/lib", "/usr" }, + { "usr/lib", "usr" }, + { "usr/lib///", "usr" }, + +#if defined(__MINGW32__) || defined(_MSC_VER) + /* --- win32 type paths --- */ + { "\\", "\\" }, + { "\\\\", "\\\\" }, + { "\\usr", "\\" }, + { "\\usr\\", "\\" }, + { "\\usr\\\\", "\\" }, + { "\\usr\\lib", "\\usr" }, + { "usr\\lib", "usr" }, + { "usr\\lib\\\\\\", "usr" }, + { "C:a", "C:." }, + { "C:/", "C:/" }, + { "C:///", "C:/" }, + { "C:/usr", "C:/" }, + { "C:/usr/", "C:/" }, + { "C:/usr//", "C:/" }, + { "C:/usr/lib", "C:/usr" }, + { "C:usr/lib", "C:usr" }, + { "C:usr/lib///", "C:usr" }, + { "\\\\\\", "\\" }, + { "\\\\\\\\", "\\" }, + { "C:", "C:.", "." }, +#endif + { NULL, NULL } +}; + int main(int argc, char **argv) { if (argc == 3 && !strcmp(argv[1], "normalize_path_copy")) { @@ -133,6 +257,12 @@ int main(int argc, char **argv) return 0; } + if (argc == 2 && !strcmp(argv[1], "basename")) + return test_function(basename_data, basename, argv[1]); + + if (argc == 2 && !strcmp(argv[1], "dirname")) + return test_function(dirname_data, dirname, argv[1]); + fprintf(stderr, "%s: unknown function name: %s\n", argv[0], argv[1] ? argv[1] : "(there was none)"); return 1; diff --git a/test-run-command.c b/test-run-command.c index 89c7de2c60..fbe0a27ef3 100644 --- a/test-run-command.c +++ b/test-run-command.c @@ -10,16 +10,54 @@ #include "git-compat-util.h" #include "run-command.h" +#include "argv-array.h" +#include "strbuf.h" #include <string.h> #include <errno.h> +static int number_callbacks; +static int parallel_next(struct child_process *cp, + struct strbuf *err, + void *cb, + void **task_cb) +{ + struct child_process *d = cb; + if (number_callbacks >= 4) + return 0; + + argv_array_pushv(&cp->args, d->argv); + strbuf_addf(err, "preloaded output of a child\n"); + number_callbacks++; + return 1; +} + +static int no_job(struct child_process *cp, + struct strbuf *err, + void *cb, + void **task_cb) +{ + strbuf_addf(err, "no further jobs available\n"); + return 0; +} + +static int task_finished(int result, + struct child_process *cp, + struct strbuf *err, + void *pp_cb, + void *pp_task_cb) +{ + strbuf_addf(err, "asking for a quick stop\n"); + return 1; +} + int main(int argc, char **argv) { struct child_process proc = CHILD_PROCESS_INIT; + int jobs; if (argc < 3) return 1; - proc.argv = (const char **)argv+2; + proc.argv = (const char **)argv + 2; if (!strcmp(argv[1], "start-command-ENOENT")) { if (start_command(&proc) < 0 && errno == ENOENT) @@ -30,6 +68,21 @@ int main(int argc, char **argv) if (!strcmp(argv[1], "run-command")) exit(run_command(&proc)); + jobs = atoi(argv[2]); + proc.argv = (const char **)argv + 3; + + if (!strcmp(argv[1], "run-command-parallel")) + exit(run_processes_parallel(jobs, parallel_next, + NULL, NULL, &proc)); + + if (!strcmp(argv[1], "run-command-abort")) + exit(run_processes_parallel(jobs, parallel_next, + NULL, task_finished, &proc)); + + if (!strcmp(argv[1], "run-command-no-jobs")) + exit(run_processes_parallel(jobs, no_job, + NULL, task_finished, &proc)); + fprintf(stderr, "check usage\n"); return 1; } diff --git a/test-sha1-array.c b/test-sha1-array.c index ddc491eff9..60ea1d5f14 100644 --- a/test-sha1-array.c +++ b/test-sha1-array.c @@ -11,7 +11,7 @@ int main(int argc, char **argv) struct sha1_array array = SHA1_ARRAY_INIT; struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) { + while (strbuf_getline(&line, stdin) != EOF) { const char *arg; unsigned char sha1[20]; diff --git a/test-sha1.sh b/test-sha1.sh index 0f0bc5d02f..cef4bcc866 100755 --- a/test-sha1.sh +++ b/test-sha1.sh @@ -6,13 +6,13 @@ dd if=/dev/zero bs=1048576 count=100 2>/dev/null | while read expect cnt pfx do case "$expect" in '#'*) continue ;; esac - actual=` + actual=$( { test -z "$pfx" || echo "$pfx" dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null | perl -pe 'y/\000/g/' } | ./test-sha1 $cnt - ` + ) if test "$expect" = "$actual" then echo "OK: $expect $cnt $pfx" @@ -51,14 +51,14 @@ exit while read cnt pfx do - actual=` + actual=$( { test -z "$pfx" || echo "$pfx" dd if=/dev/zero bs=1048576 count=$cnt 2>/dev/null | perl -pe 'y/\000/g/' } | sha1sum | sed -e 's/ .*//' - ` + ) echo "$actual $cnt $pfx" done <<EOF 0 diff --git a/trailer.c b/trailer.c index 6f3416feba..94b387b499 100644 --- a/trailer.c +++ b/trailer.c @@ -2,6 +2,7 @@ #include "string-list.h" #include "run-command.h" #include "commit.h" +#include "tempfile.h" #include "trailer.h" /* * Copyright (c) 2013, 2014 Christian Couder <chriscool@tuxfamily.org> @@ -108,23 +109,23 @@ static char last_non_space_char(const char *s) return '\0'; } -static void print_tok_val(const char *tok, const char *val) +static void print_tok_val(FILE *outfile, const char *tok, const char *val) { char c = last_non_space_char(tok); if (!c) return; if (strchr(separators, c)) - printf("%s%s\n", tok, val); + fprintf(outfile, "%s%s\n", tok, val); else - printf("%s%c %s\n", tok, separators[0], val); + fprintf(outfile, "%s%c %s\n", tok, separators[0], val); } -static void print_all(struct trailer_item *first, int trim_empty) +static void print_all(FILE *outfile, struct trailer_item *first, int trim_empty) { struct trailer_item *item; for (item = first; item; item = item->next) { if (!trim_empty || strlen(item->value) > 0) - print_tok_val(item->token, item->value); + print_tok_val(outfile, item->token, item->value); } } @@ -795,14 +796,15 @@ static int has_blank_line_before(struct strbuf **lines, int start) return 0; } -static void print_lines(struct strbuf **lines, int start, int end) +static void print_lines(FILE *outfile, struct strbuf **lines, int start, int end) { int i; for (i = start; lines[i] && i < end; i++) - printf("%s", lines[i]->buf); + fprintf(outfile, "%s", lines[i]->buf); } -static int process_input_file(struct strbuf **lines, +static int process_input_file(FILE *outfile, + struct strbuf **lines, struct trailer_item **in_tok_first, struct trailer_item **in_tok_last) { @@ -818,10 +820,10 @@ static int process_input_file(struct strbuf **lines, trailer_start = find_trailer_start(lines, trailer_end); /* Print lines before the trailers as is */ - print_lines(lines, 0, trailer_start); + print_lines(outfile, lines, 0, trailer_start); if (!has_blank_line_before(lines, trailer_start - 1)) - printf("\n"); + fprintf(outfile, "\n"); /* Parse trailer lines */ for (i = trailer_start; i < trailer_end; i++) { @@ -842,13 +844,45 @@ static void free_all(struct trailer_item **first) } } -void process_trailers(const char *file, int trim_empty, struct string_list *trailers) +static struct tempfile trailers_tempfile; + +static FILE *create_in_place_tempfile(const char *file) +{ + struct stat st; + struct strbuf template = STRBUF_INIT; + const char *tail; + FILE *outfile; + + if (stat(file, &st)) + die_errno(_("could not stat %s"), file); + if (!S_ISREG(st.st_mode)) + die(_("file %s is not a regular file"), file); + if (!(st.st_mode & S_IWUSR)) + die(_("file %s is not writable by user"), file); + + /* Create temporary file in the same directory as the original */ + tail = strrchr(file, '/'); + if (tail != NULL) + strbuf_add(&template, file, tail - file + 1); + strbuf_addstr(&template, "git-interpret-trailers-XXXXXX"); + + xmks_tempfile_m(&trailers_tempfile, template.buf, st.st_mode); + strbuf_release(&template); + outfile = fdopen_tempfile(&trailers_tempfile, "w"); + if (!outfile) + die_errno(_("could not open temporary file")); + + return outfile; +} + +void process_trailers(const char *file, int in_place, int trim_empty, struct string_list *trailers) { struct trailer_item *in_tok_first = NULL; struct trailer_item *in_tok_last = NULL; struct trailer_item *arg_tok_first; struct strbuf **lines; int trailer_end; + FILE *outfile = stdout; /* Default config must be setup first */ git_config(git_trailer_default_config, NULL); @@ -856,19 +890,26 @@ void process_trailers(const char *file, int trim_empty, struct string_list *trai lines = read_input_file(file); + if (in_place) + outfile = create_in_place_tempfile(file); + /* Print the lines before the trailers */ - trailer_end = process_input_file(lines, &in_tok_first, &in_tok_last); + trailer_end = process_input_file(outfile, lines, &in_tok_first, &in_tok_last); arg_tok_first = process_command_line_args(trailers); process_trailers_lists(&in_tok_first, &in_tok_last, &arg_tok_first); - print_all(in_tok_first, trim_empty); + print_all(outfile, in_tok_first, trim_empty); free_all(&in_tok_first); /* Print the lines after the trailers as is */ - print_lines(lines, trailer_end, INT_MAX); + print_lines(outfile, lines, trailer_end, INT_MAX); + + if (in_place) + if (rename_tempfile(&trailers_tempfile, file)) + die_errno(_("could not rename temporary file to %s"), file); strbuf_list_free(lines); } diff --git a/trailer.h b/trailer.h index 8eb25d565e..36b40b8176 100644 --- a/trailer.h +++ b/trailer.h @@ -1,6 +1,7 @@ #ifndef TRAILER_H #define TRAILER_H -void process_trailers(const char *file, int trim_empty, struct string_list *trailers); +void process_trailers(const char *file, int in_place, int trim_empty, + struct string_list *trailers); #endif /* TRAILER_H */ diff --git a/transport-helper.c b/transport-helper.c index 0eb3cf01aa..a6bff8b308 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -54,7 +54,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name) strbuf_reset(buffer); if (debug) fprintf(stderr, "Debug: Remote helper: Waiting...\n"); - if (strbuf_getline(buffer, helper, '\n') == EOF) { + if (strbuf_getline(buffer, helper) == EOF) { if (debug) fprintf(stderr, "Debug: Remote helper quit.\n"); return 1; @@ -137,7 +137,8 @@ static struct child_process *get_helper(struct transport *transport) data->no_disconnect_req = 0; /* - * Open the output as FILE* so strbuf_getline() can be used. + * Open the output as FILE* so strbuf_getline_*() family of + * functions can be used. * Do this with duped fd because fclose() will close the fd, * and stuff like taking over will require the fd to remain. */ diff --git a/tree-walk.c b/tree-walk.c index 6dccd2d5dd..cd4bb2c38b 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -320,6 +320,7 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) struct tree_desc_x *tx = xcalloc(n, sizeof(*tx)); struct strbuf base = STRBUF_INIT; int interesting = 1; + char *traverse_path; for (i = 0; i < n; i++) tx[i].d = t[i]; @@ -329,7 +330,11 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) make_traverse_path(base.buf, info->prev, &info->name); base.buf[info->pathlen-1] = '/'; strbuf_setlen(&base, info->pathlen); + traverse_path = xstrndup(base.buf, info->pathlen); + } else { + traverse_path = xstrndup(info->name.path, info->pathlen); } + info->traverse_path = traverse_path; for (;;) { int trees_used; unsigned long mask, dirmask; @@ -411,6 +416,8 @@ int traverse_trees(int n, struct tree_desc *t, struct traverse_info *info) for (i = 0; i < n; i++) free_extended_entry(tx + i); free(tx); + free(traverse_path); + info->traverse_path = NULL; strbuf_release(&base); return error; } diff --git a/tree-walk.h b/tree-walk.h index 3b2f7bf17d..174eb617df 100644 --- a/tree-walk.h +++ b/tree-walk.h @@ -59,6 +59,7 @@ enum follow_symlinks_result { enum follow_symlinks_result get_tree_entry_follow_symlinks(unsigned char *tree_sha1, const char *name, unsigned char *result, struct strbuf *result_path, unsigned *mode); struct traverse_info { + const char *traverse_path; struct traverse_info *prev; struct name_entry name; int pathlen; diff --git a/unimplemented.sh b/unimplemented.sh index 5252de4b25..fee21d24e8 100644 --- a/unimplemented.sh +++ b/unimplemented.sh @@ -1,4 +1,4 @@ #!/bin/sh -echo >&2 "fatal: git was built without support for `basename $0` (@@REASON@@)." +echo >&2 "fatal: git was built without support for $(basename $0) (@@REASON@@)." exit 128 diff --git a/unpack-trees.c b/unpack-trees.c index 8e2032f4e5..9f55cc28b9 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -498,13 +498,14 @@ static int traverse_trees_recursive(int n, unsigned long dirmask, * itself - the caller needs to do the final check for the cache * entry having more data at the end! */ -static int do_compare_entry(const struct cache_entry *ce, const struct traverse_info *info, const struct name_entry *n) +static int do_compare_entry_piecewise(const struct cache_entry *ce, const struct traverse_info *info, const struct name_entry *n) { int len, pathlen, ce_len; const char *ce_name; if (info->prev) { - int cmp = do_compare_entry(ce, info->prev, &info->name); + int cmp = do_compare_entry_piecewise(ce, info->prev, + &info->name); if (cmp) return cmp; } @@ -522,6 +523,39 @@ static int do_compare_entry(const struct cache_entry *ce, const struct traverse_ return df_name_compare(ce_name, ce_len, S_IFREG, n->path, len, n->mode); } +static int do_compare_entry(const struct cache_entry *ce, + const struct traverse_info *info, + const struct name_entry *n) +{ + int len, pathlen, ce_len; + const char *ce_name; + int cmp; + + /* + * If we have not precomputed the traverse path, it is quicker + * to avoid doing so. But if we have precomputed it, + * it is quicker to use the precomputed version. + */ + if (!info->traverse_path) + return do_compare_entry_piecewise(ce, info, n); + + cmp = strncmp(ce->name, info->traverse_path, info->pathlen); + if (cmp) + return cmp; + + pathlen = info->pathlen; + ce_len = ce_namelen(ce); + + if (ce_len < pathlen) + return -1; + + ce_len -= pathlen; + ce_name = ce->name + pathlen; + + len = tree_entry_len(n); + return df_name_compare(ce_name, ce_len, S_IFREG, n->path, len, n->mode); +} + static int compare_entry(const struct cache_entry *ce, const struct traverse_info *info, const struct name_entry *n) { int cmp = do_compare_entry(ce, info, n); @@ -661,8 +695,19 @@ static int find_cache_pos(struct traverse_info *info, ++o->cache_bottom; continue; } - if (!ce_in_traverse_path(ce, info)) + if (!ce_in_traverse_path(ce, info)) { + /* + * Check if we can skip future cache checks + * (because we're already past all possible + * entries in the traverse path). + */ + if (info->traverse_path) { + if (strncmp(ce->name, info->traverse_path, + info->pathlen) > 0) + break; + } continue; + } ce_name = ce->name + pfxlen; ce_slash = strchr(ce_name, '/'); if (ce_slash) diff --git a/walker.c b/walker.c index 7b7e72b120..08773d419f 100644 --- a/walker.c +++ b/walker.c @@ -220,7 +220,7 @@ int walker_targets_stdin(char ***target, const char ***write_ref) char *rf_one = NULL; char *tg_one; - if (strbuf_getline(&buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(&buf, stdin) == EOF) break; tg_one = buf.buf; rf_one = strchr(tg_one, '\t'); diff --git a/wrapper.c b/wrapper.c index c95e2906b8..29a45d2654 100644 --- a/wrapper.c +++ b/wrapper.c @@ -236,8 +236,24 @@ ssize_t xread(int fd, void *buf, size_t len) len = MAX_IO_SIZE; while (1) { nr = read(fd, buf, len); - if ((nr < 0) && (errno == EAGAIN || errno == EINTR)) - continue; + if (nr < 0) { + if (errno == EINTR) + continue; + if (errno == EAGAIN || errno == EWOULDBLOCK) { + struct pollfd pfd; + pfd.events = POLLIN; + pfd.fd = fd; + /* + * it is OK if this poll() failed; we + * want to leave this infinite loop + * only when read() returns with + * success, or an expected failure, + * which would be checked by the next + * call to read(2). + */ + poll(&pfd, 1, -1); + } + } return nr; } } @@ -375,6 +391,19 @@ FILE *xfdopen(int fd, const char *mode) return stream; } +FILE *fopen_for_writing(const char *path) +{ + FILE *ret = fopen(path, "w"); + + if (!ret && errno == EPERM) { + if (!unlink(path)) + ret = fopen(path, "w"); + else + errno = EPERM; + } + return ret; +} + int xmkstemp(char *template) { int fd; diff --git a/wt-status.c b/wt-status.c index bba25960b4..ab4f80d6d0 100644 --- a/wt-status.c +++ b/wt-status.c @@ -988,7 +988,7 @@ static char *read_line_from_git_path(const char *filename) strbuf_release(&buf); return NULL; } - strbuf_getline(&buf, fp, '\n'); + strbuf_getline_lf(&buf, fp); if (!fclose(fp)) { return strbuf_detach(&buf, NULL); } else { @@ -1076,7 +1076,7 @@ static void read_rebase_todolist(const char *fname, struct string_list *lines) if (!f) die_errno("Could not open file %s for reading", git_path("%s", fname)); - while (!strbuf_getline(&line, f, '\n')) { + while (!strbuf_getline_lf(&line, f)) { if (line.len && line.buf[0] == comment_line_char) continue; strbuf_trim(&line);