Как заставить Git клонировать в текущий каталог


500

Я делаю:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

Я получаю:

Фатальный: путь назначения '.' уже существует и не является пустым каталогом.

Я знаю путь. уже существует. И я могу заверить, что каталог пуст. (Я делаю ls внутри и ничего не вижу!)

Что мне здесь не хватает, чтобы клонировать этот проект в текущий каталог?


16
если вы делаете ls -a, вы видите .gitкаталог?
Дэвин Трайон

2
@dtryon - Нет. Но я вижу DS_Store, что бы это ни было. Возможно, я должен избавиться от этого. Спасибо за это -a: s
MEM

@ Спасибо за ваш быстрый ответ. Джеймс Маклауглин, который кажется прекрасной командой, чтобы убедиться, что мы клонируем в пустой каталог. :)
MEM

1
Я предполагаю, что вы на Mac . Помогает ли это: stackoverflow.com/questions/107701/…
Davin Tryon

Что бы это ни стоило, в любой папке, к которой вы обращаетесь на Mac, будут созданы эти маленькие файлы. Это очень раздражает как для пользователей Windows, которые используют одни и те же общие ресурсы, так и для любой системы (например, git), которая требует, чтобы папки были пустыми или выполняла действия программно над каждым файлом в папке.
jsims281

Ответы:


510

просто поставьте точку рядом с ней

git clone git@github.com:user/my-project.git .

От git help clone:

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

Поэтому убедитесь, что каталог пуст (проверьте с помощью ls -a), иначе команда не выполнится .


18
согласитесь, обратите внимание, что на компьютере Mac автоматически создается файл .DS_Store, созданный средством поиска. проверить сls -la
ptim

281
Нет. Это не правильный ответ. Это все равно вернет "fatal: destination path". ' уже существует и не является пустым каталогом. "
Сид Сарасвати

16
У меня работает с использованием git v1.8.3.2. @SidSarasvati Вы уверены, что текущий каталог пуст ?
Уэсли Боуг

3
@SidSarasvati хорошо для меня, директория не пуста, но я не забочусь об этом, поэтому я не уверен, почему Git будет. Почему нельзя git clone в непустую директорию? Конечно, функционально это просто базовая загрузка.
Натан Хорнби

3
mkdirсоздает жесткие ссылки .и ..по умолчанию, так что новый каталог технически "пуст" в системах на основе Unix, вообще? Я имею в виду, я думаю , вы могли бы unlink .и , unlink ..но это может привести к вам огромные проблемы позже , если вы забыли восстановить связь снова после клонирования ....
SeldomNeedy

351

Следующее, вероятно, не полностью эквивалентно клону во всех случаях, но сработало для меня:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

В моем случае это создает .git/configфайл, эквивалентный тому, который я получаю при выполнении клонирования.


40
Кроме того, это заклинание, которое позволяет текущему контенту оставаться - скажем, если вы клонировали ваши точечные файлы в ваш домашний каталог.
rbellamy

7
После этого мне наконец-то разрешено клонировать в любую папку, которая мне нравится, без того, чтобы Гит относился ко мне как к ребенку. Когда я также добавил временный .gitignore, содержащий *(игнорируйте все), я мог работать, git checkout masterдаже если в папке уже были некоторые другие файлы. Затем все зафиксированные файлы из хранилища были клонированы (и временный .gitignore был перезаписан соответствующим .gitignore из репозитория). Все сработало чудесно. Это должно произойти само по себе, используя git clone -fчто-то.
PaulMag

1
если у вас есть файлы, которые отличаются / новые / изменены и будут перезаписаны (... файлы будут перезаписаны извлечением ... прерывание) используйте: git checkout master -f
visualex

3
Это -t \*не нужно, так как это по умолчанию.
Палек

1
git remote set-head origin -aможет пригодиться Он устанавливает исходную ветку branch ( refs/remotes/origin/HEAD), как это установлено в удаленном хранилище. git cloneделает это автоматически, в отличие от git remote add -f.
Палек

