Як заставити Git клонуватись у поточному каталозі


499

Я роблю:

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

Я отримую:

Фатальний: шлях призначення '. " вже існує і не є порожнім каталогом.

Я знаю шлях. вже існує. І я можу запевнити, що каталог порожній. (Я роблю всередині, і нічого не бачу!)

Що мені тут не вистачає, щоб клонувати цей проект у поточний каталог?


16
якщо ви дійсно ls -aбачите .gitкаталог?
Давін Тріон

2
@dtryon - Ні. Але я бачу DS_Store, що б це не було. Можливо, я повинен позбутися цього. Дякую за це -a: s
MEM

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

1
Я припускаю, що тоді ви на Mac . Чи допомагає це: stackoverflow.com/questions/107701/…
Давін Тріон,

Для чого це варто, будь-яка папка, яку ви переглядаєте на mac, створить там маленькі файли. Це дуже дратує як користувачів Windows, які використовують однакові спільні ресурси, так і для будь-якої системи (наприклад, git), якій папки повинні бути порожніми або виконувати дії програмно над кожним файлом у папці.
jsims281

Відповіді:


509

просто поставте крапку поруч

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

Від git help clone:

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

Тому переконайтеся, що каталог порожній (позначте ls -a), інакше команда не вдасться.


18
погодився, зауважимо, що на mac автоматичний файл .DS_Store, створений Finder, блокує клон. заїздls -la
ptim

281
Ні. Це не правильна відповідь. Це все одно поверне "фатальний: шлях призначення". " вже існує і не є порожнім каталогом. "
Сид Сарасвати

16
Для мене працює git v1.8.3.2. @SidSarasvati Ви впевнені, що поточний каталог порожній ?
Веслі Бей

3
@SidSarasvati добре для мене дирекція не порожня, але мені це не байдуже, тому я не впевнений, чому це зробив би Git. Чому не можна git клонувати в не порожній каталог? Напевно функціонально це просто завантаження.
Натан Хорнбі

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
З цим мені нарешті дозволяється клонуватися до тієї папки, яка мені подобається, без того, як Git ставиться до мене як до дитини. Коли я також додав тимчасовий .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може стати в нагоді. Він встановлює початкову гілку за замовчуванням ( refs/remotes/origin/HEAD), як це встановлено у віддаленому сховищі. git cloneробить це автоматично, на відміну від git remote add -f.
Палець

212

@Andrew відповів на це чітко тут . Але так просто, як це працює, навіть якщо каталог не порожній:

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

Я радий підтвердити, що <repository-url>також може бути місцеве репо якgit remote add origin /path/to/existing/repo
крубо

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 / bar / .foobar не буде переміщено за допомогою цієї команди. Дивіться відповідь від @phatblat
LEA

10

Окрім відповіді @ StephaneDelcroix, перед використанням:

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

переконайтесь, що ваш поточний dir порожній, використовуючи

ls -a

Сьогодні зіткнувся з цією проблемою. Виявилося, що я сховав папки .git та .gitignore в каталозі, до якого я намагався клонувати сховище. Коли я видалив ці папки, все було нормально.
Тамара

Що було б командою спорожнити поточний dir? Я думаю, це було б корисніше, ніж просто перевірити його :)
pie6k

9

Рішення: У цьому випадку рішення використовувало dot, так:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

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

Кредити йдуть на: @James McLaughlin на коментарі нижче.


10
Це виглядає злом, оскільки * включає батьківський каталог! me: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow

Це не допомагає, оскільки у мене в каталозі залежність, де мені потрібно перевірити.
b01

18
Я не впевнений, що розумно написати rm -rf (у будь-якій формі) у відповідь SO без якихось попереджувальних знаків СКАРІ. Тут може зайти якийсь недосвідчений користувач, який шукає "зелену галочку" (як правило, найкращу відповідь), а потім копіює та вставляє цю команду та poof ... там йде його важка робота у поточний каталог. BTW: 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 взята з цієї відповіді ТА та змінює поведінку команди 'mv' на Bash, щоб включати дотфайли, до яких вам потрібно буде включити .git каталог та будь-які інші приховані файли.

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


6

У мене була така сама потреба. У моєму випадку у мене була стандартна веб-папка, створена установкою веб-сервера. Для цілей цієї ілюстрації скажемо, що це так

/server/webroot

and webroot містить інші стандартні файли та папки. У мого репо просто є файли, що містять конкретні сайти (html, javascript, CFML тощо)

Все, що я повинен був зробити:

cd /server/webroot

git init

git pull [url to my repo.git]

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

  1. Потяг git просто не вдасться, повідомляючи про відсутність файлу git, в моєму випадку:

fatal: Не сховище 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.
Марінські

1

Введіть. (крапка) в кінці вашої команди, як показано нижче

git clone URL .


Це не працює на mac, це викликає помилки: fatal: destination path '.' already exists and is not an empty directory.
Педро Луз

Для mac :: Ви повинні знаходитись у батьківському каталозі, а потім використовувати ім'я папки замість. ( Крапки ), як нижче, ніж git clone URL-адреса флодера .
Упендра

0

Ось що я знайшов:

Я бачу це:

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

Серед своїх пошуків я натрапив на:

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

Шукайте запис Клінтон. Холл ... Якщо ви спробуєте це (як я зробив), ви, ймовірно, отримаєте access denied відповідь, була моя перша підказка, тому початкова помилка (для мене) насправді ухилялася від неправильного кореня проблема.

Рішення для цього у Windows: переконайтеся, що ви запустите cmdабо git elevated, а потім запустіть

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

Сказане було моїм питанням і просто піднесення працювало для мене.


0

Рішення для Windows- клонувати сховище до іншої папки, а потім скопіювати та вставити у вихідне місце або просто скопіювати .gitневидиму папку.


-1

Видалення с

rm -rf. *

може ввести вас у проблеми або ще деякі помилки.

Якщо у вас є / path / to / folder, ви хочете видалити все, але не цю папку, просто запустіть:

rm -rf / шлях / до / папки / *


-1

Тому я виправив цю саму помилку, видаливши приховану папку .git в моєму кореневому каталозі, а потім додав період до репо-файлу "git clone repo". у моїй папці 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робить.
hackel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.