Exporting a Git History at a Specific Commit
I had a need today to take an existing git repo that has commits, and move the history as of one of those commits into a different git repo.
So my two requirements were:
- Show the content as of
.gitrepo or any ignored files in the export
It took a few minutes to find the right incantation so I thought I’d blog it here mostly for my future self. Maybe it will help someone else out there.
We start by finding the sha that we want to export:
~/projects/repo $ git log --oneline f8de9f7 (HEAD -> master) execute shell commands and capture output d3a8363 Add Files package 5b9242d Initial command line setup
I’m interested in the first commit,
We can run
git archive to get an archive of the repo in a given format. The available formats can be listed:
~/projects/repo $ git archive -l tar tgz tar.gz zip
I don’t need any compression, so
tar will do, and this happens to be the default. If you want to specify a format you can do so with
So we start by exporting into a tar file, whose filename is specified with the
~/projects/repo $ git archive -o git.tar 5b9242d
Now I have the tar file, I can go to the destination folder and untar it:
~/projects/other $ tar xvf ~/projects/repo/git.tar x .gitignore x .nova/ x .nova/Tasks/ x .nova/Tasks/Swift Build.json x Package.resolved x Package.swift x README.md x Sources/ x Sources/swift-encode/ x Sources/swift-encode/main.swift x Tests/ x Tests/LinuxMain.swift x Tests/swift-encodeTests/ x Tests/swift-encodeTests/XCTestManifests.swift x Tests/swift-encodeTests/swift_encodeTests.swift
If there were files you didn’t want included in the destination folder, like the
.nova folder for instance, you can specify that in the untar step:
~/projects/other $ tar xvf ~/projects/repo/git.tar --exclude .nova
And if we want to combine these commands into one we can avoid the intermediary tar file:
~/projects/repo $ git archive 5b9242d | tar x --exclude .nova --directory ~/projects/other
I’m sure I’ll need to look this up again, but handy to know!