#git #branch #clone #git-checkout
#git #ветка #клонировать #git-checkout
Вопрос:
Проблема: мне нужно каким-то образом оформить существующую ветку проекта, который уже клонирован локально в моей файловой системе, не находясь в этой конкретной папке этого проекта.
Решение: Я пытаюсь сделать следующее:
git clone 'github-project-url' 'file-system-folder'
git checkout 'existing-branch' 'file-system-folder'
Я понимаю, что второй шаг не совсем правильный, но я также пытаюсь избежать cd 'file-system-folder'
.
Комментарии:
1. Почему вы пытаетесь избежать
cd
? Это может повлиять на типы ответов, которые будут работать для вас.2. Я не могу говорить за запрашивающего, но мы не можем выполнить cd, потому что мы не хотим запускать вспомогательную оболочку при выполнении команды checkout. Тем не менее, я согласен, что это самый понятный подход, если доступна вспомогательная оболочка.
Ответ №1:
Вы можете использовать, --git-dir
чтобы указать .git
каталог, который будет использоваться в качестве хранилища, и --work-tree
указать рабочее дерево для оформления заказа. Смотрите git
справочную страницу для получения подробной информации.
git --git-dir=file-system-folder/.git --work-tree=file-system-folder checkout existing-branch
Комментарии:
1. 1: Безусловно, лучшая с точки зрения предпочтений операционной системы, хотя, если вы ищете кратчайший способ сделать это вместо наименьшего количества команд,
cd
в подоболочке действительно неплохо.
Ответ №2:
Начиная с версии Git 1.8.5, вы также можете использовать -C <path>
опцию. Обязательно используйте ее перед любой другой командой:
git -C ~/my-git-repo checkout master
Обратите внимание, что это не обязательно должна быть конкретно папка .git. Вот документация man:
-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
Комментарии:
1. Вы действительно это сделали? Я не вижу, чтобы ваш пример кода работал на моем компьютере, и он не похож на показанный вами пример (в котором есть
--git-dir
и--work-tree
.2. Да, я использовал подобное с кучей разных команд got.
git clone $ACQUIA_REPO ~/acquia; git -C ~/acquia checkout -b $CIRCLE_BRANCH; git -C ~/acquia log; git -C ~/acquia add .; git -C ~/acquia commit -am "$( cat
3. На справочной странице есть git-dir и рабочее дерево. Все, что вам нужно, — это просто выполнить команду git в репозитории git с .git folder -C.
4. Не знал об этом, должен быть официальный ответ — спасибо, общие
Ответ №3:
git clone ./foo ./foo-copy
git --git-dir=./foo-copy/.git --work-tree=./foo-copy checkout branch
Комментарии:
1. Это не сработает.
--git-dir
требуется фактический.git
каталог; и это позволит выполнить проверку в текущем рабочем каталоге, а не в репозитории. Вам нужно передать оба--git-dir
и--work-tree
.2. Также мне кажется во время тестирования, что вы должны передать эти флаги
git
самой себе, а неcheckout
подкоманде.
Ответ №4:
Вы можете использовать --git-dir
и --work-tree
, чтобы избежать cd’ing, но, честно говоря, проще просто cd. Чтобы избежать необходимости возврата на cd, вы можете сделать это в подоболочке:
git clone foo foo-copy
(cd foo-copy amp;amp; git checkout branch)
Конечно, в данном конкретном случае вам на самом деле не нужны две команды:
git clone -b <branch-to-checkout> foo foo-copy
Комментарии:
1. Ну, когда вы создаете скрипт командной строки, это не проще 😉 В любом случае, спасибо за ваш отзыв!
2. Эм, эйстрати, все, что ты можешь ввести в командной строке, ты можешь вставить в скрипт! В чем проблема?
3. Нет проблем, просто зачем мне выполнять 3 операции (папка cd amp; amp; git checkout amp; amp; cd back), когда я могу выполнить только одну (git checkout с указанными параметрами)?
4. @eistrati: Вы, конечно, вольны писать свои скрипты так, как хотите, но большее количество команд меньшей общей длины на самом деле не так уж и сложно обработать, и если другие работают над вашими скриптами, вы можете обнаружить, что они тоже с вами не согласны.
(cd <dir> amp;amp; ...)
это очень, очень распространенная и хорошо понятная идиома.5. Кроме того, семантика
--git-dir
и--work-tree
действительно неочевидна. Если вы хотите использовать их и избежать неприятных сюрпризов, всегда устанавливайте оба из них и используйте только абсолютные пути. совет @ Jefromi (чтобы полностью избежать этих проблем), по моему опыту, очень обоснован.
Ответ №5:
в git 2.5 добавлена возможность иметь несколько рабочих деревьев с помощью git worktree. Итак, в этом случае вы бы использовали что-то вроде
git worktree add -b new-branch-name ../dir-name existing-branch
затем вы можете изменить название каталога и выполнять свои коммиты как обычно. Коммиты окажутся в вашем исходном репозитории (где вы использовали worktree add
).
Когда вы закончите и все, что вы хотите, будет зафиксировано, вы можете удалить dir-name
папку и запустить git worktree prune
, чтобы очистить потерянное рабочее дерево в вашем репозитории.