36

问题:我需要以某种方式检查一个项目的现有分支,该分支已经在我的文件系统上本地克隆,而不是在该项目的特定文件夹中。

解决方案:我正在尝试执行以下操作:

  1. git clone 'github-project-url' 'file-system-folder'
  2. git checkout 'existing-branch' 'file-system-folder'

我确实意识到第二步不太正确,但我也试图避免cd 'file-system-folder'.

4

5 回答 5

76

您可以使用--git-dir指定.git要用作存储库的目录,并--work-tree指定要签出的工作树。有关详细信息,请参阅git手册页

git --git-dir=file-system-folder/.git --work-tree=file-system-folder checkout existing-branch
于 2011-05-20T14:46:51.667 回答
20

由于 Git 版本1.8.5,您还可以使用-C <path>选项。确保在任何其他命令之前使用它:

git -C ~/my-git-repo checkout master

请注意,它不一定是 .git 文件夹。这是男人的文档:

-C <path>
       Run as if git was started in <path> instead of the current 
       working directory. When multiple -C options are given, each
       subsequent non-absolute -C <path> is interpreted relative to
       the preceding -C <path>.

       This option affects options that expect path name like --git-dir
       and --work-tree in that their interpretations of the path names
       would be made relative to the working directory caused by the -C option.
       For example the following invocations are equivalent:

           git --git-dir=a.git --work-tree=b -C c status
           git --git-dir=c/a.git --work-tree=c/b status
于 2017-06-08T17:20:48.643 回答
2
git clone ./foo ./foo-copy
git --git-dir=./foo-copy/.git --work-tree=./foo-copy checkout branch
于 2011-05-20T14:46:17.860 回答
2

非常欢迎您使用--git-dir--work-tree避免 cd'ing,但老实说,仅 cd 更容易。为了避免不得不 cd 回来,你可以在一个子shell中做到这一点:

git clone foo foo-copy
(cd foo-copy && git checkout branch)

当然,在这种特定情况下,您实际上并不需要两个命令:

git clone -b <branch-to-checkout> foo foo-copy 
于 2011-05-20T15:04:31.583 回答
1

git 2.5 添加了使用git worktree拥有多个工作树的能力。所以在这种情况下,你会使用类似的东西

git worktree add -b new-branch-name ../dir-name existing-branch

然后您可以更改为 dir-name 并像往常一样进行提交。提交最终将在您的原始存储库中(您使用的地方worktree add)。

完成并提交所需的所有内容后,您可以删除该dir-name文件夹并运行git worktree prune以清理存储库中的孤立工作树。

于 2015-12-13T13:42:18.367 回答