当我的当前目录不在存储库中时,我可以对存储库中的文件执行git操作(添加/ diff / commit)

时间:2010-07-08 16:29:47

标签: git

使用svn,我能够在结帐时对文件运行命令,而不首先将cd放入该结账。例如:

# 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

当我使用git尝试此工作流程时,出现错误:

# 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

我尝试过使用--git-dir--work-tree标志,但这似乎也失败了。

任何建议git人?我经常使用这个工作流程,在使用git时非常想念它。

2016年更新目前对此的正确答案是使用-C标记git,这是在2013年版本1.8.5中引入的。请参阅https://stackoverflow.com/a/35899275/357336

UPDATE:根据下面的lunaryorn答案,我创建了一个简单的perl脚本,它根据文件路径计算.git目录的位置,并设置GIT_WORK_TREE和GIT_DIR环境变量命令。

请查看:http://github.com/d5ve/rgit

用法:rgit COMMAND [ARGS]

基本上只需在命令中用 rgit 替换 git ,就可以从存储库外部运行命令。

cd /tmp    
rgit diff /home/d5ve/checkout1
rgit add /home/d5ve/checkout1/rgit.pl
rgit commit /home/d5ve/checkout1/

2 个答案:

答案 0 :(得分:15)

您必须同时使用这两个选项:

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

注意,--git-dir不是指包含工作副本的目录,而是指包含存储库本身的.git子目录。 git提供了两个环境变量来为会话永久设置这些选项:

export GIT_WORK_TREE="/home/d5ve/checkout2"
export GIT_DIR="${GIT_WORK_TREE}/.git"
git status

答案 1 :(得分:1)

请检查这个略有不同的问题,答案是完美的,与此处其他答案中提出的解决方法不同。

How do I execute a Git command without being on the repository folder?

根据一些主持人的说法,我不允许在这里发布答案(我想是某种查克诺里斯粉丝)。