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

500

Я делаю:

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

Я получаю:

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

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

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

MEM
источник
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
ambes
источник
Я рад подтвердить, <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каталоге, что, конечно, не является предметом вопроса.
Павел Шимерда
Тогда вам придется вручную перемещать скрытые файлы или использовать сложную команду ... и это не отвечает на вопрос.
Черное
54
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
источник
это
твик
48

Делать

git clone https://user@bitbucket.org/user/projectname.git .

Каталог должен быть пустым

NSukonny
источник
Этот ответ выглядит дубликатом stackoverflow.com/a/19243896
Acumenus
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
GoZoner
источник
1
в моем случае это работало даже с некоторыми файлами в '.' каталог
OSdave
2
Обратите внимание, что любые файлы точек в каталогах под foo, например. foo / bar / .foobar не будет перемещен с помощью этой команды. Смотрите ответ от @phatblat
LEA
10

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

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

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

ls -a
Jakehao
источник
Столкнулся с этой проблемой сегодня. Оказалось, что я скрыл папки .git и .gitignore в каталоге, к которому я пытался клонировать репозиторий. Когда я удалил эти папки, все было в порядке.
Тамара
Какой будет команда для очистки текущего каталога? Я думаю, что это было бы более полезным, чем просто проверить это :)
pie6k
9

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

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

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

MEM
источник
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'.

phatblat
источник
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 создавались при извлечении, просто удалите их после извлечения.

igeocacher
источник
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

166_MMX
источник
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 .

Upendra
источник
Это не работает на 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

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

ynotjs
источник
0

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

croppio.com
источник
-1

Удаление с

рм -рф. *

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

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

rm -rf / path / to / folder / *

Sid
источник
-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делает.
хакель