git клон через ssh


233

У мене є проект, за яким я створив сховище git:

$ cd myproject  
$ git init  
$ git add .  
$ git commit  

Я хотів створити голий клон на іншій машині:

$ cd ..  
$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git  

Я виконав клон, але жодної відповіді не надрукував. Я увійшов на серверну машину і спробував побачити, як зберігаються файли. Шлях / GitRepos був порожнім, тому я вирішив зробити клон ще раз:

$ git clone --bare myproject  ssh://user@server:/GitRepos/myproject.git

Цього разу відповідь була:

fatal: шлях ssh: // user @ server: /GitRepos/myproject.git 'вже існує і не є порожнім каталогом.

Але я побачив, що шлях порожній.
Що тут відбувається ?


Я не думаю, що біг git clone --bareбуде робити те, що ви думаєте, що це зробить.
Вулфер

3
Для мене ssh: // створив папку замість віддаленого протоколу. Потрібно працювати, використовуючи відповідь @ alec-the-geek. Ви не хочете обрати для цього кращу відповідь - це ваша робота.
akauppi

1
@akauppi: Обов'язок ОП зобов'язаний розглянути всі відповіді, але вони не зобов'язані обирати відповідь, поки вони не будуть задоволені. (Звичайно, не завадить нагадати їм або запитати, яка додаткова інформація їм потрібна, щоб відповідь була прийнятною для них!)
jvriesem

@jvriesem звичайно. Буде видалено "це ваша робота" зараз. Але це стара річ ... :)
akauppi

Відповіді:


219

Це, можливо, не пов'язане безпосередньо з питанням; але одна помилка, яку я щойно зробив сам, і я бачу в ОП, - це специфікація URL-адреси, ssh://user@server:/GitRepos/myproject.gitа саме: у вас є і двокрапка :, і пряма коса риса/ після неї, що означає абсолютний шлях.

Тоді я знайшов клона Git, ssh: Не вдалося вирішити ім'я хоста - git, розробку -git Ніколяса Куттлера (так це була помилка, яку я отримував у версії 1.7.9.5), зазначивши:

Проблема з командою, яку я використовував спочатку, полягала в тому, що я намагався використовувати синтаксис схожий на scp.

