Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I perform git operations (add/diff/commit) on files in a repository when my current directory isn't in the repository

Tags:

git

With svn, I was able to run commands on files in a checkout, without having cd into that checkout first. For example:

# Located in /tmp, running svn operation on /home/d5ve/checkout
d5ve@host:/tmp> svn add /home/d5ve/checkout/myfile.txt
d5ve@host:/tmp> svn diff /home/d5ve/checkout/myfile.txt
d5ve@host:/tmp> svn commit /home/d5ve/checkout/myfile.txt

When I attempt this workflow using git, I get an error:

# Located in /tmp, attempting git operation on /home/d5ve/checkout2
d5ve@host:/tmp> git add /home/d5ve/checkout2/myfile.txt
fatal: Not a git repository (or any of the parent directories): .git

I've tried using the --git-dir and --work-tree flags, but that also seemed to fail.

Any suggestions git people? I use this workflow a lot and really miss it when using git.

UPDATE 2016 The current correct answer to this is to use the -C flag to git, which was introduced in version 1.8.5 in 2013. See https://stackoverflow.com/a/35899275/357336

UPDATE: Based upon lunaryorn answer below, I've created a simple perl script which works out the location of the .git directory from the file paths, and sets the GIT_WORK_TREE and GIT_DIR environmental variables for the command.

Please have a look at: http://github.com/d5ve/rgit

USAGE: rgit COMMAND [ARGS]

Basically just replace git with rgit in a command, and you can run the commands from outside the repository.

cd /tmp    
rgit diff /home/d5ve/checkout1
rgit add /home/d5ve/checkout1/rgit.pl
rgit commit /home/d5ve/checkout1/
like image 710
d5ve Avatar asked Jul 08 '10 16:07

d5ve


1 Answers

You have to use both options together:

git --git-dir=/home/d5ve/checkout2/.git --work-tree=/home/d5ve/checkout2/ add /home/d5ve/checkout2/myfile.txt

Note, that --git-dir does not refer to the directory containing working copy, but to the .git subdirectory, which contains the repository itself. git provides two environment variables to set these options permanently for a session:

export GIT_WORK_TREE="/home/d5ve/checkout2"
export GIT_DIR="${GIT_WORK_TREE}/.git"
git status
like image 100
lunaryorn Avatar answered Oct 11 '22 19:10

lunaryorn