git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Checkout to different directory at certain commit without changing index

From
Ondra Medek <xmedeko@gmail.com>
Date
May 14, 2024, 06:29 UTC
Message-ID
<CAJsoDaHu1xgfwXHqOGgctQoi5Qb5D1aESeMvaVHaQV0zjyzRRg@mail.gmail.com>
In-Reply-To
<CAJsoDaFhTcm0fEw3+Ba4PvTjPYxscALeLN2kBgs4YYz8Bg-R7g@mail.gmail.com>
Hi Phillip,
your trick with different index file works with git checkout, too, e.g.

GIT_INDEX_FILE="$destdir"/.git git --work-tree="$destdir" checkout -f -q "$commit" -- ./ rm -f "$destdir"/.git

Sincerely Ondra

On Mon, 13 May 2024 at 19:23, Ondra Medek <xmedeko@gmail.com> wrote:
Show 87 quoted lines
>
> Hi Phillip,
>
> besides dependency on tar, I do not want to use git-archive because
> it's influenced by export-ignore and export-subst attributes, too (as
> I have mentioned).
>
> Thanks for git read-tree, seems it's exactly what I need. Just git
> read-tree has complained that -u switch needs -m or --reset switches.
> And I have simplified it to
>
> git --work-tree="$destdir" read-tree --index-output="$destdir".git -u
> --reset "$commit"
> rm -f "$destdir"/.git
>
> May I post this solution to the SO thread I have mentioned?
>
> Thanks very much
>
> Ondra
>
> On Mon, 13 May 2024 at 17:28, Phillip Wood <phillip.wood123@gmail.com> wrote:
> >
> > Hi Ondra
> >
> > On 13/05/2024 08:26, Ondra Medek wrote:
> > > Hello,
> > > I need a simple script for unskilled users to do a fast checkout (LFS
> > > friendly) of the current local Git clone at a certain commit to a
> > > different directory I.e. something like "copy at a point in history".
> >
> > I think using
> >
> >      git archive "$commit" --format=tar |
> >         { cd "$output_directory" && tar -xf -; }
> >
> > is probably the simplest solution. If you don't want to rely on tar then
> > something like
> >
> >      GIT_DIR="$(git rev-parse --path-format=absolute --git-dir)" &&
> >      GIT_COMMON_DIR="$(git rev-parse --path-format=absolute
> > --git-common-dir)" || exit
> >      GIT_INDEX_FILE="$GIT_DIR/tmp-index-$$"
> >      export GIT_DIR GIT_COMMON_DIR GIT_INDEX_FILE
> >      unset GIT_WORK_TREE
> >      mkdir "$output_directory" && cd "$output_directory" &&
> >      git read-tree -u "$commit"
> >      status=$?
> >      rm "$GIT_INDEX_FILE"
> >      exit $status
> >
> > Which uses a temporary index file should work (note I haven't tested
> > it). You may want to add "--recurse-submodules" and/or
> > "--no-sparse-checkout" to the "git read-tree" commandline.
> >
> > Best Wishes
> >
> > Phillip
> >
> > > IMO all possible solutions are summarized in this thread
> > > https://stackoverflow.com/questions/160608/do-a-git-export-like-svn-export
> > > I describe some of them with my remarks:
> > >
> > > - git checkout-index : works with HEAD only.
> > > - git archive: influenced by export-ignore and export-subst
> > > attributes, so may not produce exact copy of sources. (And needs tar).
> > > - git worktree add -d : needs cleanup: git prune or git remove.
> > > - git clone: Unfortunately, -b param cannot work with commit hash and
> > > does not respect local worktree settings (e.g. autocrlf). So, a
> > > solution may be a bit complicated: git clone -s -n . dest/path ; cp
> > > .git/config dest/path/.git ; cd dest/path ; git co -q <commit-ish> ;
> > > rm -rf .git
> > > - git checkout: Unfortunately, modifies Git index, so some action to
> > > revert index is necessary after: git --work-tree=/path/to/checkout/
> > > checkout -f -q <tree-ish> -- ./
> > >
> > > For me, the best solution is with git clone, because it does not
> > > modify Git index nor any source working tree settings, so no cleanup
> > > is necessary. But it's a bit complicated, though. It seems to me that
> > > "git checkout" could do this better and simpler if it would have some
> > > param to not modify the Git index. Is it possible to enhance git
> > > checkout? Or is there any other simple solution not mentioned in the
> > > SO thread?
> > >
> > > Thank you
> > > Ondra Medek
> > >
Previous: Ondra MedekNext: phillip.wood123@gmail.com
Message 4 of 7 in “Checkout to different directory at certain commit without changing index”
  1. Ondra MedekMay 13, 2024
  2. Phillip WoodMay 13, 2024
  3. Ondra MedekMay 13, 2024
  4. Ondra MedekMay 14, 2024
  5. phillip.wood123@gmail.comMay 14, 2024
  6. Ondra MedekMay 15, 2024
  7. phillip.wood123@gmail.comMay 14, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.