git checkout филиал снаружи - PullRequest
28 голосов
/ 20 мая 2011

Проблема: мне нужно каким-то образом извлечь существующую ветку проекта, которая уже клонирована локально в моей файловой системе, не находясь в этой конкретной папке этого проекта.

Решение: я пытаюсь сделать следующее:

  1. git clone 'github-project-url' 'file-system-folder'
  2. git checkout 'существующие-ветки' 'папка-файловая система'

Я понимаю, что второй шаг не совсем верен, но я также стараюсь избегать "cd 'file-system-folder'".

Ответы [ 5 ]

62 голосов
/ 20 мая 2011

Вы можете использовать --git-dir, чтобы указать каталог .git для использования в качестве хранилища, и --work-tree, чтобы указать рабочее дерево для извлечения. См. Справочную страницу git для деталей.

git --git-dir=file-system-folder/.git --work-tree=file-system-folder checkout existing-branch
6 голосов
/ 08 июня 2017

Теперь вы также можете использовать -C в качестве опции.Убедитесь, что не используете его перед любой другой командой, такой как

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
2 голосов
/ 20 мая 2011
git clone ./foo ./foo-copy
git --git-dir=./foo-copy/.git --work-tree=./foo-copy checkout branch
1 голос
/ 13 декабря 2015

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 дляуберите осиротевшее рабочее дерево в своем репо.

1 голос
/ 20 мая 2011

Вы можете использовать --git-dir и --work-tree, чтобы избежать cd'ing, но, честно говоря, проще просто cd.Чтобы не возвращать CD, вы можете сделать это в подоболочке:

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

Конечно, в данном конкретном случае вам не нужны две команды:

git clone -b <branch-to-checkout> foo foo-copy 
...