ветвь проверки git извне

#git #branch #clone #git-checkout

#git #ветка #клонировать #git-checkout

Вопрос:

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

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

  1. git clone 'github-project-url' 'file-system-folder'
  2. 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 , чтобы очистить потерянное рабочее дерево в вашем репозитории.