{"thread":{"id":"18228","subject":"git-p4 workflow suggestions?","startedAt":"2009-03-09T14:21:08Z","lastAt":"2009-03-20T10:31:25Z","messageCount":8,"participants":["Sam Hocevar","Christian Couder","Pete Wyckoff"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"107458","messageId":"20090309142108.GK12880@zoy.org","threadId":"18228","inReplyTo":null,"subject":"git-p4 workflow suggestions?","fromName":"Sam Hocevar","fromEmail":"sam@zoy.org","sentAt":"2009-03-09T14:21:08Z","receivedAt":"2009-03-09T14:21:08Z","isPatch":false,"sender":{"key":"sam@zoy.org","avatar":"https://gravatar.com/avatar/1fc1e5d8c3a8d737f14572135671adfbc0e61ffba5c3bc1d1b8a6f4aac764470?d=mp&s=160"},"body":"   Dear list,\n\n   I have modified git and git-p4 to a point where they are usable in\nmy work environment. I am now faced with a new problem: Perforce's\ncomposite workspaces. They allow you to \"mount\" parts of the repo onto\nother directories, even nonempty ones.\n\n   Take the following example repository, where a \"framework\" project\ncontains an example subdirectory with build files and other directories,\nand a \"project1\" project contains subdirectories that are meant to\nreplace the ones in \"example\":\n\n   //work/framework/example/src/\n                           /include/\n\t\t\t   /Makefile\n\t\t\t   /...\n   //work/project1/src/\n                  /include/\n\n   Using the Perforce client, one can reorganise the workspace\nso that project1/src/ transparently replaces the contents of\nframework/example/src/ (same for */include). All the work is then done\nin the framework/ local checkout, but commits may also affect project1/.\n\n   I could not find a way to do the same with git and git-p4. My main\nrequirements are the following:\n\n   - preserve the atomicity of commits affecting both project1/src and\n   project1/include (having to commit from a different directory due to\n   symlink hacks is acceptable to me, even if not terribly practical)\n\n   - have git-p4 rebase work without requiring tedious merges\n\n   - *if possible* (but not a strong requirement), preserve the\n   atomicity of commits affecting both framework/ and project1/.\n\n   If anyone ever ran into the problem, I'd like to hear from their\nexperience. Or maybe someone will have suggestions based on similar\nrequirements.\n\nCheers,\n-- \nSam.\n"},{"id":"107548","messageId":"200903100815.53847.chriscool@tuxfamily.org","threadId":"18228","inReplyTo":"20090309142108.GK12880@zoy.org","subject":"Re: git-p4 workflow suggestions?","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2009-03-10T07:15:53Z","receivedAt":"2009-03-10T07:15:53Z","isPatch":false,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"Hi Sam,\n\nLe lundi 9 mars 2009, Sam Hocevar a écrit :\n>    Dear list,\n>\n>    I have modified git and git-p4 to a point where they are usable in\n> my work environment. I am now faced with a new problem: Perforce's\n> composite workspaces. They allow you to \"mount\" parts of the repo onto\n> other directories, even nonempty ones.\n\nIt looks like SVN externals. So I think you should read about \"git \nsubmodule\".\n\nThere is this related link on the wiki:\n\nhttp://blog.alieniloquent.com/2008/03/08/git-svn-with-svnexternals/\n\nYou may also want to search the mailing list as this subject has often been \ndiscussed.\n\nBest regards,\nChristian.\n"},{"id":"299095","messageId":"20090310095729.GA27280@zoy.org","threadId":"18228","inReplyTo":"200903100815.53847.chriscool@tuxfamily.org","subject":"Re: git-p4 workflow suggestions?","fromName":"Sam Hocevar","fromEmail":"sam@zoy.org","sentAt":"2009-03-10T09:57:29Z","receivedAt":"2009-03-10T09:57:29Z","isPatch":false,"sender":{"key":"sam@zoy.org","avatar":"https://gravatar.com/avatar/1fc1e5d8c3a8d737f14572135671adfbc0e61ffba5c3bc1d1b8a6f4aac764470?d=mp&s=160"},"body":"On Tue, Mar 10, 2009, Christian Couder wrote:\n> >    I have modified git and git-p4 to a point where they are usable in\n> > my work environment. I am now faced with a new problem: Perforce's\n> > composite workspaces. They allow you to \"mount\" parts of the repo onto\n> > other directories, even nonempty ones.\n> \n> It looks like SVN externals. So I think you should read about \"git \n> submodule\".\n> \n> There is this related link on the wiki:\n> \n> http://blog.alieniloquent.com/2008/03/08/git-svn-with-svnexternals/\n\n   Unfortunately submodules are considered separate repositories, so if\nI have /include and /src as submodules, I cannot commit atomically to\nboth. Or can I? That's probably my strongest requirement.\n\n> You may also want to search the mailing list as this subject has often been \n> discussed.\n\n   I did skim through the archives, but couldn't find much. There was\nthis discussion: http://kerneltrap.org/mailarchive/git/2006/11/28/231515\nwhere the idea of Perforce-like workspaces was apparently dismissed as\nbeing \"a mess\".\n\nCheers,\n-- \nSam.\n"},{"id":"107651","messageId":"200903110803.12736.chriscool@tuxfamily.org","threadId":"18228","inReplyTo":"20090310095729.GA27280@zoy.org","subject":"Re: git-p4 workflow suggestions?","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2009-03-11T07:03:12Z","receivedAt":"2009-03-11T07:03:12Z","isPatch":false,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"Le mardi 10 mars 2009, Sam Hocevar a écrit :\n> On Tue, Mar 10, 2009, Christian Couder wrote:\n> > >    I have modified git and git-p4 to a point where they are usable in\n> > > my work environment. I am now faced with a new problem: Perforce's\n> > > composite workspaces. They allow you to \"mount\" parts of the repo\n> > > onto other directories, even nonempty ones.\n> >\n> > It looks like SVN externals. So I think you should read about \"git\n> > submodule\".\n> >\n> > There is this related link on the wiki:\n> >\n> > http://blog.alieniloquent.com/2008/03/08/git-svn-with-svnexternals/\n>\n>    Unfortunately submodules are considered separate repositories, so if\n> I have /include and /src as submodules, I cannot commit atomically to\n> both. Or can I? That's probably my strongest requirement.\n\nI thought that you can commit in /include then in /src and then in the \nsupermodule. This way you should have an atomic commit in the supermodule \nwith both changes. But I don't know much about submodules.\n\n> > You may also want to search the mailing list as this subject has often\n> > been discussed.\n>\n>    I did skim through the archives, but couldn't find much. There was\n> this discussion: http://kerneltrap.org/mailarchive/git/2006/11/28/231515\n> where the idea of Perforce-like workspaces was apparently dismissed as\n> being \"a mess\".\n\nPerhaps. Anyway I think there are patches about submodules quite often on \nthe list and it seems a hot topic as there is an entry on the GSoC2009 idea \npage:\n\nhttp://git.or.cz/gitwiki/SoC2009Ideas\n\nOn this page you may also be interested by the \"Narrow and Sparse clone \nsupport\" idea.\n\nBest regards,\nChristian.\n\nPS: it would be nice to put me in the CC header of your emails when you \nreply to me.\n"},{"id":"107684","messageId":"20090311125805.GA28155@padd.com","threadId":"18228","inReplyTo":"20090309142108.GK12880@zoy.org","subject":"Re: git-p4 workflow suggestions?","fromName":"Pete Wyckoff","fromEmail":"pw@padd.com","sentAt":"2009-03-11T12:58:05Z","receivedAt":"2009-03-11T12:58:05Z","isPatch":false,"sender":{"key":"pw@padd.com","avatar":null},"body":"sam@zoy.org wrote on Mon, 09 Mar 2009 15:21 +0100:\n>    I have modified git and git-p4 to a point where they are usable in\n> my work environment. I am now faced with a new problem: Perforce's\n> composite workspaces. They allow you to \"mount\" parts of the repo onto\n> other directories, even nonempty ones.\n> \n>    Take the following example repository, where a \"framework\" project\n> contains an example subdirectory with build files and other directories,\n> and a \"project1\" project contains subdirectories that are meant to\n> replace the ones in \"example\":\n> \n>    //work/framework/example/src/\n>                            /include/\n> \t\t\t   /Makefile\n> \t\t\t   /...\n>    //work/project1/src/\n>                   /include/\n\nIn perforce terms, your \"view mapping\" looks like:\n\n    //work/framework/example/src/... //client/src/...\n    //work/project1/src/include/...  //client/src/include/...\n\n?\n\nI'm not a pro with p4, but do deal with many-line mappings like\nthis.  Stock git-p4 handles these, except doesn't map correctly to\nthe right-hand side.  I haven't tried to see if it would correctly\nuse the include files from project1 instead of framework in your\nexample.\n\nIf you can get git-p4 to figure out the mapping correctly, I don't\nexpect any problems with respect to atomicity of commits.  As far as\nperforce goes, a server seems to manage its entire p4 space as one\nbig single project.  Similarly with the git side of things---it's\njust a matter of getting this mapping correct.\n\nI too hacked the getClientSpec() part of git-p4 to put files into\nthe correct directories in the git side.  My changes are a bit\nmessy, and may interfere with other usage models, hence not\nsubmitted.  Maybe we should make an effort to get this right though.\nDo you have any changes to show how you are modifying things?\n\n\t\t-- Pete\n"},{"id":"108106","messageId":"20090316180108.GE27280@zoy.org","threadId":"18228","inReplyTo":"20090311125805.GA28155@padd.com","subject":"Re: git-p4 workflow suggestions?","fromName":"Sam Hocevar","fromEmail":"sam@zoy.org","sentAt":"2009-03-16T18:01:09Z","receivedAt":"2009-03-16T18:01:09Z","isPatch":false,"sender":{"key":"sam@zoy.org","avatar":"https://gravatar.com/avatar/1fc1e5d8c3a8d737f14572135671adfbc0e61ffba5c3bc1d1b8a6f4aac764470?d=mp&s=160"},"body":"On Wed, Mar 11, 2009, Pete Wyckoff wrote:\n> sam@zoy.org wrote on Mon, 09 Mar 2009 15:21 +0100:\n> >    I have modified git and git-p4 to a point where they are usable in\n> > my work environment. I am now faced with a new problem: Perforce's\n> > composite workspaces. They allow you to \"mount\" parts of the repo onto\n> > other directories, even nonempty ones.\n> > \n> >    Take the following example repository, where a \"framework\" project\n> > contains an example subdirectory with build files and other directories,\n> > and a \"project1\" project contains subdirectories that are meant to\n> > replace the ones in \"example\":\n> > \n> >    //work/framework/example/src/\n> >                            /include/\n> > \t\t\t   /Makefile\n> > \t\t\t   /...\n> >    //work/project1/src/\n> >                   /include/\n> \n> In perforce terms, your \"view mapping\" looks like:\n> \n>     //work/framework/example/src/... //client/src/...\n>     //work/project1/src/include/...  //client/src/include/...\n\n   Yes, like this. More precisely:\n\n    //work/framework/example/... //client/...\n    //work/project1/src/...  //client/src/...\n    //work/project1/include/...  //client/include/...\n\n> I'm not a pro with p4, but do deal with many-line mappings like\n> this.  Stock git-p4 handles these, except doesn't map correctly to\n> the right-hand side.  I haven't tried to see if it would correctly\n> use the include files from project1 instead of framework in your\n> example.\n\n   No luck here. If I clone //work with git-p4, I get two separate\n/framework and /project1 directories, and the mapping is not done.\n\n   The \"solution\" I found so far was to clone //work and hack git-p4\nso that it ignores //work/framework/example/src, and then symlink\n//work/project1/src to //work/framework/example/src. This allows me to\npull changes with a single \"git-p4 rebase\" command. Unfortunately it\nalso requires me to clone a full, separate //work p4 workspace in order\nto use \"git-p4 submit\" later, and that's more than 120 GiB wasted.\n\n> If you can get git-p4 to figure out the mapping correctly, I don't\n> expect any problems with respect to atomicity of commits.  As far as\n> perforce goes, a server seems to manage its entire p4 space as one\n> big single project.  Similarly with the git side of things---it's\n> just a matter of getting this mapping correct.\n> \n> I too hacked the getClientSpec() part of git-p4 to put files into\n> the correct directories in the git side.  My changes are a bit\n> messy, and may interfere with other usage models, hence not\n> submitted.  Maybe we should make an effort to get this right though.\n> Do you have any changes to show how you are modifying things?\n\n   I'm curious to see your changes. I don't feel I completely understand\nthe p4 way to do things yet.\n\n   My changes are extremely messy but I will refactor them as time goes.\nThere is at least one other important thing my git-p4 does, which is not\nstoring the whole commit in memory. Combined with the patches I sent\nlast week to this list, it's the only way I can import the p4 repository\nwe have at work. (See http://zoy.org/~sam/git/clumsily-hacked-git-p4)\n\n   Feel free to contact me in private if you have questions or want\ninformation that may not be mailing-list relevant. I'm all for cleaning\nup things and getting a fully featured git-p4. I'm on that project for\nat least three years, and there is absolutely no way my blood pressure\ncan stand that long with Perforce.\n\nCheers,\n-- \nSam.\n"},{"id":"108234","messageId":"20090317151815.GA2451@padd.com","threadId":"18228","inReplyTo":"20090316180108.GE27280@zoy.org","subject":"Re: git-p4 workflow suggestions?","fromName":"Pete Wyckoff","fromEmail":"pw@padd.com","sentAt":"2009-03-17T15:18:15Z","receivedAt":"2009-03-17T15:18:15Z","isPatch":false,"sender":{"key":"pw@padd.com","avatar":null},"body":"sam@zoy.org wrote on Mon, 16 Mar 2009 19:01 +0100:\n>    Yes, like this. More precisely:\n> \n>     //work/framework/example/... //client/...\n>     //work/project1/src/...  //client/src/...\n>     //work/project1/include/...  //client/include/...\n[..]\n>    My changes are extremely messy but I will refactor them as time goes.\n> There is at least one other important thing my git-p4 does, which is not\n> storing the whole commit in memory. Combined with the patches I sent\n> last week to this list, it's the only way I can import the p4 repository\n> we have at work. (See http://zoy.org/~sam/git/clumsily-hacked-git-p4)\n\nOh, that is, ahem, a bit site-specific.  The looping over chunks in\nthe import phase is important, and other people have been thinking\nabout that.  I'll ignore that aspect for now, though, and we'll see\nif we can get the client-spec part worked out.\n\nCan you take a look at the attached.  Its goal is purely to allow\nyou to clone a complex spec like yours above.  You may have to merge\nthis in with your perrformance changes.\n\nEdit your ~/.gitconfig to add a section:\n\n\t[git-p4]\n\t\tuseClientSpec = true\n\nThen copy a good P4ENV from a p4 client that has a client spec\nchecked out as you like.  git-p4 clone will do \"p4 client -o\",\nreading that spec, and use the results to import, hopefully as\nyou have things laid out in the spec.\n\nIf this seems to work for you, we can figure out how to clean up\nthe patch so it can be used generally by people with and without\nclient specs.\n\n\t\t-- Pete\n\n---------\nFrom 4a922efcef18e3bb740f88c31ed4d00fa66f4cce Mon Sep 17 00:00:00 2001\nFrom: Pete Wyckoff <petew@netapp.com>\nDate: Wed, 26 Nov 2008 12:28:09 -0500\nSubject: [PATCH] honor git client spec\n\nDestination directories for parts of the depot are specified in the\nclient spec.  Use them as given.  Also read the entire client spec to\nfigure out what to do.\n---\n contrib/fast-import/git-p4 |  110 ++++++++++++++++++++++++++++++++++---------\n 1 files changed, 87 insertions(+), 23 deletions(-)\n\ndiff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4\nindex 332c7f8..d953a1e 100755\n--- a/contrib/fast-import/git-p4\n+++ b/contrib/fast-import/git-p4\n@@ -451,6 +451,26 @@ def p4ChangesForPaths(depotPaths, changeRange):\n     changelist.sort()\n     return changelist\n \n+#\n+# Sort by number of slashes first:  more specific at the top.  Then\n+# sort by alpha within a given number of path components.\n+#\n+def clientSortFunc(a, b):\n+    asrc = a[0]\n+    bsrc = b[0]\n+    asrclen = asrc.count(\"/\")\n+    bsrclen = bsrc.count(\"/\")\n+    if asrclen > bsrclen:\n+\treturn -1\n+    elif asrclen < bsrclen:\n+\treturn 1\n+    elif asrc > bsrc:\n+\treturn 1\n+    elif asrc < bsrc:\n+\treturn -1\n+    else:\n+\treturn 0\n+\n class Command:\n     def __init__(self):\n         self.usage = \"usage: %prog [options]\"\n@@ -959,8 +979,9 @@ class P4Sync(Command):\n             includeFile = True\n             for val in self.clientSpecDirs:\n                 if f['path'].startswith(val[0]):\n-                    if val[1] <= 0:\n+                    if val[1] == '-':\n                         includeFile = False\n+\t\t    f['pathmap'] = val\n                     break\n \n             if includeFile:\n@@ -1056,7 +1077,12 @@ class P4Sync(Command):\n                 print \"\\nfile %s is a strange apple file that forks. Ignoring!\" % file['path']\n                 continue\n \n-            relPath = self.stripRepoPath(file['path'], branchPrefixes)\n+\t    if 'pathmap' in file:\n+\t\trelPath = file['pathmap'][1] + file['path'][len(file['pathmap'][0]):]\n+\t    else:\n+\t\trelPath = self.stripRepoPath(file['path'], branchPrefixes)\n+\n+\t    print \"path\", file['path'], \"->\", relPath\n             if file[\"action\"] in (\"delete\", \"purge\"):\n                 self.gitStream.write(\"D %s\\n\" % relPath)\n             else:\n@@ -1439,24 +1465,54 @@ class P4Sync(Command):\n \n \n     def getClientSpec(self):\n-        specList = p4CmdList( \"client -o\" )\n+        specList = p4CmdList(\"client -o\")\n         temp = {}\n+\tclient = \"\"\n+        for entry in specList:\n+            for k,v in entry.iteritems():\n+\t\tif k.startswith(\"Client\"):\n+\t\t    client = v\n+\t\t    print \"client is\", client\n+\tif not client:\n+\t    sys.stderr.write(\"no client found\\n\")\n+\t    sys.exit(1)\n+\tclient = \"//\" + client + \"/\"\n         for entry in specList:\n             for k,v in entry.iteritems():\n                 if k.startswith(\"View\"):\n-                    if v.startswith('\"'):\n-                        start = 1\n-                    else:\n-                        start = 0\n-                    index = v.find(\"...\")\n-                    v = v[start:index]\n-                    if v.startswith(\"-\"):\n-                        v = v[1:]\n-                        temp[v] = -len(v)\n-                    else:\n-                        temp[v] = len(v)\n-        self.clientSpecDirs = temp.items()\n-        self.clientSpecDirs.sort( lambda x, y: abs( y[1] ) - abs( x[1] ) )\n+\t\t    if v.startswith('\"'):\n+\t\t\tv = v[1:]\n+\t\t    if v.endswith('\"'):\n+\t\t\tv = v[:-1]\n+\t\t    d = v.split(\" \");\n+\t\t    if len(d) != 2:\n+\t\t\tsys.stderr.write( \\\n+\t\t\t    \"expecting two fields in view, got: %s\\n\" % v)\n+\t\t\tsys.exit(1)\n+\t\t    if not d[0].endswith(\"...\"):\n+\t\t\tsys.stderr.write(\\\n+\t\t\t    \"expecting trailing ..., got: %s\\n\" % d[0])\n+\t\t\tsys.exit(1)\n+\t\t    d[0] = d[0][:-3]\n+\t\t    if not d[1].endswith(\"...\"):\n+\t\t\tsys.stderr.write(\\\n+\t\t\t    \"expecting trailing ..., got: %s\\n\" % d[1])\n+\t\t\tsys.exit(1)\n+\t\t    d[1] = d[1][:-3]\n+\t\t    if not d[1].startswith(client):\n+\t\t\tsys.stderr.write(\\\n+\t\t\t    \"expecting dest to start with %s, got: %s\\n\" % \\\n+\t\t\t    (client, d[1]))\n+\t\t\tsys.exit(1)\n+\t\t    d[1] = d[1][len(client):]\n+\t\t    # negated items do not appear in tree\n+\t\t    if d[0].startswith(\"-\"):\n+\t\t\td[0] = d[0][1:]\n+\t\t\td[1] = \"\"\n+\t\t    temp[d[0]] = d[1]\n+\n+\tself.clientSpecDirs = temp.items()\n+\tself.clientSpecDirs.sort(clientSortFunc)\n \n     def run(self, args):\n         self.depotPaths = []\n@@ -1718,7 +1774,7 @@ class P4Clone(P4Sync):\n     def __init__(self):\n         P4Sync.__init__(self)\n         self.description = \"Creates a new git repository and imports from Perforce into it\"\n-        self.usage = \"usage: %prog [options] //depot/path[@revRange]\"\n+        self.usage = \"usage: %prog [options] [//depot/path[@revRange]]\"\n         self.options += [\n             optparse.make_option(\"--destination\", dest=\"cloneDestination\",\n                                  action='store', default=None,\n@@ -1746,18 +1802,26 @@ class P4Clone(P4Sync):\n         return os.path.split(depotDir)[1]\n \n     def run(self, args):\n-        if len(args) < 1:\n-            return False\n-\n         if self.keepRepoPath and not self.cloneDestination:\n             sys.stderr.write(\"Must specify destination for --keep-path\\n\")\n             sys.exit(1)\n \n         depotPaths = args\n \n-        if not self.cloneDestination and len(depotPaths) > 1:\n-            self.cloneDestination = depotPaths[-1]\n-            depotPaths = depotPaths[:-1]\n+\tif gitConfig(\"git-p4.useclientspec\") == \"true\":\n+\t    if not os.path.exists(\"P4ENV\"):\n+\t\tsys.stderr.write(\"Must copy P4ENV file from a valid client\\n\")\n+\t\tsys.exit(1)\n+\t    self.getClientSpec()\n+\t    if not depotPaths:\n+\t\tdepotPaths = [p[0] for p in self.clientSpecDirs]\n+\telse:\n+\t    if not depotPaths:\n+\t\tsys.stderr.write(\"Must specify depot path if no client spec\\n\")\n+\t\tsys.exit(1)\n+\n+        if not self.cloneDestination:\n+\t\tself.cloneDestination = \".\"\n \n         self.cloneExclude = [\"/\"+p for p in self.cloneExclude]\n         for p in depotPaths:\n-- \n1.6.0.6\n"},{"id":"108692","messageId":"20090320103125.GP27280@zoy.org","threadId":"18228","inReplyTo":"20090317151815.GA2451@padd.com","subject":"Re: git-p4 workflow suggestions?","fromName":"Sam Hocevar","fromEmail":"sam@zoy.org","sentAt":"2009-03-20T10:31:25Z","receivedAt":"2009-03-20T10:31:25Z","isPatch":false,"sender":{"key":"sam@zoy.org","avatar":"https://gravatar.com/avatar/1fc1e5d8c3a8d737f14572135671adfbc0e61ffba5c3bc1d1b8a6f4aac764470?d=mp&s=160"},"body":"On Tue, Mar 17, 2009, Pete Wyckoff wrote:\n\n> Can you take a look at the attached.  Its goal is purely to allow\n> you to clone a complex spec like yours above.  You may have to merge\n> this in with your perrformance changes.\n> \n> Edit your ~/.gitconfig to add a section:\n> \n> \t[git-p4]\n> \t\tuseClientSpec = true\n> \n> Then copy a good P4ENV from a p4 client that has a client spec\n> checked out as you like.  git-p4 clone will do \"p4 client -o\",\n> reading that spec, and use the results to import, hopefully as\n> you have things laid out in the spec.\n> \n> If this seems to work for you, we can figure out how to clean up\n> the patch so it can be used generally by people with and without\n> client specs.\n\n   I am afraid I don't know what a \"P4ENV\" is. However, our P4\nrepository is set up in such a way that \"p4 client -o\" shows the\nexpected mappings, so I just commented out the P4ENV check and I finally\nmanaged to clone my gigantic repository.\n\n   One concern: git-p4 clone creates .git in the current directory and\nit caused me to do at least one unfortunate \"rm -rf .git\". I would\nexpect clone to create a subdirectory.\n\n   Apart from that, \"clone\" seems to work rather well. I haven't tried\nto submit a commit yet, though.\n\n-- \nSam.\n"}]}