212

@ Андрей четко ответил здесь . Но так же просто, как это работает, даже если каталог не пустой:

git init .
git remote add origin <repository-url>
git pull origin master

Я рад подтвердить, <repository-url>также может быть локальный репо, какgit remote add origin /path/to/existing/repo
krubo

60

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

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

Это клонирует ваши вещи в project_hubкаталог.

Когда клонирование закончится, вы можете переместить этот каталог куда хотите:

mv project_hub /path/to/new/location

Это безопасно и не требует никаких магических вещей вокруг.


9
Это создаст подкаталог в уже существующем /path/to/new/locationкаталоге, что, конечно, не является предметом вопроса.
Павел Шимерда

Тогда вам придется вручную перемещать скрытые файлы или использовать сложную команду ... и это не отвечает на вопрос.
Черное



15

Хм ... указание абсолютного текущего пути с помощью $(pwd)сработало для меня.

git clone https://github.com/me/myproject.git $(pwd)

версия git: 2.21.0


13

Если текущий каталог пуст, то это будет работать:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

1
в моем случае это работало даже с некоторыми файлами в '.' каталог
OSdave

2
Обратите внимание, что любые файлы точек в каталогах под foo, например. foo / bar / .foobar не будет перемещен с помощью этой команды. Смотрите ответ от @phatblat
LEA

10

В дополнение к ответу @ StephaneDelcroix, перед использованием:

git clone git@github.com.user/my-project.git .

убедитесь, что ваш текущий каталог пуст с помощью

ls -a

Столкнулся с этой проблемой сегодня. Оказалось, что я скрыл папки .git и .gitignore в каталоге, к которому я пытался клонировать репозиторий. Когда я удалил эти папки, все было в порядке.
Тамара

Какой будет команда для очистки текущего каталога? Я думаю, что это было бы более полезным, чем просто проверить это :)
pie6k

9

Решение: В этом случае решение использовало dot, поэтому:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && может быть опущено, если мы абсолютно уверены, что каталог пуст.

Кредиты идут: @ Джеймс Маклафлин на комментарии ниже.


10
Это выглядит злым, поскольку. * Включает родительский каталог! me: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow

Это не помогает, потому что у меня есть зависимости в каталоге, где мне нужно оформить заказ.
b01

18
Я не уверен, что было бы разумно написать rm -rf (в любой форме) в ответ SO без какого-либо ДЕЙСТВИТЕЛЬНО СТРАШНОГО предупреждающего знака. Какой-то неопытный пользователь может прийти сюда в поисках «зеленой галочки» (обычно это лучший ответ), затем скопировать и вставить эту команду, и пуф… там идет его тяжелая работа в текущем каталоге. Кстати: rm -rf ./.*«безопаснее», если вы просто удаляете скрытые (точечные) файлы и каталоги под текущим каталогом (точно так же, как @stackunderflow указано передо мной). Но rm -rfэто опасная команда для неопытных пользователей, поэтому будьте осторожны с ней! Просто мои 2 цента.
Андрей

работает на 1.7.1 Единственная папка внутри была .gitпосле git init(я это знал)
vladkras

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

6

Улучшение ответа @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

Команда shopt взята из этого SO ответа и изменяет поведение команды 'mv' в Bash, добавляя в нее dotfiles, которые вам нужно будет включить в каталог .git и любые другие скрытые файлы.

Также обратите внимание, что это гарантированно будет работать как есть, только если текущий каталог (.) Пуст, но он будет работать до тех пор, пока ни один из файлов в клонированном хранилище не будет иметь того же имени, что и файлы в текущем каталоге. Если вам все равно, что находится в текущем каталоге, вы можете добавить опцию -f (force) к команде 'mv'.


6

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

/server/webroot

и webroot содержит другие стандартные файлы и папки. В моем репо только есть файлы, специфичные для сайта (html, javascript, CFML и т. Д.)

Все, что мне нужно было сделать, это:

cd /server/webroot

git init