... що також було моєю проблемою! Так що в основному gitз ssh, ви або використання

  • ssh://username@host.xz/absolute/path/to/repo.git/ - просто нахил наперед для абсолютного шляху на сервері
  • username@host.xz:relative/path/to/repo.git/- лише двокрапка (вона не повинна мати ssh://відносний шлях на сервері (щодо домашнього режиму usernameна серверній машині)

Сподіваюся, це допоможе комусь,
ура!


84
Це не працює. Якщо ви хочете вказати відносний шлях із ssh, вам доведеться втратити ssh://префікс. Я щойно витратив 20 хвилин, намагаючись зрозуміти це. git clone username@host.xz:relative/path/to/repo.git/повинен працювати.
bobbaluba

2
Спробував це за допомогою git 2.1.4 на Debian 8. Або сугезії не працюють. При першій спробі під / GitRepos не було створено жодного каталогу, а з другої спроби скаржилось, що шлях вже існує. Так само, як повідомлялося про початкову проблему
dlsa

5
Через ваш коментар @bobbaluba (і оновлену відповідь) мені теж не довелося витрачати на це 20 хвилин. Дякую!
olafure

143

Для сховищ на GitHub спробуйте:

git clone ssh://git@github.com/<user>/<repository name>.git

Щоб налаштувати git для клонування за допомогою ssh, див:


це <user> моє ім'я користувача в github чи моя електронна адреса для github? becaause це посилання пропонує мені використовувати адресу електронної пошти під час створення відкритого ключа. help.github.com/en/github/authenticating-to-github/… після спроби цього (порожня парольна фраза для ключового роду ssh) я все-таки не зміг клонувати репо з github. ps Я не додав ключ до агента.
Мінні

те саме працює і для gitlab. до цього нам потрібно включити налаштування ключа SSH, як ви запропонували
Venkataraman R

45

Вам потрібно запустити команду клонування на тому, що ви викликаєте сервер. Але я думаю, що ви не запускаєте ssh-сервер на своєму локальному клієнті, так що він не працюватиме. Запропонуйте дотримуватися такого підходу (перевірте посібник, тому що я це роблю з пам'яті)

  1. Увійдіть у серверну машину.
  2. Створіть голою репо, використовуючи git init --bare
  3. На клієнтській машині ви можете натиснути репо на сервер. git remote add origin ssh://user@server:/GitRepos/myproject.gitслідом за нимgit push origin master

Чудова порада! Деякі нотатки для новачків (як я), які раніше не мали справу з папками pure-server-git: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git перед git init --bare. Тут ви не отримаєте робочої копії - файли та папки repo (як правило, у .git) для вас будуть голі, таким чином, назва прапора. Спасибі
akauppi

2
"git init --bare" не створює каталог .git. Він розміщує файли безпосередньо в папці. Додаючи віддалене походження, я отримую: "" fatal: Не сховище git (або будь-який з батьків до точки монтажу / дому) Зупинка на межі файлової системи (GIT_DISCOVERY_ACROSS_FILESYSTEM не встановлено).
dlsa

10

Відмова від відповідальності: Це лише копія коментаря bobbaluba, який став більш видимим для майбутніх відвідувачів. Це допомогло мені більше, ніж будь-яка інша відповідь.


ssh://При використанні git cloneв якості прикладу ви повинні скинути префікс

git clone git@github.com:owner/repo.git

5

спробуйте це.

Крок 1:

ls -al ~/.ssh

введіть тут опис зображення

Крок 2:

ssh-keygen 

(використовуючи клавішу введення для значення за замовчуванням) введіть тут опис зображення Крок 3: Налаштування конфігураційного файла

vim /c/Users/Willie/.ssh/config

Хост gitlab.com
HostName gitlab.com
Користувач git
IdentityFile ~ / .ssh / id_rsa

Крок 4:

git clone git@gitlab.com:<username>/test2.git

введіть тут опис зображення

Крок 5:
Коли ви закінчите крок 4
1. файл test2.git буде завантажено
2. ви отримаєте новий файл (відомі_хости) у ~ / .ssh
введіть тут опис зображення

PS: Я створюю id_rsa та id_rsa.ub власноруч і доставляю його на сервер Gitlab. використовуючи обидва ключі на будь-якій стороні клієнта (Windows та Linux).


4

Git 101:

gitє децентралізованою системою управління версіями. Вам не потрібен сервер, щоб вставати та працювати з git. Все-таки ви можете зробити це так, як це виглядає круто, правда? (Це також корисно, якщо ви хочете працювати над одним проектом з декількох комп'ютерів.)

Тож для запуску "сервера" вам потрібно запустити, git init --bare <your_project>.gitоскільки це створить порожнє сховище, яке ви зможете імпортувати на ваші машини без необхідності перебирати файли конфігурації у вашому.git реєстрі.

Після цього ви могли клонувати репо для своїх клієнтів, як це повинно працювати, але я виявив, що деякі клієнти (а саме git-gui) не зможуть клонувати репо, повністю порожні. Щоб обійти це, вам потрібно побігтиcd <your_project>.git && touch <some_random_file> && git add <some_random_file> && git commit && git push origin master . (Зверніть увагу, що вам може знадобитися налаштувати своє ім’я користувача та електронну пошту для git цієї машини, якщо ви цього не робили раніше. Фактичні команди для запуску будуть у повідомленні про помилку, яке ви отримаєте, тому я просто їх опущу.)

Тож у цей момент ви можете клонувати сховище на будь-якій машині, просто запустивши git clone <user>@<server>:<relative_path><your_project>.git. (Як зазначають інші, можливо, вам знадобиться встановити префікс, ssh://якщо ви використовуєте абсолютний шлях.) Це передбачає, що ви вже можете увійти з вашого клієнта на сервер. (Ви також отримаєте бонусні бали за налаштування файлу конфігурації та ключів ssh, якщо ви збираєтесь натиснути багато речей на віддалений сервер.)

Деякі відповідні посилання:
Це в значній мірі говорить про те, що вам потрібно знати.
І це для тих, хто знає основні роботи git, але іноді забуває точний синтаксис.


Обидва ці посилання, здається, мертві або не показують того, що ви їх очікували.
Тодд

2

Я хочу спробувати відповідь, що включає в себе git-flow та три 'точки' або випадки використання, центральне сховище git, локальну розробку та виробничу машину. Це недостатньо перевірено .

Я даю неймовірно конкретні команди. Замість того, щоб сказати <your folder>, я скажу /root/git. Єдине місце, де я змінюю оригінальну команду, - це заміна мого конкретного імені сервера на example.com. Я поясню, що мета папок полягає в тому, щоб ви могли її відповідно відрегулювати. Будь ласка, повідомте мене про будь-яку плутанину, і я оновлю відповідь.

Версія git на сервері - 1.7.1. Сервер - CentOS 6.3 (Final).

Версія git на розроблювальній машині - 1.8.1.1. Це Mac OS X 10.8.4.

Центральне сховище та виробнича машина знаходяться на одній машині.

центральний репозиторій, до якого користувачі svn можуть відноситись як "сервер", налаштований наступним чином. У мене є папка, в /root/gitякій я зберігаю всі свої сховища git. Я хочу створити сховище git для проекту, який я називаю "квіти".

cd /root/git
git clone --bare flowers flowers.git

Команда git дала два повідомлення:

Initialized empty Git repository in /root/git/flowers.git/
warning: You appear to have cloned an empty repository.

Не про що хвилюватися.

На розробці машина налаштована так. У мене є папка, /home/kinjal/Sitesкуди я розміщую всі свої проекти. Тепер я хочу отримати центральне сховище git.

cd /home/kinjal/Sites
git clone root@example.net:/root/git/flowers.git

Це доводить мене до того, що я можу почати додавати в нього речі. Я вперше налаштував git flow

git flow init -d

За замовчуванням це знаходиться у відділенні develop. Я зараз додаю свій код тут. Потім мені потрібно скористатися центральним сховищем git.

git add .
git commit -am 'initial'
git push

У цей момент він підштовхнувся до галузі розвитку. Я хочу також додати це до головного відділення.

git flow release start v0.0.0 develop
git flow release finish v0.0.0
git push

Зауважте, що я нічого не робив між початком релізу та закінченням релізу. І коли я закінчив випуск, мені запропонували відредагувати два файли. Це підштовхнуло гілку розвитку до освоєння.

На виробничому майданчику, який знаходиться на тій же машині, що і моє центральне сховище git, я хочу помістити сховище /var/www/vhosts/example.net. У мене вже є /var/www/vhosts.

cd /var/www/vhosts
git clone file:///root/git/flowers.git example.net

Якщо виробнича машина також була б на іншій машині, git cloneкоманда виглядала б як та, яка використовується на розроблювальній машині.


1

Наперед мені трохи не вистачає моїх навичок GIT.

Це збирається клонувати оголене сховище на вашій машині, яке містить лише папки, всередині .gitяких є прихований каталог. виконати, ls -alі ти повинен побачити.git абоcd .git всередині вашого сховища.

Чи можете ви додати опис своїх намірів, щоб хто-небудь, хто має більше навичок GIT, міг допомогти? Що ви насправді хочете робити не так, як плануєте це робити?


Я неправильно трактував команду. Я створив дерево підкаталогу ssh: /myproject.git під поточним каталогом. Я думав, що клоную в віддалений каталог, але те, що насправді робить команда, - це клонування з сховища.
dlsa

0

Я зробив: git clone --bare "/ GITREPOSITORIES / RepoA" "ssh: // luc @ EERSTENASDS119J / volume1 / RepoA" Результат: фатальний: шлях шляху ssh: // luc @ EERSTENASDS119J / том1 / RepoA 'вже існує і є не порожній каталог.

Система створила каталог ssh: // luc @ EERSTENASDS119J / volume1 / RepoA в моєму поточному шляху.

Отже, клон git не інтерпретував специфікацію URL-адреси. Використовували обхід Alec.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.