{"thread":{"id":"24483","subject":"question (possibly) on git subtree/submodules","startedAt":"2010-07-23T14:00:52Z","lastAt":"2010-07-28T13:42:20Z","messageCount":9,"participants":["Maurizio Vitale","Chris Packham","Jonathan Nieder","Alex","Jakub Narebski","Marc Branchaud","skillzero@gmail.com"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"146082","messageId":"xotjlj92i9gr.fsf@leonardo.pit.corp.google.com","threadId":"24483","inReplyTo":null,"subject":"question (possibly) on git subtree/submodules","fromName":"Maurizio Vitale","fromEmail":"mav@leonardo.pit.corp.google.com","sentAt":"2010-07-23T14:00:52Z","receivedAt":"2010-07-23T14:00:52Z","isPatch":false,"sender":{"key":"mav@leonardo.pit.corp.google.com","avatar":null},"body":"\nI'm new to git and have read the recent thread on subtree support.\nI'm not sure they (or git submodules) offer what I'm looking for.\nHere's the scenario:\n       - I have a large monolithic code base, all in my repository (e.g.\n         I don't need to link in external repositories, which is what I\n         understand submodules offer\n       - I'd like to be able to clone only a small fraction of the\n         repository (say an arbitrary directory or even a single file)\n         in order to make small changes\n       - these directories are not known when the full repository is set\n         up.\n       - commits to the part I've checked out should show in the history\n         of any clone that includes the part, up to the full repository\n       - ideally, I should be able to incrementally clone portions (e.g.\n         I've checked out path/dir_A and realize I need to modify\n         path/dir_B as well).\n         these additional clones should be in whatever branch I switched\n         to after the initial checkouts.\n\nAssuming the above makes any sense (in general or in git), is there\nanything in git that would help me doing what I'm looking for?\nThanks,\n\n        Maurizio \n\n       \n"},{"id":"146086","messageId":"4C49C9C6.3080409@gmail.com","threadId":"24483","inReplyTo":"xotjlj92i9gr.fsf@leonardo.pit.corp.google.com","subject":"Re: question (possibly) on git subtree/submodules","fromName":"Chris Packham","fromEmail":"judge.packham@gmail.com","sentAt":"2010-07-23T16:56:38Z","receivedAt":"2010-07-23T16:56:38Z","isPatch":false,"sender":{"key":"judge.packham@gmail.com","avatar":"https://avatars.githubusercontent.com/u/155667?v=4"},"body":"Hi,\n\nOn 23/07/10 07:00, Maurizio Vitale wrote:\n> \n> I'm new to git and have read the recent thread on subtree support.\n> I'm not sure they (or git submodules) offer what I'm looking for.\n> Here's the scenario:\n>        - I have a large monolithic code base, all in my repository (e.g.\n>          I don't need to link in external repositories, which is what I\n>          understand submodules offer\n>        - I'd like to be able to clone only a small fraction of the\n>          repository (say an arbitrary directory or even a single file)\n>          in order to make small changes\n>        - these directories are not known when the full repository is set\n>          up.\n>        - commits to the part I've checked out should show in the history\n>          of any clone that includes the part, up to the full repository\n>        - ideally, I should be able to incrementally clone portions (e.g.\n>          I've checked out path/dir_A and realize I need to modify\n>          path/dir_B as well).\n>          these additional clones should be in whatever branch I switched\n>          to after the initial checkouts.\n> \n> Assuming the above makes any sense (in general or in git), is there\n> anything in git that would help me doing what I'm looking for?\n> Thanks,\n> \n>         Maurizio \n\nThe short answer is no. Nothing git has currently will let you clone a\nsubset of files. Shallow clones exist if you want all the code and the\nlast X changes. The reason for this is git, like other DVCSes, tracks\n_changes_ rather than _files_ this is something that took me a while to\nget my head around when I was learning git.\n\nThe best advice I've seen is to actually take your repository and use\ngit filter-branch to create several smaller repositories (or depending\non your desire for retention of history just create new repos). You can\nthen use submodules or subtrees to stitch these back together into a\nsuper project to which you can add the smaller repositories as needed\n(note: I have never used subtrees so I'm not 100% sure if what I'm\nsaying applies to them) .\n\nWe use this model with submodules at $dayjob and it works quite well for us.\n"},{"id":"146093","messageId":"20100723171859.GG2507@burratino","threadId":"24483","inReplyTo":"4C49C9C6.3080409@gmail.com","subject":"Re: question (possibly) on git subtree/submodules","fromName":"Jonathan Nieder","fromEmail":"jrnieder@gmail.com","sentAt":"2010-07-23T17:18:59Z","receivedAt":"2010-07-23T17:18:59Z","isPatch":false,"sender":{"key":"jrnieder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/281595?v=4"},"body":"Chris Packham wrote:\n\n> The short answer is no. Nothing git has currently will let you clone a\n> subset of files. Shallow clones exist if you want all the code and the\n> last X changes. The reason for this is git, like other DVCSes, tracks\n> _changes_ rather than _files_ this is something that took me a while to\n> get my head around when I was learning git.\n\nNot quite as cut-and-dried as it may sound, I think.  Internally git\ncompresses blobs (and other objects) by comparing them to other ones,\nbut I do not think that is what you are talking about, and I do not\nsee what that has to do with partial clones.  In fact, the main reason\nI can see that partial clones (in the sense of getting all metadata\nbut not all blobs) are not implemented is that no one has written code\nfor it yet.\n\nHere is a thread on related work[1].  Maybe someone else can find a\nmore pertinent link.\n\n> The best advice I've seen is to actually take your repository and use\n> git filter-branch to create several smaller repositories\n\nRight, and this is what “git subtree” excels at.  It provides an\nalternative interface and implementation for “git filter-branch\n--subdirectory-filter”.\n\nHope that helps,\nJonathan\n\n[1] http://thread.gmane.org/gmane.comp.version-control.git/73117/focus=73935\n"},{"id":"146102","messageId":"4C49E0DE.8050506@gmail.com","threadId":"24483","inReplyTo":"20100723171859.GG2507@burratino","subject":"Re: question (possibly) on git subtree/submodules","fromName":"Chris Packham","fromEmail":"judge.packham@gmail.com","sentAt":"2010-07-23T18:35:10Z","receivedAt":"2010-07-23T18:35:10Z","isPatch":false,"sender":{"key":"judge.packham@gmail.com","avatar":"https://avatars.githubusercontent.com/u/155667?v=4"},"body":"On 23/07/10 10:18, Jonathan Nieder wrote:\n> Chris Packham wrote:\n> \n>> The short answer is no. Nothing git has currently will let you clone a\n>> subset of files. Shallow clones exist if you want all the code and the\n>> last X changes. The reason for this is git, like other DVCSes, tracks\n>> _changes_ rather than _files_ this is something that took me a while to\n>> get my head around when I was learning git.\n> \n> Not quite as cut-and-dried as it may sound, I think.  Internally git\n> compresses blobs (and other objects) by comparing them to other ones,\n> but I do not think that is what you are talking about, and I do not\n> see what that has to do with partial clones.  In fact, the main reason\n> I can see that partial clones (in the sense of getting all metadata\n> but not all blobs) are not implemented is that no one has written code\n> for it yet.\n> \n> Here is a thread on related work[1].  Maybe someone else can find a\n> more pertinent link.\n> \n\nOK I think I must have read to much into the \"tracks changes\" part,\nthanks for pointing it out.\n"},{"id":"146469","messageId":"loom.20100727T125434-697@post.gmane.org","threadId":"24483","inReplyTo":"4C49C9C6.3080409@gmail.com","subject":"Re: question (possibly) on git subtree/submodules","fromName":"Alex","fromEmail":"ajb44.geo@yahoo.com","sentAt":"2010-07-27T10:56:22Z","receivedAt":"2010-07-27T10:56:22Z","isPatch":false,"sender":{"key":"ajb44.geo@yahoo.com","avatar":null},"body":"Chris Packham <judge.packham <at> gmail.com> writes:\n\n> The short answer is no. Nothing git has currently will let you clone a\n> subset of files. \n\nIsn't that what 'sparse checkout' does?\n(http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout)\n\nAlex\n"},{"id":"146473","messageId":"m3bp9tks6e.fsf@localhost.localdomain","threadId":"24483","inReplyTo":"loom.20100727T125434-697@post.gmane.org","subject":"Re: question (possibly) on git subtree/submodules","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2010-07-27T12:48:09Z","receivedAt":"2010-07-27T12:48:09Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Alex <ajb44.geo@yahoo.com> writes:\n\n> Chris Packham <judge.packham <at> gmail.com> writes:\n> \n> > The short answer is no. Nothing git has currently will let you clone a\n> > subset of files. \n> \n> Isn't that what 'sparse checkout' does?\n> (http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout)\n\nNo, 'sparse checkout' is only about checkout, i.e. the working area.\nYou still have all objects in repository, only part of tree (part of\nproject / repository) is not checked out, not present on disk as\nfiles.\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"146480","messageId":"4C4EEC0D.2070105@xiplink.com","threadId":"24483","inReplyTo":"m3bp9tks6e.fsf@localhost.localdomain","subject":"RFC: Sparse checkout improvements (was: Re: question (possibly) on git subtree/submodules)","fromName":"Marc Branchaud","fromEmail":"marcnarc@xiplink.com","sentAt":"2010-07-27T14:24:13Z","receivedAt":"2010-07-27T14:24:13Z","isPatch":false,"sender":{"key":"marcnarc@xiplink.com","avatar":"https://avatars.githubusercontent.com/u/14980203?v=4"},"body":"On 10-07-27 08:48 AM, Jakub Narebski wrote:\n> Alex <ajb44.geo@yahoo.com> writes:\n> \n>> Chris Packham <judge.packham <at> gmail.com> writes:\n>>\n>>> The short answer is no. Nothing git has currently will let you clone a\n>>> subset of files. \n>>\n>> Isn't that what 'sparse checkout' does?\n>> (http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout)\n> \n> No, 'sparse checkout' is only about checkout, i.e. the working area.\n> You still have all objects in repository, only part of tree (part of\n> project / repository) is not checked out, not present on disk as\n> files.\n\nThere's no such thing as a \"sparse fetch\" but you can do something like\n\n\tgit clone -n git://there/foo.git\n\tcd foo\n\nthen\n\n\tgit checkout origin/<branch> -- <paths...>\n\nor\n\tgit config core.sparseCheckout true\n\t[ Add paths to .git/info/sparse-checkout ]\n\tgit checkout <branch>\n\n\nbut it's fairly inconvenient for day-to-day work.  Also, putting a\n.git/info/sparse-checkout file in a public repo seems of limited use.\n\nSo IMHO the current sparse-checkout feature is pretty bare-bones and could\nuse some meat.  Here's some thoughts:\n\n* What's missing is a way to define named collections of paths\n(\"sparse-sets?\") in .git/info/sparse-checkout, so that you can conveniently\ncheckout a particular subset of the working directory.  It would also be nice\nto switch between different sparse-sets.\n\n* It would also be good to have a way for a repo to define a default\nsparse-set, so that a clone would only checkout that default.\n\n* I also think that core.sparseCheckout should be true by default, and git\nshould impose no sparseness if .git/info/sparse-checkout is missing or empty.\n\nComments?\n\n\t\tM.\n"},{"id":"146492","messageId":"AANLkTimJpmGqOogQ1HtN0zu0=tPK0C0kQuEkg4PeOqUh@mail.gmail.com","threadId":"24483","inReplyTo":"4C4EEC0D.2070105@xiplink.com","subject":"Re: RFC: Sparse checkout improvements (was: Re: question (possibly) on git subtree/submodules)","fromName":"","fromEmail":"skillzero@gmail.com","sentAt":"2010-07-27T16:55:24Z","receivedAt":"2010-07-27T16:55:24Z","isPatch":false,"sender":{"key":"skillzero@gmail.com","avatar":null},"body":"On Tue, Jul 27, 2010 at 7:24 AM, Marc Branchaud <marcnarc@xiplink.com> wrote:\n\n> * What's missing is a way to define named collections of paths\n> (\"sparse-sets?\") in .git/info/sparse-checkout, so that you can conveniently\n> checkout a particular subset of the working directory.  It would also be nice\n> to switch between different sparse-sets.\n\nI pasted in a script I wrote to work with the sparse checkout feature.\nI'm not a scripting expert so it probably doesn't things incorrectly.\nIt lets you create \"modules\" by adding sections to .gitmodules file at\nthe root of the repository (or a file you specify). You can list them,\nswitch/checkout between them, or reset back to normal:\n\n[module \"MyApp1\"]\n\t<path1>\n\t<path2>\n\n$ git module list\nMyApp1\n\n$ git module checkout MyApp1\n\n$ git module reset\n\n> * It would also be good to have a way for a repo to define a default\n> sparse-set, so that a clone would only checkout that default.\n\nYes, this would be nice. Ideally what I would like is for there to be\na clone option to specify a \"module\" (what I've been calling sparse\nsets). A first step could just clone the full repository with -n then\ndo 'git module checkout <module>' (what my other scripts do to prepare\narchives). Ideally, it would do some work on the server side to only\nsend the objects needed for paths specified by the sparse set (but\nstill allow me to commit and later push changes back).\n\n-- \n\ngit-module script (email may mess up the spacing, causing things to\nnot line up, but you get the idea)\n\nuse Getopt::Long qw(:config gnu_getopt);\nuse File::Path;\n\nmy $gBranch\t\t\t= \"\";\nmy $gHelp\t\t\t= 0;\nmy $gModulesFile\t= \"\";\nmy $gModules\t\t= {};\nmy $gRecursive\t\t= 0;\n\n# Parse the command line.\nif( @ARGV < 1 ) { Usage(); }\nGetOptions(\n\t\"b|branch=s\"\t\t=> \\$gBranch,\n\t\"h|help\"\t\t\t=> \\$gHelp,\n\t\"f|modules-file=s\"\t=> \\$gModulesFile,\n\t\"r|recursive!\"\t\t=> \\$gRecursive,\n) or die( \"\\n\" );\nif( $gHelp ) { Usage(); }\n\nif( @ARGV < 1 ) { die( \"error: no command specified. See 'git module\nhelp'.\\n\" ); }\nmy $cmd = shift;\nif(    $cmd eq \"checkout\" )\t{ cmd_checkout(); }\nelsif( $cmd eq \"help\" )\t\t{ Usage(); }\nelsif( $cmd eq \"list\" )\t\t{ cmd_list(); }\nelsif( $cmd eq \"reset\" )\t{ cmd_reset(); }\nelse { die( \"error: unknown command '$cmd'. See 'git module help'.\\n\" ); }\n\n#\n# cmd_checkout\n#\nsub\tcmd_checkout\n{\n\tReadModulesFile();\n\tmy $moduleName = shift @ARGV;\n\tif( !$moduleName )\t\t\t\t{ die( \"error: no module name specified.\\n\" ); }\n\tif( !$gModules->{$moduleName} )\t{ die( \"error: module '$moduleName'\nnot found.\\n\" ); }\n\t\n\t# Enable sparse.\n\tmy $currentCmd = \"git config core.sparseCheckout true\";\n\tsystem( $currentCmd ) == 0 or die( \"error: '$currentCmd' $?.\\n\" );\n\t\n\t# Write the sparse patterns.\n\tmy $gitDir = `git rev-parse --git-dir`;\n\tif( $? != 0 ) { die( \"error: can't find git repository $?.\\n\" ); }\n\tchop( $gitDir );\n\tmy $sparsePath = $gitDir . \"/info/sparse-checkout\";\n\tif( $? != 0 ) { die( \"error: read git directory failed $?.\\n\" ); }\n\topen( FILE, \">\", $sparsePath ) or die( \"error: can't open '$sparsePath'.\\n\" );\n\tforeach( @{$gModules->{$moduleName}} )\n\t{\n\t\tprint( FILE \"$_\\n\" );\n\t}\n\tclose( FILE );\n\t\n\t# Checkout using the new sparse patterns.\n\tmy $currentCmd = \"git checkout $gBranch --\";\n\tsystem( $currentCmd ) == 0 or die( \"error: '$currentCmd' $?.\\n\" );\n}\n\n#\n# cmd_list\n#\nsub\tcmd_list\n{\n\tReadModulesFile();\n\tmy $moduleName = shift @ARGV;\n\tif( $moduleName eq \"\" )\n\t{\n\t\tif( $gRecursive )\n\t\t{\n\t\t\tforeach my $moduleName ( sort( keys %{$gModules} ) )\n\t\t\t{\n\t\t\t\tprint( \"$moduleName\\n\" );\n\t\t\t\tforeach( @{$gModules->{$moduleName}} )\n\t\t\t\t{\n\t\t\t\t\tprint( \"\\t$_\\n\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tforeach my $moduleName ( sort( keys %{$gModules} ) )\n\t\t\t{\n\t\t\t\tprint( \"$moduleName\\n\" );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif( !$gModules->{$moduleName} ) { die( \"module '$moduleName' not\nfound.\\n\" ); }\n\t\tforeach( @{$gModules->{$moduleName}} )\n\t\t{\n\t\t\tprint( \"$_\\n\" );\n\t\t}\n\t}\n}\n\n#\n# cmd_reset\n#\nsub\tcmd_reset\n{\n\t# Enable sparse.\n\tmy $currentCmd = \"git config core.sparseCheckout true\";\n\tsystem( $currentCmd ) == 0 or die( \"error: '$currentCmd' $?.\\n\" );\n\t\n\t# Write a special sparse pattern of \"*\" to mean everything.\n\tmy $gitDir = `git rev-parse --git-dir`;\n\tif( $? != 0 ) { die( \"error: can't find git repository $?.\\n\" ); }\n\tchop( $gitDir );\n\tmy $sparsePath = $gitDir . \"/info/sparse-checkout\";\n\tif( $? != 0 ) { die( \"error: read git directory failed $?.\\n\" ); }\n\topen( FILE, \">\", $sparsePath ) or die( \"error: can't open '$sparsePath'.\\n\" );\n\tprint( FILE \"*\\n\" );\n\tclose( FILE );\n\t\n\t# Checkout to clear the skip-worktree bits and checkout all entries.\n\tmy $currentCmd = \"git checkout $gBranch --\";\n\tsystem( $currentCmd ) == 0 or die( \"error: '$currentCmd' $?.\\n\" );\n\t\n\t# Disable sparse.\n\tmy $currentCmd = \"git config core.sparseCheckout false\";\n\tsystem( $currentCmd ) == 0 or die( \"error: '$currentCmd' $?.\\n\" );\n}\n\n#\n# ReadModulesFile\n#\nsub\tReadModulesFile\n{\n\tmy @lines = ();\n\tif( $gModulesFile eq \"\" )\t\t# No file means read from the .gitmodules\nfile in the repo.\n\t{\n\t\tif( $gBranch ne \"\" )\t{ @lines = `git show $gBranch:.gitmodules`;}\n\t\telse\t\t\t\t\t{ @lines = `git show HEAD:.gitmodules`; }\n\t\tif( $? != 0 )\t\t\t{ die( \"error: read .gitmodules file failed: $?.\\n\" ); }\n\t}\n\telsif( $gModulesFile eq \"-\" )\t# - means read from stdin.\n\t{\n\t\t@lines = <STDIN>;\n\t}\n\telse\n\t{\n\t\topen( FILE, $gModulesFile ) or die( \"error: can't open '$gModulesFile'.\\n\" );\n\t\t@lines = <FILE>;\n\t\tclose( FILE );\n\t}\n\tchomp( @lines );\n\t\n\tmy $isModule   = 0;\n\tmy $moduleName = \"\";\n\tforeach my $line ( @lines )\n\t{\n\t\t$line =~ s/^\\s+//; # Strip leading whitespace.\n\t\t$line =~ s/\\s+$//; # Strip trailing whitespace.\n\t\t$line =~ s/\\r//g;  # Strip CR's.\n\t\t$line =~ s/\\n//g;  # Strip LF's.\n\t\tif( $line =~ /\\s*\\[(.*?)\\]\\s*/ ) # Check for section header.\n\t\t{\n\t\t\t$moduleName = $1;\n\t\t\tif( $moduleName =~ /\\s*module\\s*\\\"(.*)\\\"/ )\n\t\t\t{\n\t\t\t\t$moduleName = $1;\n\t\t\t\t$isModule = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t$isModule = 0;\n\t\t\t}\n\t\t\tnext;\n\t\t}\n\t\tnext if !$isModule;\t\t\t# Skip entries that aren't in module sections.\n\t\tnext if $line =~ /^\\s*\\;/;\t# Skip lines beginning with ';'.\n\t\tnext if $line =~ /^\\s*\\#/;\t# Skip lines beginning with '#'.\n\t\tnext if length $line == 0;\t# Skip empty lines.\n\t\tpush( @{$gModules->{$moduleName}}, $line );\n\t}\n}\n\n#\n# Usage\n#\nsub\tUsage\n{\n\tprint( STDERR \"Usage: git-module [options] command [command options]\\n\" );\n\tprint( STDERR \"\\n\" );\n\tprint( STDERR \"Options:\\n\" );\n\tprint( STDERR \"    -b/--branch <name>          Branch to use.\\n\" );\n\tprint( STDERR \"    -f/--modules-file <file>    Custom modules file to\nuse.\\n\" );\n\tprint( STDERR \"\\n\" );\n\tprint( STDERR \"Commands:\\n\" );\n\tprint( STDERR \"    checkout <name>     Check out a module.\\n\" );\n\tprint( STDERR \"    list [-r] [name]    List module(s). -r lists\nmodules and patterns.\\n\" );\n\tprint( STDERR \"    reset               Reset to a non-sparse checkout.\\n\" );\n\tprint( STDERR \"\\n\" );\n\texit( 1 );\n}\n"},{"id":"146622","messageId":"4C5033BC.5020002@xiplink.com","threadId":"24483","inReplyTo":"AANLkTimJpmGqOogQ1HtN0zu0=tPK0C0kQuEkg4PeOqUh@mail.gmail.com","subject":"Re: RFC: Sparse checkout improvements","fromName":"Marc Branchaud","fromEmail":"marcnarc@xiplink.com","sentAt":"2010-07-28T13:42:20Z","receivedAt":"2010-07-28T13:42:20Z","isPatch":false,"sender":{"key":"marcnarc@xiplink.com","avatar":"https://avatars.githubusercontent.com/u/14980203?v=4"},"body":"On 10-07-27 12:55 PM, skillzero@gmail.com wrote:\n> On Tue, Jul 27, 2010 at 7:24 AM, Marc Branchaud <marcnarc@xiplink.com> wrote:\n> \n>> * What's missing is a way to define named collections of paths\n>> (\"sparse-sets?\") in .git/info/sparse-checkout, so that you can conveniently\n>> checkout a particular subset of the working directory.  It would also be nice\n>> to switch between different sparse-sets.\n> \n> I pasted in a script I wrote to work with the sparse checkout feature.\n> I'm not a scripting expert so it probably doesn't things incorrectly.\n> It lets you create \"modules\" by adding sections to .gitmodules file at\n> the root of the repository (or a file you specify). You can list them,\n> switch/checkout between them, or reset back to normal:\n\nThat script looks like a great proof-of-concept.  I haven't tried it out yet,\nbut it seems to work along the lines of what I was thinking about.\n\nI'd like to see most of this functionality folded into the standard git\ncommands, and maybe a new git-sparse command for managing sparse sets.\n\n> [module \"MyApp1\"]\n> \t<path1>\n> \t<path2>\n> \n> $ git module list\n> MyApp1\n> \n> $ git module checkout MyApp1\n> \n> $ git module reset\n> \n>> * It would also be good to have a way for a repo to define a default\n>> sparse-set, so that a clone would only checkout that default.\n> \n> Yes, this would be nice. Ideally what I would like is for there to be\n> a clone option to specify a \"module\" (what I've been calling sparse\n> sets). A first step could just clone the full repository with -n then\n> do 'git module checkout <module>' (what my other scripts do to prepare\n> archives).\n\nI'd really prefer to see it as a configuration option for the remote\nrepository.  Let the remote tell me what the initial sparse set should be.\n\n> Ideally, it would do some work on the server side to only\n> send the objects needed for paths specified by the sparse set (but\n> still allow me to commit and later push changes back).\n\nI'm less interested in sparse fetching, so I'll stay out of that side of the\nconversation.\n\n\t\tM.\n"}]}