git pull [url to my repo.git]

Вы должны быть осторожны, чтобы выполнить git init в целевой папке, потому что если вы НЕ сделаете, произойдет одно из двух:

  1. Git pull просто завершится ошибкой с сообщением об отсутствии git-файла, в моем случае:

Неустранимый: не репозиторий git (или любой из родительских каталогов): .git

  1. Если где-то в родительском пути к вашей папке есть файл .git, то ваше извлеченное хранилище будет создано в ТО родительском файле, который содержит файл .git. Это случилось со мной, и я был удивлен этим ;-)

Это НЕ мешало ни одному из «стандартных» файлов, которые есть в моей папке webroot, но мне нужно было добавить их в файл .gitignore, чтобы предотвратить их случайное добавление при последующих фиксациях.

Это кажется простым способом «клонировать» в непустую директорию. Если вы не хотите, чтобы файлы .git и .gitignore создавались при извлечении, просто удалите их после извлечения.


5

Дальнейшее улучшение ответа @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

как один лайнер:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

3
Предоставьте больше информации, чтобы объяснить, почему ваш код устраняет проблему и что он делает.
Мартин

"git clone ... tmp" - создает папку / tmp в каталоге, где выполняется команда, и клонирует репозиторий Git. Тогда "mv tmp / *." - перемещает все файлы из папки / tmp в родительскую папку (где была выполнена предыдущая команда) и, наконец, "rm -rf tmp" - удаляет папку / tmp.
Marinski

1

используйте. (точка) в конце вашей команды, как показано ниже

git clone URL .


Это не работает на Mac, это вызывает ошибку: fatal: destination path '.' already exists and is not an empty directory.
Педро Луз

Для mac :: Вы должны быть в родительском каталоге, а затем использовать имя папки вместо. (Точка), как показано ниже. Git clone URL flodername Убедитесь, что ваша папка пуста.
Упендра,

0

Вот что я нашел:

Я вижу это:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Среди моих поисков я наткнулся на:

https://couchpota.to/forum/viewtopic.php?t=3943

Ищите запись от Клинтона. Холл ... Если вы попробуете это (как я сделал), вы, вероятно, получите access denied ответ, был мой 1-й ключ, поэтому первоначальная ошибка (для меня) фактически ускользала от неправильного корня вопрос.

Решение для этого в Windows: убедитесь, что вы запустили cmdили git elevated, затем запустите:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

Выше было моей проблемой, и просто повышение работало для меня.


0

Решение Windowsзаключается в том, чтобы клонировать хранилище в другую папку, а затем скопировать и вставить в исходное местоположение или просто скопировать .gitневидимую папку.


-1

Удаление с

рм -рф. *

может привести вас к неприятностям или еще некоторым ошибкам.

Если у вас есть / path / to / folder, и вы хотите удалить все внутри, кроме этой папки, просто запустите:

rm -rf / path / to / folder / *


-1

Поэтому я исправил эту же ошибку, удалив скрытую папку .git в моем корневом каталоге, а затем добавив точку в репозиторий git clone. в моей папке root / dist. Это в контексте проекта веб-пакета vue-cli. То, что все остальные говорят правильно, обычно означает, что у вас есть отслеживание git либо в папке, в которую вы пытаетесь клонировать, либо в родительской папке, либо в корне рассматриваемой папки!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

Обратите внимание, что это все равно приведет к той же ошибке, опубликованной в вопросе (« fatal: путь назначения» решен / путь / из / pwd 'уже существует и не является пустым каталогом. »), Если вы делаете это в непустом каталог.
Джино Мемпин


-2

полезно создать новый файл mkdir filename, затем запустить команду git clone xxxxx, это работает на моем компьютере


-3

Я видел этот вопрос очень много раз - и я просто хочу отметить, что git pull из вашего каталога все получится.

Если я не пропустил что-то здесь - это сработало для меня.


5
git pullничего не будет делать, если вы не определили хранилище, что является важной частью того, что git cloneделает.
хакель
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.