Как вы клонируете репозиторий Git в определенную папку?

2244

Выполнение команды git clone git@github.com:whateverсоздает каталог в моей текущей папке с именем whateverи помещает содержимое хранилища Git в эту папку:

/httpdocs/whatever/public

Моя проблема в том, что мне нужно, чтобы содержимое репозитория Git было клонировано в мой текущий каталог, чтобы оно отображалось в правильном месте для веб-сервера:

/httpdocs/public

Я знаю, как перемещать файлы после того, как я клонировал репозиторий, но это, похоже, нарушает работу Git, и я хотел бы иметь возможность обновлять его, просто вызывая git pull. Как я могу это сделать?

Дэвид Смит
источник
3
В Windows вы можете перемещать файлы из папки, где вы будете клонировать репозиторий [если он есть), поэтому он пуст при выполнении git clone . После клонирования переместите ваши файлы назад [ctrl-z] и whoala ! Если текущая папка пуста, просто используйте: git clone giturl .
44
вуаля - орфография
Матиас
82
@MatthiasDailey voilà - это настоящее правописание
шелковый огонь
6
et voilà - французский для et voilà
Толстяк

Ответы:

3223

Вариант А:

git clone git@github.com:whatever folder-name

Ergo, для right hereиспользования:

git clone git@github.com:whatever .

Вариант Б:

Переместите .gitпапку тоже. Обратите внимание, что .gitпапка скрыта в большинстве графических файлов, поэтому обязательно покажите скрытые файлы.

