{"thread":{"id":"33254","subject":"Hard reset of a subdirectory in a sparse checkout setting","startedAt":"2013-03-22T10:28:25Z","lastAt":"2013-05-14T10:21:42Z","messageCount":17,"participants":["Kirill Müller","Duy Nguyen","Nguyễn Thái Ngọc Duy","Eric Sunshine","Jonathan Nieder","Junio C Hamano","Müller Kirill"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"211927","messageId":"514C3249.7000100@ivt.baug.ethz.ch","threadId":"33254","inReplyTo":null,"subject":"Hard reset of a subdirectory in a sparse checkout setting","fromName":"Kirill Müller","fromEmail":"kirill.mueller@ivt.baug.ethz.ch","sentAt":"2013-03-22T10:28:25Z","receivedAt":"2013-03-22T10:28:25Z","isPatch":false,"sender":{"key":"kirill.mueller@ivt.baug.ethz.ch","avatar":"https://gravatar.com/avatar/4c2dbe6c5c7127b6b98e59fce2df9fcc115cd04be4ff635b25a76a9ef881e5e7?d=mp&s=160"},"body":"Hi\n\nI can't find a neat way to \"git reset --hard\" a subdirectory of a \ncheckout without reading in directories or files which are excluded by a \nsparse checkout. This has been asked on StackOverflow in greater detail, \nbut the \"right\" answer is still missing: \nhttp://stackoverflow.com/q/15404535/946850\n\nThe options I see are:\n\n- git checkout . (will restore excluded directories)\n\n- git reset --hard (won't accept a path argument)\n\n- git diff | patch -R (awkward)\n\nWhat's the proper way to do this in Git?\n\nThe script below illustrates the problem. The proper command should be \ninserted below the \"How to make files ...\" comment -- the current \ncommand \"git checkout -- a\" will restore the file a/c/ac which is \nsupposed to be excluded by the sparse checkout. Note that I do not want \nto explicitly restore a/a and a/b, I only \"know\" a and want to restore \neverything below. And I also don't \"know\" b, or which other directories \nreside on the same level as a.\n\nThank you for your help.\n\n\nCheers\n\nKirill\n\n\n#!/bin/sh\n\nrm -rf repo; git init repo; cd repo\nfor f in a b; do\n   for g in a b c; do\n     mkdir -p $f/$g\n     touch $f/$g/$f$g\n     git add $f/$g\n     git commit -m \"added $f/$g\"\n   done\ndone\ngit config core.sparsecheckout true\necho a/a > .git/info/sparse-checkout\necho a/b >> .git/info/sparse-checkout\necho b/a >> .git/info/sparse-checkout\ngit read-tree -m -u HEAD\necho \"After read-tree:\"\nfind * -type f\n\nrm a/a/aa\nrm a/b/ab\necho >> b/a/ba\necho \"After modifying:\"\nfind * -type f\ngit status\n\n# How to make files a/* reappear without changing b and without \nrecreating a/c?\ngit checkout -- a\n\necho \"After checkout:\"\ngit status\nfind * -type f\n"},{"id":"212041","messageId":"CACsJy8DmkMWOx-u2=trz+GTtwpbksTbCvUU+AOQYo5SrNtM2Gw@mail.gmail.com","threadId":"33254","inReplyTo":"514C3249.7000100@ivt.baug.ethz.ch","subject":"Re: Hard reset of a subdirectory in a sparse checkout setting","fromName":"Duy Nguyen","fromEmail":"pclouds@gmail.com","sentAt":"2013-03-23T09:59:49Z","receivedAt":"2013-03-23T09:59:49Z","isPatch":false,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"On Fri, Mar 22, 2013 at 5:28 PM, Kirill Müller\n<kirill.mueller@ivt.baug.ethz.ch> wrote:\n> I can't find a neat way to \"git reset --hard\" a subdirectory of a checkout\n> without reading in directories or files which are excluded by a sparse\n> checkout. This has been asked on StackOverflow in greater detail, but the\n> \"right\" answer is still missing: http://stackoverflow.com/q/15404535/946850\n>\n> The options I see are:\n>\n> - git checkout . (will restore excluded directories)\n>\n> - git reset --hard (won't accept a path argument)\n>\n> - git diff | patch -R (awkward)\n\nAnother way is\n\ngit diff --name-only -z|xargs -0 git checkout\n\n> What's the proper way to do this in Git?\n\nI think adding --sparse to git checkout may be more user-friendly. And\nit looks like a simple change. I'll make a patch soon (I need some\ntime to recall how sparse checkout interacts with git-checkout).\n-- \nDuy\n"},{"id":"212052","messageId":"514DA7DE.5040706@ivt.baug.ethz.ch","threadId":"33254","inReplyTo":"CACsJy8DmkMWOx-u2=trz+GTtwpbksTbCvUU+AOQYo5SrNtM2Gw@mail.gmail.com","subject":"Re: Hard reset of a subdirectory in a sparse checkout setting","fromName":"Kirill Müller","fromEmail":"kirill.mueller@ivt.baug.ethz.ch","sentAt":"2013-03-23T13:02:22Z","receivedAt":"2013-03-23T13:02:22Z","isPatch":false,"sender":{"key":"kirill.mueller@ivt.baug.ethz.ch","avatar":"https://gravatar.com/avatar/4c2dbe6c5c7127b6b98e59fce2df9fcc115cd04be4ff635b25a76a9ef881e5e7?d=mp&s=160"},"body":"On 03/23/2013 10:59 AM, Duy Nguyen wrote:\n> On Fri, Mar 22, 2013 at 5:28 PM, Kirill Müller\n> <kirill.mueller@ivt.baug.ethz.ch> wrote:\n>> What's the proper way to do this in Git?\n> I think adding --sparse to git checkout may be more user-friendly. And\n> it looks like a simple change. I'll make a patch soon (I need some\n> time to recall how sparse checkout interacts with git-checkout).\nThanks for looking into it. Would it mean an extra switch to the \ncheckout command, or default behavior?\n\n-Kirill\n"},{"id":"212070","messageId":"1364101583-6035-1-git-send-email-pclouds@gmail.com","threadId":"33254","inReplyTo":"514C3249.7000100@ivt.baug.ethz.ch","subject":"[PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2013-03-24T05:06:23Z","receivedAt":"2013-03-24T05:06:23Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\"git checkout -- <paths>\" is usually used to restore all modified\nfiles in <paths>. In sparse checkout mode, this command is overloaded\nwith another meaning: to add back all files in <paths> that are\nexcluded by sparse patterns.\n\nAdd \"--sparse\" option to do what normal mode does: restore all\nmodified files and nothing else.\n\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n I'm not sure if rejecting --sparse when it has no effects (e.g.\n switching branches or interactive mode) like this patch does is a\n good idea. I think it's good in general to spot unused options. On\n the other hand, people may want to add an alias\n \"co = checkout --sparse\" to make this behavior \"default\". In that\n case silently ignoring --sparse may be a good idea.\n\n Documentation/git-checkout.txt       |  7 +++++++\n builtin/checkout.c                   | 18 ++++++++++++++++--\n t/t1011-read-tree-sparse-checkout.sh | 12 ++++++++++++\n 3 files changed, 35 insertions(+), 2 deletions(-)\n\ndiff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt\nindex 8edcdca..45a2b53 100644\n--- a/Documentation/git-checkout.txt\n+++ b/Documentation/git-checkout.txt\n@@ -180,6 +180,13 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n Afterwards you will be ready to prepare your new files, repopulating the\n working tree, by copying them from elsewhere, extracting a tarball, etc.\n \n+\n+--sparse::\n+\tIn sparse checkout mode, `git checkout -- <paths>` would\n+\tupdate all entries matched by <paths> regardless sparse\n+\tpatterns. This option only updates entries matched by <paths>\n+\tand sparse patterns.\n+\n -m::\n --merge::\n \tWhen switching branches,\ndiff --git a/builtin/checkout.c b/builtin/checkout.c\nindex a9c1b5a..3a32145 100644\n--- a/builtin/checkout.c\n+++ b/builtin/checkout.c\n@@ -35,6 +35,7 @@ struct checkout_opts {\n \tint force_detach;\n \tint writeout_stage;\n \tint overwrite_ignore;\n+\tint sparse;\n \n \tconst char *new_branch;\n \tconst char *new_branch_force;\n@@ -224,7 +225,7 @@ static int checkout_paths(const struct checkout_opts *opts,\n \tstruct checkout state;\n \tstatic char *ps_matched;\n \tunsigned char rev[20];\n-\tint flag;\n+\tint flag, sparse;\n \tstruct commit *head;\n \tint errs = 0;\n \tint stage = opts->writeout_stage;\n@@ -254,9 +255,13 @@ static int checkout_paths(const struct checkout_opts *opts,\n \t\tdie(_(\"Cannot update paths and switch to branch '%s' at the same time.\"),\n \t\t    opts->new_branch);\n \n-\tif (opts->patch_mode)\n+\tif (opts->patch_mode) {\n+\t\tif (opts->sparse != -1)\n+\t\t\tdie(_(\"--[no-]sparse cannot be used in interactive mode\"));\n \t\treturn run_add_interactive(revision, \"--patch=checkout\",\n \t\t\t\t\t   opts->pathspec);\n+\t}\n+\tsparse = opts->sparse != -1 ? opts->sparse : 0;\n \n \tlock_file = xcalloc(1, sizeof(struct lock_file));\n \n@@ -275,6 +280,8 @@ static int checkout_paths(const struct checkout_opts *opts,\n \t\tstruct cache_entry *ce = active_cache[pos];\n \t\tif (opts->source_tree && !(ce->ce_flags & CE_UPDATE))\n \t\t\tcontinue;\n+\t\tif (sparse && ce_skip_worktree(ce))\n+\t\t\tcontinue;\n \t\tmatch_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);\n \t}\n \n@@ -315,6 +322,8 @@ static int checkout_paths(const struct checkout_opts *opts,\n \t\tstruct cache_entry *ce = active_cache[pos];\n \t\tif (opts->source_tree && !(ce->ce_flags & CE_UPDATE))\n \t\t\tcontinue;\n+\t\tif (sparse && ce_skip_worktree(ce))\n+\t\t\tcontinue;\n \t\tif (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {\n \t\t\tif (!ce_stage(ce)) {\n \t\t\t\terrs |= checkout_entry(ce, &state, NULL);\n@@ -963,6 +972,9 @@ static int checkout_branch(struct checkout_opts *opts,\n \tif (opts->pathspec)\n \t\tdie(_(\"paths cannot be used with switching branches\"));\n \n+\tif (opts->sparse != -1)\n+\t\tdie(_(\"--[no-]sparse can only be used with paths\"));\n+\n \tif (opts->patch_mode)\n \t\tdie(_(\"'%s' cannot be used with switching branches\"),\n \t\t    \"--patch\");\n@@ -1029,6 +1041,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \t\tOPT_STRING(0, \"conflict\", &conflict_style, N_(\"style\"),\n \t\t\t   N_(\"conflict style (merge or diff3)\")),\n \t\tOPT_BOOLEAN('p', \"patch\", &opts.patch_mode, N_(\"select hunks interactively\")),\n+\t\tOPT_BOOL(0, \"sparse\", &opts.sparse, N_(\"limit pathspecs to sparse entries only\")),\n \t\t{ OPTION_BOOLEAN, 0, \"guess\", &dwim_new_local_branch, NULL,\n \t\t  N_(\"second guess 'git checkout no-such-branch'\"),\n \t\t  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },\n@@ -1039,6 +1052,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \tmemset(&new, 0, sizeof(new));\n \topts.overwrite_ignore = 1;\n \topts.prefix = prefix;\n+\topts.sparse = -1;\n \n \tgitmodules_config();\n \tgit_config(git_checkout_config, &opts);\ndiff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh\nindex 5c0053a..1441fbe 100755\n--- a/t/t1011-read-tree-sparse-checkout.sh\n+++ b/t/t1011-read-tree-sparse-checkout.sh\n@@ -250,4 +250,16 @@ EOF\n \ttest_cmp expected actual\n '\n \n+test_expect_success 'checkout --sparse' '\n+\techo \"*\" >.git/info/sparse-checkout &&\n+\tgit checkout -f top &&\n+\ttest -f init.t &&\n+\techo sub >.git/info/sparse-checkout &&\n+\tgit checkout &&\n+\techo modified >> sub/added &&\n+\tgit checkout --sparse . &&\n+\t! test -f init.t &&\n+\tgit diff --exit-code HEAD\n+'\n+\n test_done\n-- \n1.8.2.83.gc99314b\n"},{"id":"212075","messageId":"CAPig+cSqocBs=YzvH31TRr7mAtOUNanYuXf6AaCgPos9Uz6DRg@mail.gmail.com","threadId":"33254","inReplyTo":"1364101583-6035-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-03-24T06:12:41Z","receivedAt":"2013-03-24T06:12:41Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Sun, Mar 24, 2013 at 1:06 AM, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:\n> diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt\n> index 8edcdca..45a2b53 100644\n> --- a/Documentation/git-checkout.txt\n> +++ b/Documentation/git-checkout.txt\n> @@ -180,6 +180,13 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n> +--sparse::\n> +       In sparse checkout mode, `git checkout -- <paths>` would\n> +       update all entries matched by <paths> regardless sparse\n\ns/regardless/regardless of/\n\n> +       patterns. This option only updates entries matched by <paths>\n> +       and sparse patterns.\n> +\n"},{"id":"212100","messageId":"20130324181752.GA4543@elie.Belkin","threadId":"33254","inReplyTo":"1364101583-6035-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2013-03-24T18:17:52Z","receivedAt":"2013-03-24T18:17:52Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Hi,\n\nNguyễn Thái Ngọc Duy wrote:\n\n> --- a/Documentation/git-checkout.txt\n> +++ b/Documentation/git-checkout.txt\n> @@ -180,6 +180,13 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n>  Afterwards you will be ready to prepare your new files, repopulating the\n>  working tree, by copying them from elsewhere, extracting a tarball, etc.\n>\n> +\n> +--sparse::\n> +\tIn sparse checkout mode, `git checkout -- <paths>` would\n> +\tupdate all entries matched by <paths> regardless sparse\n> +\tpatterns. This option only updates entries matched by <paths>\n> +\tand sparse patterns.\n\nHm, should this be the default?\n\nIn principle, I would expect\n\n\tgit checkout -- .\n\nto make the worktree match the index, respecting the sparse checkout.\nAnd something like\n\n\tgit checkout --widen -- .\n\nto change the sparse checkout pattern.  But of course it is easily\npossible that I am missing some details of how sparse checkout is\nused in practice.\n\nWhat do you think?\nJonathan\n"},{"id":"212110","messageId":"514F58F0.1050909@ivt.baug.ethz.ch","threadId":"33254","inReplyTo":"20130324181752.GA4543@elie.Belkin","subject":"Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Kirill Müller","fromEmail":"kirill.mueller@ivt.baug.ethz.ch","sentAt":"2013-03-24T19:50:08Z","receivedAt":"2013-03-24T19:50:08Z","isPatch":true,"sender":{"key":"kirill.mueller@ivt.baug.ethz.ch","avatar":"https://gravatar.com/avatar/4c2dbe6c5c7127b6b98e59fce2df9fcc115cd04be4ff635b25a76a9ef881e5e7?d=mp&s=160"},"body":"Hi\n\nOn 03/24/2013 07:17 PM, Jonathan Nieder wrote:\n> Hi,\n>\n> Nguyễn Thái Ngọc Duy wrote:\n>\n>> --- a/Documentation/git-checkout.txt\n>> +++ b/Documentation/git-checkout.txt\n>> @@ -180,6 +180,13 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n>>   Afterwards you will be ready to prepare your new files, repopulating the\n>>   working tree, by copying them from elsewhere, extracting a tarball, etc.\n>>\n>> +\n>> +--sparse::\n>> +\tIn sparse checkout mode, `git checkout -- <paths>` would\n>> +\tupdate all entries matched by <paths> regardless sparse\n>> +\tpatterns. This option only updates entries matched by <paths>\n>> +\tand sparse patterns.\n> Hm, should this be the default?\n>\n> In principle, I would expect\n>\n> \tgit checkout -- .\n>\n> to make the worktree match the index, respecting the sparse checkout.\n> And something like\n>\n> \tgit checkout --widen -- .\n>\n> to change the sparse checkout pattern.  But of course it is easily\n> possible that I am missing some details of how sparse checkout is\n> used in practice.\n>\n> What do you think?\nThank you for your opinion. I'd second that. When I do a sparse \ncheckout, I want to see only the directories I have included and not \nexcluded, unless I explicitly change that.\n\n\n-Kirill\n"},{"id":"212140","messageId":"CACsJy8ByH8U0wYuaKaMKd3bauLBbS52peMs1eiGz++2vj2JKTA@mail.gmail.com","threadId":"33254","inReplyTo":"20130324181752.GA4543@elie.Belkin","subject":"Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Duy Nguyen","fromEmail":"pclouds@gmail.com","sentAt":"2013-03-25T01:34:52Z","receivedAt":"2013-03-25T01:34:52Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:\n>> +--sparse::\n>> +     In sparse checkout mode, `git checkout -- <paths>` would\n>> +     update all entries matched by <paths> regardless sparse\n>> +     patterns. This option only updates entries matched by <paths>\n>> +     and sparse patterns.\n>\n> Hm, should this be the default?\n>\n> In principle, I would expect\n>\n>         git checkout -- .\n>\n> to make the worktree match the index, respecting the sparse checkout.\n> And something like\n>\n>         git checkout --widen -- .\n>\n> to change the sparse checkout pattern.  But of course it is easily\n> possible that I am missing some details of how sparse checkout is\n> used in practice.\n>\n> What do you think?\n\nChanging the default may involve a painful transition phase (e.g. \"add\n-u\"). I think making it the default via alias should be good enough in\nmost cases. We also need to think how it impacts checkout usage in\nscripts. I think it might be ok, but I haven't finished my morning\ncoffee yet, so..\n-- \nDuy\n"},{"id":"212141","messageId":"20130325015717.GA3542@elie.Belkin","threadId":"33254","inReplyTo":"CACsJy8ByH8U0wYuaKaMKd3bauLBbS52peMs1eiGz++2vj2JKTA@mail.gmail.com","subject":"Re: [PATCH] checkout: add --sparse for restoring files in sparse checkout mode","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2013-03-25T01:57:17Z","receivedAt":"2013-03-25T01:57:17Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Duy Nguyen wrote:\n> On Mon, Mar 25, 2013 at 1:17 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:\n\n>> Hm, should this be the default?\n>>\n>> In principle, I would expect\n>>\n>>         git checkout -- .\n>>\n>> to make the worktree match the index, respecting the sparse checkout.\n>> And something like\n>>\n>>         git checkout --widen -- .\n>>\n>> to change the sparse checkout pattern.\n[...]\n> Changing the default may involve a painful transition phase (e.g. \"add\n> -u\").\n\nI don't think it needs to.  There aren't many people using sparse\ncheckout even these days, and I think they'd generally be happy about\nthe change.\n\nBut if we want to be conservative until some later point (like 2.1),\nperhaps --sparse should be named something like --no-widen?  That\nway, I can do\n\n\tgit checkout --no-widen -- .\n\nto make the worktree match the index, respecting the sparse checkout.\nAnd I can do\n\n\tgit checkout --widen -- .\n\nto change the sparse checkout pattern.  Meanwhile the confusing\ncommand\n\n\tgit checkout -- .\n\nwould be ill-defined for sparse checkouts --- in past git versions,\nif I understand you correctly it acted like --widen, while in some\nunspecified future version it may change to mean --no-widen.  No\nneed for warnings because I doubt anyone is relying on either\nbehavior.\n\nWould that work?\nJonathan\n"},{"id":"212698","messageId":"1364637753-18785-1-git-send-email-pclouds@gmail.com","threadId":"33254","inReplyTo":"1364101583-6035-1-git-send-email-pclouds@gmail.com","subject":"[PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2013-03-30T10:02:33Z","receivedAt":"2013-03-30T10:02:33Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\"git checkout -- <paths>\" is usually used to restore all modified\nfiles in <paths>. In sparse checkout mode, this command is overloaded\nwith another meaning: to add back all files in <paths> that are\nexcluded by sparse patterns.\n\nAdd \"--no-widen\" option to do what normal mode does: restore all\nmodified files and nothing else. The user can make it \"default\" by\nputting it to an alias (e.g. \"co = checkout --no-widen\") and get back\nto the original behavior with \"git co --widen\".\n\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n --sparse -> --no-widen and git-checkout does not error out when the\n option is specified but has no effects. Let's see how it works out.\n We could change the default from --widen to --no-widen later.\n\n Documentation/git-checkout.txt       | 11 +++++++++++\n builtin/checkout.c                   |  7 +++++++\n t/t1011-read-tree-sparse-checkout.sh | 12 ++++++++++++\n 3 files changed, 30 insertions(+)\n\ndiff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt\nindex 8edcdca..538b8b8 100644\n--- a/Documentation/git-checkout.txt\n+++ b/Documentation/git-checkout.txt\n@@ -180,6 +180,17 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n Afterwards you will be ready to prepare your new files, repopulating the\n working tree, by copying them from elsewhere, extracting a tarball, etc.\n \n+--no-widen::\n+\tIn sparse checkout mode, `git checkout -- <paths>` would\n+\tupdate all entries matched by <paths> regardless of sparse\n+\tpatterns. This option only updates entries matched by <paths>\n+\tand sparse patterns.\n+\n+--widen::\n+\tRevert the effect of `--no-widen` if specified and make\n+\t`git checkout -- <paths>` update all entries matched by\n+\t<paths> regardless of sparse patterns.\n+\n -m::\n --merge::\n \tWhen switching branches,\ndiff --git a/builtin/checkout.c b/builtin/checkout.c\nindex a9c1b5a..246de33 100644\n--- a/builtin/checkout.c\n+++ b/builtin/checkout.c\n@@ -35,6 +35,7 @@ struct checkout_opts {\n \tint force_detach;\n \tint writeout_stage;\n \tint overwrite_ignore;\n+\tint widen_sparse;\n \n \tconst char *new_branch;\n \tconst char *new_branch_force;\n@@ -275,6 +276,8 @@ static int checkout_paths(const struct checkout_opts *opts,\n \t\tstruct cache_entry *ce = active_cache[pos];\n \t\tif (opts->source_tree && !(ce->ce_flags & CE_UPDATE))\n \t\t\tcontinue;\n+\t\tif (!opts->widen_sparse && ce_skip_worktree(ce))\n+\t\t\tcontinue;\n \t\tmatch_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, ps_matched);\n \t}\n \n@@ -315,6 +318,8 @@ static int checkout_paths(const struct checkout_opts *opts,\n \t\tstruct cache_entry *ce = active_cache[pos];\n \t\tif (opts->source_tree && !(ce->ce_flags & CE_UPDATE))\n \t\t\tcontinue;\n+\t\tif (!opts->widen_sparse && ce_skip_worktree(ce))\n+\t\t\tcontinue;\n \t\tif (match_pathspec(opts->pathspec, ce->name, ce_namelen(ce), 0, NULL)) {\n \t\t\tif (!ce_stage(ce)) {\n \t\t\t\terrs |= checkout_entry(ce, &state, NULL);\n@@ -1029,6 +1034,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \t\tOPT_STRING(0, \"conflict\", &conflict_style, N_(\"style\"),\n \t\t\t   N_(\"conflict style (merge or diff3)\")),\n \t\tOPT_BOOLEAN('p', \"patch\", &opts.patch_mode, N_(\"select hunks interactively\")),\n+\t\tOPT_BOOL(0, \"widen\", &opts.widen_sparse, N_(\"do not limit pathspecs to sparse entries only (default)\")),\n \t\t{ OPTION_BOOLEAN, 0, \"guess\", &dwim_new_local_branch, NULL,\n \t\t  N_(\"second guess 'git checkout no-such-branch'\"),\n \t\t  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },\n@@ -1039,6 +1045,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \tmemset(&new, 0, sizeof(new));\n \topts.overwrite_ignore = 1;\n \topts.prefix = prefix;\n+\topts.widen_sparse = 1;\n \n \tgitmodules_config();\n \tgit_config(git_checkout_config, &opts);\ndiff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh\nindex 5c0053a..4a45714 100755\n--- a/t/t1011-read-tree-sparse-checkout.sh\n+++ b/t/t1011-read-tree-sparse-checkout.sh\n@@ -250,4 +250,16 @@ EOF\n \ttest_cmp expected actual\n '\n \n+test_expect_success 'checkout --no-widen' '\n+\techo \"*\" >.git/info/sparse-checkout &&\n+\tgit checkout -f top &&\n+\ttest -f init.t &&\n+\techo sub >.git/info/sparse-checkout &&\n+\tgit checkout &&\n+\techo modified >> sub/added &&\n+\tgit checkout --no-widen . &&\n+\t! test -f init.t &&\n+\tgit diff --exit-code HEAD\n+'\n+\n test_done\n-- \n1.8.2.83.gc99314b\n"},{"id":"212780","messageId":"20130401044816.GI11704@elie.Belkin","threadId":"33254","inReplyTo":"1364637753-18785-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2013-04-01T04:48:16Z","receivedAt":"2013-04-01T04:48:16Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Hi,\n\nNguyễn Thái Ngọc Duy wrote:\n\n> \"git checkout -- <paths>\" is usually used to restore all modified\n> files in <paths>. In sparse checkout mode, this command is overloaded\n> with another meaning: to add back all files in <paths> that are\n> excluded by sparse patterns.\n>\n> Add \"--no-widen\" option to do what normal mode does: restore all\n> modified files and nothing else.\n\nIn an ideal world, I would like \"git checkout --widen\" to modify the\n.git/info/sparse-checkout file, to be able to do:\n\n\tgit clone --sparse-checkout=Documentation git://repo.or.cz/git.git\n\tcd git\n\tgit checkout --widen -- README COPYING INSTALL\n\nand hack on a tree with Documentation/, README, COPYING, and INSTALL\npresent with no actual code to distract.  And \"git checkout --no-widen\"\ncould be a way to ask to respect the existing sparse pattern.\n\nThis patch isn't about tweaking the sparse-checkout pattern; instead,\nit's about how \"git checkout\" interacts with the skip-worktree bit.\nMaybe a good name would be --respect-skip-worktree?\n\n[...]\n> --- a/Documentation/git-checkout.txt\n> +++ b/Documentation/git-checkout.txt\n> @@ -180,6 +180,17 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n>  Afterwards you will be ready to prepare your new files, repopulating the\n>  working tree, by copying them from elsewhere, extracting a tarball, etc.\n>  \n> +--no-widen::\n> +\tIn sparse checkout mode, `git checkout -- <paths>` would\n> +\tupdate all entries matched by <paths> regardless of sparse\n> +\tpatterns. This option only updates entries matched by <paths>\n> +\tand sparse patterns.\n> +\n> +--widen::\n> +\tRevert the effect of `--no-widen` if specified and make\n> +\t`git checkout -- <paths>` update all entries matched by\n> +\t<paths> regardless of sparse patterns.\n\nPerhaps, combining the descriptions of the positive and negative forms:\n\n\t--respect-skip-worktree::\n\t\tBy default, `git checkout -- <paths>` creates or updates files\n\t\tmatching <paths> regardless of the skip-worktree bit.  This\n\t\toption makes 'git checkout' skips entries with the\n\t\tskip-worktree bit set, which can be useful in sparse checkout\n\t\tmode.\n\nI'm afraid I can't imagine when --no-respect-skip-worktree would be\nuseful.  That can easily be a failure of my imagination, though.\n\nWhat do you think?\n\nThanks,\nJonathan\n"},{"id":"212782","messageId":"7vli92ltqp.fsf@alter.siamese.dyndns.org","threadId":"33254","inReplyTo":"20130401044816.GI11704@elie.Belkin","subject":"Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-04-01T05:12:14Z","receivedAt":"2013-04-01T05:12:14Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jonathan Nieder <jrnieder@gmail.com> writes:\n\n> Nguyễn Thái Ngọc Duy wrote:\n>\n>> \"git checkout -- <paths>\" is usually used to restore all modified\n>> files in <paths>. In sparse checkout mode, this command is overloaded\n>> with another meaning: to add back all files in <paths> that are\n>> excluded by sparse patterns.\n>>\n>> Add \"--no-widen\" option to do what normal mode does: restore all\n>> modified files and nothing else.\n>\n> In an ideal world, I would like \"git checkout --widen\" to modify the\n> .git/info/sparse-checkout file, to be able to do:\n>\n> \tgit clone --sparse-checkout=Documentation git://repo.or.cz/git.git\n> \tcd git\n> \tgit checkout --widen -- README COPYING INSTALL\n>\n> and hack on a tree with Documentation/, README, COPYING, and INSTALL\n> present with no actual code to distract.  And \"git checkout --no-widen\"\n> could be a way to ask to respect the existing sparse pattern.\n\nYeah, I think the above makes tons of sense, and --widen would be an\nideal name for that optional behaviour.  When you are limited by\nyour original sparse pathspecs, that would be a way to explicitly\nwiden the paths you interact with.  In that sense, making it off by\ndefault would be a sensible thing to do.  When you limited yourself\nto a subset of dir/, you do not want \"git checkout dir/\" to\nautomatically widen it by accident.\n\n> This patch isn't about tweaking the sparse-checkout pattern; instead,\n> it's about how \"git checkout\" interacts with the skip-worktree bit.\n> Maybe a good name would be --respect-skip-worktree?\n\nYeah, but when would one want to say --no-respect without widening\nthe sparce pathspecs?\n"},{"id":"212783","messageId":"CACsJy8BVcu2VwxgQ9URViHMx2+6436npcYSHyZ5Mj0aVhVFtug@mail.gmail.com","threadId":"33254","inReplyTo":"20130401044816.GI11704@elie.Belkin","subject":"Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode","fromName":"Duy Nguyen","fromEmail":"pclouds@gmail.com","sentAt":"2013-04-01T05:13:53Z","receivedAt":"2013-04-01T05:13:53Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"On Mon, Apr 1, 2013 at 11:48 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:\n> Hi,\n>\n> Nguyễn Thái Ngọc Duy wrote:\n>\n>> \"git checkout -- <paths>\" is usually used to restore all modified\n>> files in <paths>. In sparse checkout mode, this command is overloaded\n>> with another meaning: to add back all files in <paths> that are\n>> excluded by sparse patterns.\n>>\n>> Add \"--no-widen\" option to do what normal mode does: restore all\n>> modified files and nothing else.\n>\n> In an ideal world, I would like \"git checkout --widen\" to modify the\n> .git/info/sparse-checkout file, to be able to do:\n>\n>         git clone --sparse-checkout=Documentation git://repo.or.cz/git.git\n>         cd git\n>         git checkout --widen -- README COPYING INSTALL\n>\n> and hack on a tree with Documentation/, README, COPYING, and INSTALL\n> present with no actual code to distract.  And \"git checkout --no-widen\"\n> could be a way to ask to respect the existing sparse pattern.\n\nIn an ideal world, I would spend more time on this and add\n--edit-sparse, which opens up $EDITOR, lets you edit the patterns and\nreapplies the patterns after $EDITOR exits (catching faults if\npossible). Unfortunately I don't use sparse checkout as much as before\nand therefore have little motivation to do it. I would really like\nnarrow clone to replace sparse checkout, but I haven't made much\nprogress on that front either. I'll try to get back on that once\npathspec-magics topic is settled.\n\n> This patch isn't about tweaking the sparse-checkout pattern; instead,\n> it's about how \"git checkout\" interacts with the skip-worktree bit.\n> Maybe a good name would be --respect-skip-worktree?\n\nI'm bad at naming. If nobody objects, I'll take this as the new option name.\n\n>> --- a/Documentation/git-checkout.txt\n>> +++ b/Documentation/git-checkout.txt\n>> @@ -180,6 +180,17 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n>>  Afterwards you will be ready to prepare your new files, repopulating the\n>>  working tree, by copying them from elsewhere, extracting a tarball, etc.\n>>\n>> +--no-widen::\n>> +     In sparse checkout mode, `git checkout -- <paths>` would\n>> +     update all entries matched by <paths> regardless of sparse\n>> +     patterns. This option only updates entries matched by <paths>\n>> +     and sparse patterns.\n>> +\n>> +--widen::\n>> +     Revert the effect of `--no-widen` if specified and make\n>> +     `git checkout -- <paths>` update all entries matched by\n>> +     <paths> regardless of sparse patterns.\n>\n> Perhaps, combining the descriptions of the positive and negative forms:\n>\n>         --respect-skip-worktree::\n>                 By default, `git checkout -- <paths>` creates or updates files\n>                 matching <paths> regardless of the skip-worktree bit.  This\n>                 option makes 'git checkout' skips entries with the\n>                 skip-worktree bit set, which can be useful in sparse checkout\n>                 mode.\n\nOK\n\n> I'm afraid I can't imagine when --no-respect-skip-worktree would be\n> useful.  That can easily be a failure of my imagination, though.\n\nThere may be scripts that expect \"git checkout -- foo\" to reset\neverything in \"foo\". Or maybe you just want to check out a single file\nand do not bother to edit sparse patterns as you won't need it for\nlong.\n"},{"id":"212785","messageId":"20130401061813.GJ11704@elie.Belkin","threadId":"33254","inReplyTo":"CACsJy8BVcu2VwxgQ9URViHMx2+6436npcYSHyZ5Mj0aVhVFtug@mail.gmail.com","subject":"Re: [PATCH v2] checkout: add --no-widen for restoring files in sparse checkout mode","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2013-04-01T06:18:13Z","receivedAt":"2013-04-01T06:18:13Z","isPatch":true,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Duy Nguyen wrote:\n> On Mon, Apr 1, 2013 at 11:48 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:\n\n>> I'm afraid I can't imagine when --no-respect-skip-worktree would be\n>> useful.  That can easily be a failure of my imagination, though.\n>\n> There may be scripts that expect \"git checkout -- foo\" to reset\n> everything in \"foo\". Or maybe you just want to check out a single file\n> and do not bother to edit sparse patterns as you won't need it for\n> long.\n\nThose scripts are bringing suffering on themselves by using porcelain\ninstead of \"git checkout-index\".  The usual way to look at a single\nfile from the index is \"git show :git.c >git.c\".\n\nSo you've convinced me.  I think --respect-skip-worktree can be just\nthe normal behavior (and that there's no need for a --no-respect\noption).  That would let me do:\n\n\tgit clone --no-checkout git://repo.or.cz/git.git\n\tcd git\n\techo '/Documentation/' >.git/info/sparse-checkout\n\tgit config core.sparsecheckout true\n\tgit checkout\n\n\tprintf '%s\\n' /README /INSTALL /COPYING >>.git/info/sparse-checkout\n\tgit checkout\n\n\t... hack hack hack ...\n\n\t# return to what the index has\n\tgit checkout .\n\nwithout having to see any pesky actual source (*.c) files.\n"},{"id":"214113","messageId":"1365808328-4191-1-git-send-email-pclouds@gmail.com","threadId":"33254","inReplyTo":"1364637753-18785-1-git-send-email-pclouds@gmail.com","subject":"[PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2013-04-12T23:12:08Z","receivedAt":"2013-04-12T23:12:08Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\"git checkout -- <paths>\" is usually used to restore all modified\nfiles in <paths>. In sparse checkout mode, this command is overloaded\nwith another meaning: to add back all files in <paths> that are\nexcluded by sparse patterns.\n\nAs the former makes more sense for day-to-day use. Switch it to the\ndefault and the latter enabled with --ignore-skip-worktree-bits.\n\nWhile at there, add info/sparse-checkout to gitrepository-layout.txt\n\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n Documentation/git-checkout.txt         |  6 ++++++\n Documentation/gitrepository-layout.txt |  4 ++++\n builtin/checkout.c                     |  5 +++++\n t/t1011-read-tree-sparse-checkout.sh   | 24 ++++++++++++++++++++++++\n t/t3001-ls-files-others-exclude.sh     |  2 +-\n 5 files changed, 40 insertions(+), 1 deletion(-)\n\ndiff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt\nindex 8edcdca..23a9413 100644\n--- a/Documentation/git-checkout.txt\n+++ b/Documentation/git-checkout.txt\n@@ -180,6 +180,12 @@ branch by running \"git rm -rf .\" from the top level of the working tree.\n Afterwards you will be ready to prepare your new files, repopulating the\n working tree, by copying them from elsewhere, extracting a tarball, etc.\n \n+--ignore-skip-worktree-bits::\n+\tIn sparse checkout mode, `git checkout -- <paths>` would\n+\tupdate only entries matched by <paths> and sparse patterns\n+\tin $GIT_DIR/info/sparse-checkout. This option ignores\n+\tthe sparse patterns and adds back any files in <paths>.\n+\n -m::\n --merge::\n \tWhen switching branches,\ndiff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt\nindex f0eef76..817337f 100644\n--- a/Documentation/gitrepository-layout.txt\n+++ b/Documentation/gitrepository-layout.txt\n@@ -184,6 +184,10 @@ info/exclude::\n \t'git clean' look at it but the core Git commands do not look\n \tat it.  See also: linkgit:gitignore[5].\n \n+info/sparse-checkout::\n+\tThis file stores sparse checkout patterns.\n+\tSee also: linkgit:git-read-tree[1].\n+\n remotes::\n \tStores shorthands for URL and default refnames for use\n \twhen interacting with remote repositories via 'git fetch',\ndiff --git a/builtin/checkout.c b/builtin/checkout.c\nindex f8033f4..4ed1ee7 100644\n--- a/builtin/checkout.c\n+++ b/builtin/checkout.c\n@@ -35,6 +35,7 @@ struct checkout_opts {\n \tint force_detach;\n \tint writeout_stage;\n \tint overwrite_ignore;\n+\tint ignore_skipworktree;\n \n \tconst char *new_branch;\n \tconst char *new_branch_force;\n@@ -278,6 +279,8 @@ static int checkout_paths(const struct checkout_opts *opts,\n \tfor (pos = 0; pos < active_nr; pos++) {\n \t\tstruct cache_entry *ce = active_cache[pos];\n \t\tce->ce_flags &= ~CE_MATCHED;\n+\t\tif (!opts->ignore_skipworktree && ce_skip_worktree(ce))\n+\t\t\tcontinue;\n \t\tif (opts->source_tree && !(ce->ce_flags & CE_UPDATE))\n \t\t\t/*\n \t\t\t * \"git checkout tree-ish -- path\", but this entry\n@@ -1058,6 +1061,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)\n \t\tOPT_STRING(0, \"conflict\", &conflict_style, N_(\"style\"),\n \t\t\t   N_(\"conflict style (merge or diff3)\")),\n \t\tOPT_BOOLEAN('p', \"patch\", &opts.patch_mode, N_(\"select hunks interactively\")),\n+\t\tOPT_BOOL(0, \"ignore-skip-worktree-bits\", &opts.ignore_skipworktree,\n+\t\t\t N_(\"do not limit pathspecs to sparse entries only\")),\n \t\t{ OPTION_BOOLEAN, 0, \"guess\", &dwim_new_local_branch, NULL,\n \t\t  N_(\"second guess 'git checkout no-such-branch'\"),\n \t\t  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },\ndiff --git a/t/t1011-read-tree-sparse-checkout.sh b/t/t1011-read-tree-sparse-checkout.sh\nindex 5c0053a..0c74bee 100755\n--- a/t/t1011-read-tree-sparse-checkout.sh\n+++ b/t/t1011-read-tree-sparse-checkout.sh\n@@ -250,4 +250,28 @@ EOF\n \ttest_cmp expected actual\n '\n \n+test_expect_success 'checkout without --ignore-skip-worktree-bits' '\n+\techo \"*\" >.git/info/sparse-checkout &&\n+\tgit checkout -f top &&\n+\ttest_path_is_file init.t &&\n+\techo sub >.git/info/sparse-checkout &&\n+\tgit checkout &&\n+\techo modified >> sub/added &&\n+\tgit checkout . &&\n+\ttest_path_is_missing init.t &&\n+\tgit diff --exit-code HEAD\n+'\n+\n+test_expect_success 'checkout with --ignore-skip-worktree-bits' '\n+\techo \"*\" >.git/info/sparse-checkout &&\n+\tgit checkout -f top &&\n+\ttest_path_is_file init.t &&\n+\techo sub >.git/info/sparse-checkout &&\n+\tgit checkout &&\n+\techo modified >> sub/added &&\n+\tgit checkout --ignore-skip-worktree-bits . &&\n+\ttest_path_is_file init.t &&\n+\tgit diff --exit-code HEAD\n+'\n+\n test_done\ndiff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh\nindex efb7ebc..2d274bf 100755\n--- a/t/t3001-ls-files-others-exclude.sh\n+++ b/t/t3001-ls-files-others-exclude.sh\n@@ -103,7 +103,7 @@ test_expect_success \\\n      test_cmp expect output'\n \n test_expect_success 'restore gitignore' '\n-\tgit checkout $allignores &&\n+\tgit checkout --ignore-skip-worktree-bits $allignores &&\n \trm .git/index\n '\n \n-- \n1.8.2.82.gc24b958\n"},{"id":"217324","messageId":"1368523634.10814.3.camel@vpl-thinkpad10","threadId":"33254","inReplyTo":"1365808328-4191-1-git-send-email-pclouds@gmail.com","subject":"Re: [PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode","fromName":"Müller Kirill","fromEmail":"kirill.mueller@ivt.baug.ethz.ch","sentAt":"2013-05-14T09:27:14Z","receivedAt":"2013-05-14T09:27:14Z","isPatch":true,"sender":{"key":"kirill.mueller@ivt.baug.ethz.ch","avatar":"https://gravatar.com/avatar/4c2dbe6c5c7127b6b98e59fce2df9fcc115cd04be4ff635b25a76a9ef881e5e7?d=mp&s=160"},"body":"Thank you, this looks nice. What needs to be done that this will\neventually reach the git in my favorite distribution? Which version of\nGit will this be?\n\n\nCheers\n\nKirill\n\n\nOn Sat, 2013-04-13 at 09:12 +1000, Nguyễn Thái Ngọc Duy wrote:\n> \"git checkout -- <paths>\" is usually used to restore all modified\n> files in <paths>. In sparse checkout mode, this command is overloaded\n> with another meaning: to add back all files in <paths> that are\n> excluded by sparse patterns.\n> \n> As the former makes more sense for day-to-day use. Switch it to the\n> default and the latter enabled with --ignore-skip-worktree-bits.\n\n"},{"id":"217325","messageId":"CACsJy8CzOrnofz6eWLN61axrdTubnLfWnYxWPZSMrsBgu594_A@mail.gmail.com","threadId":"33254","inReplyTo":"1368523634.10814.3.camel@vpl-thinkpad10","subject":"Re: [PATCH v3] checkout: add --ignore-skip-worktree-bits in sparse checkout mode","fromName":"Duy Nguyen","fromEmail":"pclouds@gmail.com","sentAt":"2013-05-14T10:21:42Z","receivedAt":"2013-05-14T10:21:42Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"On Tue, May 14, 2013 at 4:27 PM, Müller  Kirill\n<kirill.mueller@ivt.baug.ethz.ch> wrote:\n> Thank you, this looks nice. What needs to be done that this will\n> eventually reach the git in my favorite distribution? Which version of\n> Git will this be?\n\nIt'll be in the upcoming 1.8.3.\n--\nDuy\n"}]}