git - 当我的当前目录不在存储库中时,我可以对存储库中的文件执行 git 操作(添加/差异/提交)吗

标签 git

使用 svn,我能够在 checkout 时对文件运行命令,而无需先通过 cd 进入该 checkout 。例如:

# 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 时真的很想念它。

UPDATE 2016 目前正确的答案是使用 -C 标志给 git,这是在 2013 年的 1.8.5 版本中引入的。参见 https://stackoverflow.com/a/35899275/357336

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

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

用法:rgit 命令 [参数]

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

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

最佳答案

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

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

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

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

关于git - 当我的当前目录不在存储库中时,我可以对存储库中的文件执行 git 操作(添加/差异/提交)吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205867/

相关文章:

git - 什么是 stash ?

Git 和大量空白问题

git - 如何在没有集线器的情况下自动查找 GitHub 上一个分支的上游 URL?

ios - 我应该将 App.xcarchive、DistributionSummary.plist、ExportOptions.plist、Packaging.log 提交到公共(public)存储库吗?

git - git/BitBucket 中没有主分支

git - 在 Git::Repository 中使用密码

GIT pull 或克隆存储库仅获取 Master 分支

android - 如何跨多个平台管理 Android/Eclipse/Git 项目?

GIT:将branch1和branch2 merge 到master中而不覆盖

java - Android 应用程序的典型 .gitignore 文件