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

making a branch with just one file and keeping its whole history

From
Nncrfgs@tin.it <ncrfgs@tin.it>
Date
Jul 21, 2008, 04:18 UTC
Message-ID
<20080721061804.223f7801@mail.tin.it>
Hi,

I have a working local repository and I'd like to make a branch with just one file (let's say path2/filename2) and to keep its whole history.

At first I've considered creating a fresh new repo and redirecting `git-log -p --follow path2/filename2` output to some other git command.

When later I've discussed the topic on #git@irc.freenode.net I've been pointed to git-filter-branch.

Searching for more info about git-filter-branch on the web I've found a couple of examples that might be close to what I'd like to accomplish:

from http://loupgaroublond.blogspot.com/2007/12/how-to-split-repository-in-git.html
	$ git filter-branch --tree-filter 'rm -rf $put_the_files_you_want_to_remove_here' HEAD
	$ git reset --hard
	$ git gc --aggressive
	$ git prune
from http://log.emmanuelebassi.net/archives/2007/09/when-the-levee-breaks/
	$ git clone --no-hardlinks /tmp/gtk2-perl Gtk2-SourceView.git
	$ git filter-branch --subdirectory-filter Gtk2-SourceView HEAD
	$ git reset --hard
	$ git gc --aggressive
	$ git prune
I've also gone through man pages and I've found something interesting:
	$ git-filter-branch --tree-filter 'rm $filename' HEAD
or, as far as I understood, equivalent and faster:
	$ git-filter-branch --index-filter 'git-update-index --remove $filename' HEAD 

Now, what I'd like to do is complementary to the above example; the difference is that I don't want to remove just one file and its traces from history; rather I'd like to have a new repo which includes just that file and its history.

So I would need something like the following command:
	$ git-filter-branch --tree-filter 'keep(?) $filename' HEAD
I think one possible solution would be:
	$ git-filter-branch --tree-filter 'find ! -type d | grep -v "^./path2/filename2$" | while read FILE; do rm $FILE; done' HEAD
Problems come, I think, if the content you want to keep track of, is placed in a
file that has been renamed. For example, let's say that the content you want to
keep track of was in:
	path1/filename1 from commit 1 to commit 1000
	path2/filename1 from commit 1001 to commit 2000
	path2/filename2 from commit 2001 to commit 3000
In this case I think one possible solution would be:
	$ git-filter-branch --tree-filter 'find ! -type d | grep -v "^./path1/filename1$" | grep -v "^./path2/filename1$" | grep -v "^./path2/filename2$" | while read FILE; do rm $FILE; done' HEAD

But what happens if in the meanwhile a new file has been created with one of the names we used for the content we want to keep track of? Let's say, following the previous case, that path2/filename1 has been renamed to path2/filename2 with commit 2001, and that with commit 2500 a new file has been created with name path1/filename1.

Considering both the solutions I've found on the web and the ones I've been
suggested on #git@irc.freenode.net I've found four/five possible path to follow:
	a) git log | another git command (later I've been told that git log --follows leaves out the initial revision)
	b) git clone; git filter-branch
	c) create a new repo with your one file and make an initial commit
	   then do: (cd repo-with-one-file; git ls-tree)|(cd repo-where-you-want-the-new-branch; git-mktree)
	d) git commit-tree that-tree < file-with-commit-message
	   then: git checkout -b branchname that-commit
	e) git-am or git apply processing the output of git-log or another
	   similar command
I hope you guys can help me to make some light on this issue.
Thanks in advance. :D

P.S. Sorry for my bad english but I'm not a native english speaker, I hope that what I've written made enough sense to you. :)

Next: Eric Raible
Message 1 of 7 in “making a branch with just one file and keeping its whole history”
  1. ncrfgs@tin.itJul 21, 2008
  2. Eric RaibleJul 21, 2008
  3. Johannes SchindelinJul 21, 2008
  4. Eric RaibleJul 21, 2008
  5. Johannes SchindelinJul 21, 2008
  6. extracting the history of a single file as a new project [Was: Re: making a branch with just one file and keeping its whole]ncrfgs@tin.it, Jul 22, 2008
  7. Sverre RabbelierJul 22, 2008

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.