mv /where/it/is/right/now/* /where/I/want/it/
mv /where/it/is/right/now/.* /where/I/want/it/

Первая строка захватывает все обычные файлы, вторая строка захватывает точечные файлы. Также возможно сделать это в одну строку, включив dotglob (т.е. shopt -s dotglob), но это, вероятно, плохое решение, если вы задаете вопрос, на который отвечает этот ответ.

Еще лучше:

Сохраните свою рабочую копию где-нибудь еще и создайте символическую ссылку. Нравится:

ln -s /where/it/is/right/now /the/path/I/want/to/use

Для вашего случая это будет что-то вроде:

ln -sfn /opt/projectA/prod/public /httpdocs/public

Который легко можно изменить, чтобы проверить, если вы этого хотите, то есть:

ln -sfn /opt/projectA/test/public /httpdocs/public

без перемещения файлов. Добавляется -fnв случае, если кто-то копирует эти строки ( -fпринудительно, -nизбегайте некоторых часто нежелательных взаимодействий с уже существующими и несуществующими ссылками).

Если вы просто хотите, чтобы это работало, используйте вариант А, если кто-то еще собирается посмотреть на то, что вы сделали, используйте вариант С.

Can Berk Güder
источник
8
Я не думал о вашем варианте «еще лучше», и мне нравится, хотя я не уверен, почему. Каковы преимущества этого?
Дэвид Смит
6
Вероятно, сейчас это не дает никаких преимуществ, но может избавить вас от многих неприятностей, если вы решите переместить вещи в один прекрасный день.
Can Berk Güder
12
Кроме того, вы можете быстро переключаться между выпусками с помощью опции «Еще лучше». Это особенно полезно и используется для серверов.
Халил Озгюр
4
@MEM Я думаю, что он имеет в виду создать символическую ссылку на .git, т. Е.ln -s path/to/.git path/to/working/directory
Александр
27
Кто-нибудь может объяснить преимущества этого ?? Я сегодня немного дремучий. Как использование серверов symlink приносит пользу?
тройной
586

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

git clone git@github.com:whatever .

"." в конце указывается текущая папка как папка оформления заказа.

J Wynia
источник
28
true, поэтому вы не хотите запускать «git init» в этой папке перед тем, как клонировать в нее. Но если вы это сделали, то удаление папки .git перед клонированием поможет.
Магн
3
исправлено для пустых каталогов в моем ответе
csomakk
1
не мог заставить это работать в nitrous.io? даже после опустошения он говорит, что каталог не пуст
Tejas Manohar
@TejasManohar Убедитесь, что вы также удалили скрытые файлы.
Британец
ls -aпокажет все файлы, включая скрытые.
Майкл Дорст
215

Зайдите в папку .. Если папка пуста, то:

git clone git@github.com:whatever .

еще

git init
git remote add origin PATH/TO/REPO
git fetch
git checkout -t origin/master
csomakk
источник
9
На самом деле это был самый полезный ответ для меня, когда мне просто нужно было перенести уже созданный проект во вновь созданный репозиторий. Престижность!
wirher
13
Только ответ, в котором указано, как оформить заказ в непустую папку, спасибо.
Престон Бадир
2
Это действительно полезно, поскольку в switch -tдокументации по git checkout явно не указано on .
Четабахана
4
что делает ключ -t? Я получаю сообщение об отмене со списком неотслеживаемых файлов, которые будут перезаписаны при оформлении заказа? Что делать в этой ситуации? Я не хочу, чтобы эти файлы были перезаписаны?
Момин Захид
2
-t документация из git: -t, --track При создании новой ветки настройте «восходящую» конфигурацию. Смотрите "--track" в git-branch (1) для деталей.
csomakk
87

Базовое клонирование репозитория Git

Вы клонируете репозиторий с

git clone [url]

Например, если вы хотите клонировать библиотеку Git Drupal Open Framework Стэнфордского университета под названием open_framework, вы можете сделать это следующим образом:

$ git clone git://github.com/SU-SWS/open_framework.git

Это создает каталог с именем open_framework (в вашей текущей локальной файловой системе), инициализирует внутри него каталог .git, извлекает все данные для этого хранилища и извлекает рабочую копию последней версии. Если вы войдете во вновь созданный каталог open_framework, вы увидите там файлы проекта, готовые для работы или использования.

Клонирование репозитория в определенную локальную папку

Если вы хотите клонировать репозиторий в каталог с именем, отличным от open_framework, вы можете указать это в качестве следующего параметра командной строки:

$ git clone git:github.com/SU-SWS/open_framework.git mynewtheme

Эта команда делает то же самое, что и предыдущая, но целевой каталог называется mynewtheme.

Git имеет несколько различных протоколов передачи, которые вы можете использовать. В предыдущем примере используется протокол git: //, но вы также можете увидеть http (s): // или user @ server: /path.git, который использует протокол передачи SSH.

Крейг Гердинген
источник
это автоматически создаст папку в вашей текущей папке и поместит туда файлы. Таким образом, вам не нужно беспокоиться о перезаписи любой другой папки.
Арн-
24

Чтобы клонировать git-репозиторий в определенную папку, вы можете использовать -C <path>параметр, например

git -C /httpdocs clone git@github.com:whatever

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

cd /httpdocs
git clone git@github.com:whatever .

Обратите внимание, что клонирование в существующий каталог допускается только в том случае, если каталог пуст .

Поскольку вы клонируете в общедоступную папку, рассмотрите возможность отделения вашего Git-репозитория от рабочего дерева, используя --separate-git-dir=<git dir>или исключая .gitпапку в конфигурации вашего веб-сервера (например, в .htaccessфайле).

kenorb
источник
17

Чтобы клонировать в текущий рабочий каталог :

git clone https://github.com/link.git

Чтобы клонировать в другой каталог :

git clone https://github.com/link.git ./Folder1/Folder2

Надеюсь, поможет :)

Сарат Чандра
источник
это сработало и для меня. не ./в начале пути к папке
Алон
13

Когда вы перемещаете файлы туда, где вы хотите их, вы также перемещаете .gitкаталог? В зависимости от вашей ОС и конфигурации этот каталог может быть скрыт.

Он содержит репозиторий и вспомогательные файлы, в то время как файлы проекта, которые находятся в вашем /publicкаталоге, являются только версиями в текущем извлеченном коммите (основная ветвь по умолчанию).

Павел
источник
13

Клон:

git clone git@jittre.unfuddle.com:jittre/name.git

Клонируем "конкретную ветку":

git clone -b [branch-name] git@jittre.unfuddle.com:jittre/name.git
Selvamani
источник
13

Если вы хотите клонировать в текущую папку, попробуйте это:

git clone https://github.com/example/example.git ./
Луис
источник
8
фатальный: путь назначения '.' уже существует и не является пустым каталогом.
Клитон
11

Применение

git clone <repository>

Клонируйте хранилище, расположенное в <хранилище>, на локальный компьютер. Исходный репозиторий может находиться в локальной файловой системе или на удаленном компьютере, доступном через HTTP или SSH.

git clone <repo> <directory>

Клонируйте репозиторий, расположенный в <repository>, в папку с именем <directory> на локальном компьютере.

Источник: Настройка хранилища

Nagarjun
источник
9

Убедитесь, что вы удалили репозиторий .git, если пытаетесь зайти в текущий каталог.

rm -rf .git тогда git clone https://github.com/symfony/symfony-sandbox.git

Алекс
источник
3

Вот как я бы это сделал, но я сделал псевдоним, чтобы сделать это для меня.

$ cd ~Downloads/git; git clone https:git.foo/poo.git

Вероятно, есть более элегантный способ сделать это, однако я обнаружил, что для меня это проще всего.

Вот псевдоним, который я создал, чтобы ускорить процесс. Я сделал это для zsh, но он должен прекрасно работать для bash или любой другой оболочки, такой как fish, xyzsh, fizsh и так далее.

Edit ~/.zshrc, /.bashrcи т.д. с вашим любимым редактором (шахта Leafpad, так что я бы написать $ leafpad ~/.zshrc).

Однако я предпочитаю создать плагин zsh для отслеживания всех моих псевдонимов. Вы можете создать персональный плагин для oh-my-zsh, выполнив следующие команды:

$ cd ~/.oh-my-zsh/
$ cd plugins/
$ mkdir your-aliases-folder-name; cd your-aliases-folder-name
     # In my case '~/.oh-my-zsh/plugins/ev-aliases/ev-aliases'
$ leafpad your-zsh-aliases.plugin.zsh
     # Again, in my case 'ev-aliases.plugin.zsh'

Затем добавьте эти строки в только что созданный пустой файл alises.plugin:

# Git aliases
alias gc="cd ~/Downloads/git; git clone "

(Отсюда замените свое имя на мое.)

Затем, чтобы заставить работать псевдонимы, они (вместе с zsh) должны быть получены (или как там это называется). Для этого в вашем документе плагина добавьте:

## Ev's Aliases

#### Remember to re-source zsh after making any changes with these commands:

#### These commands should also work, assuming ev-aliases have already been sourced before:

allsource="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh; clear"
sourceall="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh"
#### 

####################################

# git aliases

alias gc="cd ~/Downloads/git; git clone "
# alias gc="git clone "
# alias gc="cd /your/git/folder/or/whatever; git clone "

####################################

Сохраните ваш плагин oh-my-zsh и запустите allsource. Если это не похоже на работу, просто запустите source $ZSH/oh-my-zsh.sh; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh. Это загрузит источник плагина, который позволит вам использовать allsourceс этого момента .


Я нахожусь в процессе создания репозитория Git со всеми моими псевдонимами. Пожалуйста, не стесняйтесь проверить их здесь: точечные файлы Ev . Пожалуйста, не стесняйтесь раскошелиться и улучшить их в соответствии с вашими потребностями.

EV-
источник
2

Если вы используете sshдля git cloningвы можете использовать следующую команду.

git -C path clone git@github.com:path_to_repo.git

Например: git -C /home/ubuntu/ clone git@github.com:kennethreitz/requests.gitперетащит Git-репозиторий на requestsваш /home/ubuntu/путь.

Анкит Сингх
источник
2

По какой-то причине этот синтаксис не выделяется:

git clone repo-url [folder]

Здесь папка - необязательный путь к локальной папке (которая будет локальным хранилищем).

Git cloneтакже будет pullкодировать из удаленного репозитория в локальный репозиторий. На самом деле это правда:

git clone repo-url  =  git init + git remote add origin repo-url + git pull
прости
источник
0

Хотя все ответы, приведенные выше, хороши, я хотел бы предложить новый метод вместо использования метода символьной ссылки в общедоступном каталоге html, как предложено BEST в принятом ответе. Вам необходимо иметь доступ к настройкам виртуального хоста вашего сервера.

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

DocumentRoot / var / www / html / website / your-git-repo

Вот пример файла виртуального хоста:

<VirtualHost *:443>
    ServerName example.com

    DocumentRoot /path/to/your-git-repo
    ...
    ...
    ...
    ...
</VirtualHost>
Тарик
источник
0

Вы можете использовать следующую команду git для клонирования с пользовательским именем каталога

git clone <git_repo_url> <your_custom_directory_name>

Примечание: вам не нужно создавать свой обычный каталог, потому что он будет создан автоматически

Маной Рана
источник
-1
For Windows user 

1> Open command prompt.
2> Change the directory to destination folder (Where you want to store your project in local machine.)
3> Now go to project setting online(From where you want to clone)
4> Click on clone, and copy the clone command.
5> Now enter the same on cmd .

It will start cloning saving on the selected folder you given .
Тарит Рэй
источник
-5

По поводу этой строки из оригинального поста:

«Я знаю, как переместить файлы после того, как я клонировал репозиторий, но это, кажется, сломало мерзавца»

Я могу это сделать, и пока не вижу проблем с операциями добавления, фиксации, push, pull.

Этот подход изложен выше, но не разбит на этапы. Вот шаги, которые работают для меня:

  1. клонировать репо в любую свежую временную папку
  2. перейдите в эту корневую папку, которую вы только что клонировали локально
  3. скопируйте все содержимое папки, включая каталог /.git, в любую существующую папку; (скажем, проект затмения, который вы хотите объединить с вашим репо)

Существующая папка, в которую вы только что скопировали файлы, теперь готова к взаимодействию с git.

Джин Бо
источник