мерзавец клон через 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. Не могли бы вы выбрать предпочтительный ответ для этого - это ваша работа.
Акауппи

1
@akauppi: ФП отвечает за рассмотрение всех ответов, но они не обязаны выбирать ответ, пока не будут удовлетворены. (Конечно, не мешало бы напомнить им или спросить, какая дополнительная информация им нужна, чтобы ответ был приемлемым для них!)
jvriesem

@jvriesem конечно. Убрал бы "это твоя работа" сейчас. Но это старая вещь ... :)
akauppi

Ответы:


219

Возможно, это не связано непосредственно с вопросом; но одна ошибка, которую я только что сделал сам и вижу в OP, - это спецификация 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/должно сработать.
Боббалуба

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? потому что эта ссылка предлагает мне использовать адрес электронной почты во время генерации открытого ключа. help.github.com/en/github/authenticating-to-github/… после попытки этого (пустая фраза-пароль для ключа ssh), я все еще не мог клонировать репо из github. ps я не добавил ключ к агенту.
Минни

то же самое работает и для gitlab. до этого нам нужно включить настройку ключа SSH, как вы предложили
Venkataraman R

45

Вам нужно выполнить команду clone на том, что вы называете сервером. Но держу пари, что вы не используете ssh-сервер на локальном клиенте, так что он все равно не будет работать. Предложите вам следовать этому подходу (проверьте руководство, потому что я делаю это по памяти)

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

Отличный совет! Некоторые заметки для новичков (таких как я), которые раньше не имели дело с чисто-серверными-git-папками: 2. cd / GitRepos; mkdir myproject.git; cd myproject.git перед git init --bare. Вы не получите рабочую копию здесь - файлы и папки репозитория (обычно в .git) будут вам не нужны, поэтому и название флага. Спасибо
akauppi

2
"git init --bare" не создает каталог .git. Он помещает файлы прямо в папку. При добавлении удаленного источника я получаю: "" fatal: не git-репозиторий (или любой родительский объект до точки монтирования / home) Остановка на границе файловой системы (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. Вы
получите новый файл (known_hosts) в ~ / .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-репозиторий для проекта, который я называю 'flowers'.

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" Результат: fatal: путь назначения 'ssh: // luc @ EERSTENASDS119J / volume1 / RepoA' уже существует и существует не пустой каталог.

Система создала каталог ssh: // luc @ EERSTENASDS119J / volume1 / RepoA в моем текущем пути.

Так что git clone не интерпретировал спецификацию URL. Использовал обходной путь Алек.


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