GIT клонують репо в локальній файловій системі у Windows


200

Я повний Noob, коли справа стосується GIT. Я тільки робив свої перші кроки за останні кілька днів. Я налаштував репо на своєму ноутбуці, зняв ствол з проекту SVN (були деякі проблеми з гілками, не працював у них), але там все здається нормальним.

Тепер я хочу мати можливість тягнути або натискати з ноутбука на основний робочий стіл. Причина в тому, що ноутбук - це зручно у поїзді, оскільки я витрачаю 2 години на день, подорожуючи і можу зробити добру роботу. Але моя головна машина вдома чудово підходить для розвитку. Тож я хочу, щоб повертатися / тягнути з ноутбука до основного комп'ютера, коли повертаюся додому. Я подумав, що найпростішим способом зробити це буде просто розділити папку коду в локальній мережі та зробити:

git clone file://192.168.10.51/code

на жаль, це, здається, не працює для мене:

тому я відкриваю gd bash cmd і набираю вищезгадану команду, я перебуваю в C: \ code (спільна папка для обох машин). Це те, що я повертаю:

Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

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

Будуть і інші місця, які будуть офіційними точками зберігання та місцями, з яких будуть тягнути інші розробники та сервер CI тощо. Це просто так, що я можу працювати над тим же репо на двох машинах.

За пропозицією Себастьяна я отримую наступне:

C:\code>git clone --no-hardlinks file://192.168.10.51/code
Initialized empty Git repository in C:/code/code/.git/
fatal: 'C:/Program Files (x86)/Git/code' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

** РЕДАКТУВАТИ - ВІДПОВІДЬ **

Дякую всім, що допомогло. Я спробував картографувати драйв, і це спрацювало так, що я подумав, що я повернуся та спробую без картування. Кінцевим результатом було:

git clone file://\\\\192.168.0.51\code

Це спрацювало чудово.

Дякую


file: //192.168.10.51/code аж ніяк не є дійсним URI, що вказує на файл, тоді як файл: // C: \ foo \ bar.txt є
Gregory Pakosz

Тоді як я можу вказати на віддалену машину з таким посиланням?
Джон

Напевно, ви хочете зіставити мережевий диск.
Джош Лі

працював для мене - зауважте, це характерно для Windows і не буде працювати з git bash у windows - потрібно використовувати cmd або powershell
Дейв

також спробував це в cmd, але це справді працює. А також що таке "код" у "файлі клонування git: // \\\\ 192.168.0.51 \ code" означає? Я замінив його на "C: / UniserverZ / www / sampleProject /", і він не працював. Там сказано, що це не сховище git
boi_echos

Відповіді:


177

Ви можете вказати URL-адресу віддаленого пристрою, застосувавши до протоколу файлу шлях UNC . Для цього потрібно використовувати чотири косої риски:

git clone file:////<host>/<share>/<path>

Наприклад, якщо ваша основна машина має IP 192.168.10.51 та ім'я комп'ютера main, і вона має спільну назву, codeяка сама є сховищем git, то обидві наступні команди повинні працювати однаково:

git clone file:////main/code
git clone file:////192.168.10.51/code

Якщо сховище Git знаходиться у підкаталозі, просто додайте шлях:

git clone file:////main/code/project-repository
git clone file:////192.168.10.51/code/project-repository

2
чи є спосіб автентифікувати (тобто ім'я користувача / пароль) за допомогою цієї схеми?
інтуїтивно,

1
@majgis Я майже використовую лише Windows, тому моє рішення працює для Windows.
ткнути

1
так, це найкращий спосіб зробити це у Windows.
Ніколас ДіПіацца

3
Можна також скористатися протоколом: //// user: password @ host: notation port / notation, наприклад: file: /// user: password@192.168.10.51/code
pistache

1
@OderWat За винятком того, що використання localhost зовсім не допоможе вам при спробі доступу до іншого комп’ютера, про що йшлося. Якщо ви хочете отримати доступ до локального сховища, тобто локально у вашій файловій системі, ви можете просто використовувати локальний шлях без використання файлового протоколу…
pke

125
$ git clone --no-hardlinks /path/to/repo

Наведена вище команда використовує позначення шляху POSIX для каталогу із вашим сховищем git. Для Windows це (каталог C:/path/to/repoмістить .gitкаталог):

C:\some\dir\> git clone --local file:///C:/path/to/repo my_project

Сховище буде клоновано до C:\some\dir\my_project. Якщо ви пропустите file:///частину, тоді --localваріант мається на увазі.


7
Це працювало для мене для файлових шляхів із пробілами: git clone -l файл: // "C: \ ДЕЯКА ПАТ \ З ПРОСТОРОМ" my_project
Себастьян Паттен

1
Чудова допомога. Це працює для мене в моїй машині Windows 7. <З командного рядка git bash> щось на кшталт: файл клонування git: /// C: / Users / username / repsitoryName
Forhad

ви, ймовірно, захочете встановити пульт після цього .. інакше він вказує на ваш інший локальний як джерело, який я вважаю супер схильним до помилок. використовувати git remote -v; git remote rm походження; git add origin <repo-address> (який ви можете скопіювати, виконавши git remote -v на оригінальному локальному репо)
Hanan,

Це правильно, вам не потрібно використовувати форму URL, як файл: ////, ви можете просто клонувати каталог.
Пітер Н. Штайнмет

14

відповідь з ім'ям хоста для мене не працював, але це:

файл клонування git: ////home/git/repositories/MyProject.git/


1
Схоже, у вас занадто багато косої риски після "file:". Для мене магічне число було 3 косою рискою
Марк Ф Герра

Дивно. Чотири косої риски дали мені фатальну помилку. Це працювало (для мене) лише з трьома.
Big McLargeHuge

4
Мій трюк, щоб з'ясувати синтаксис, який працює, - це створити файл txt у папці та перетягнути його, щоб відкрити у браузері. З'являється правильний URL-адрес для файлу.
AnneTheAgile

7

Мені вдалося це зробити за допомогою файлу: //, але з одним додатковим нахилом для позначення абсолютного шляху.

git clone file:///cygdrive/c/path/to/repository/

У моєму випадку я використовую Git на Cygwin для Windows, який ви можете бачити через / cygdrive / c частини моїх шляхів. З деяким підходом до шляху він повинен працювати з будь-якою установкою git.

Додавання пульта працює так само

git remote add remotename file:///cygdrive/c/path/to/repository/

6

Можливо, відобразити частку як мережевий диск, а потім зробити

git clone Z:\

Переважно лише здогадка; Я завжди роблю ці речі за допомогою ssh. Після цього, звичайно, буде означати, що вам потрібно буде мати цей диск відображатися кожного разу, коли ви натискаєте / тягнете до / з ноутбука. Я не впевнений, як ви налаштовуєте SSH для роботи під Windows, але якщо ви будете робити це багато, можливо, варто вивчити.


@Carlos: Я думаю, що це спрацює лише в тому випадку, якщо ви не перейшли cdна інший каталог на Z:диску. IIRC; Я не був користувачем Windows довгий час. Також можливо, що gitінтерпретує букви диска на відміну від стандартної системи Windows. Ви пробували `Z:`?
інтуїтована

Помилка ... що повинно було прочитати "Ви спробували` Z: \ `?". Ну, за винятком правильного втечі, щоб режим коду ввімкнувся .. #nurrrr .. Гадаю, ні, все одно.
інтуїтоване

3

Не впевнений, це було через мою версію git (1.7.2) чи що інше, але підходи, перелічені вище з використанням імені машини та параметрів IP, не працювали для мене. Додатковою деталлю, яка може / не може бути важливою, є те, що репо було голим репо, яке я ініціалізував і підштовхував до іншої машини.

Я намагався клонувати проект1, як було зазначено вище, такими командами, як:

$ git clone file:////<IP_ADDRESS>/home/user/git/project1
Cloning into project1...
fatal: '//<IP_ADDRESS>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

і

$ git clone file:////<MACHINE_NAME>/home/user/git/project1
Cloning into project1...
fatal: '//<MACHINE_NAME>/home/user/git/project1' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Що зробили роботу для мене було що - то простіше:

$ git clone ../git/project1
Cloning into project1...
done.

Зауважте - навіть якщо репо, з якого клонували, було голим, це створило "звичайний" клон із усіма фактичними файлами коду / зображення / ресурсів, на які я сподівався (на відміну від внутрішніх даних git repo).


1

Або введіть абсолютні шляхи або відносні шляхи.

Наприклад, перший нижче використовує абсолютні шляхи:

(це зсередини папки, яка містить сховище та резервну копію як папки. Також пам’ятайте, що папка резервного копіювання не змінюється, якщо вона вже містить що-небудь. Якщо її немає, буде створена нова папка)

~/git$ git clone --no-hardlinks ~/git/git_test1/   ~/git/bkp_repos/

Нижче використовуються відносні шляхи:

~/git$ git clone --no-hardlinks git_test1/   bkp_repos2/

0

Хоча шлях до UNC підтримується з Git 2.21 (лютий 2019, див. Нижче), Git 2.24 (Q4 2019) дозволить

git clone file://192.168.10.51/code

Більше file:////xxx, ' file://' достатньо для посилання на частку шляху UNC.
Див. " Помилка отримання Git із UNC ".


Зауважте, що з 2016 року та MingW-64, що постачаєтьсяgit.exe з Git для Windows , підтримується шлях UNC.
(Див. " Як msys, msys2 та MinGW-64 пов'язані один з одним? ")

І з Git 2.21 (лютий 2019) ця підтримка поширюється навіть на оболонці msys2 (з цитатами навколо шляху UNC).

Див. Команду 9e9da23 , фіксування 5440df4 (17 січня 2019 р.) Йоганнеса Шинделіна ( dscho) .
Допомогла: Кім Гібельс ( Jeff-G) .
(Об’єднав Хуніо С Хамано - gitster- в комітеті f5dd919 , 05 лютого 2019 року)

Перед тим, як Git 2.21, через химерність методу Git для нерестування git-upload-pack, виникає проблема при проходженні шляхів із зворотними косою рисою: Git змусить командний рядок через оболонку, яка має різну семантику цитування в Git для Windows (будучи MSYS2 програма), ніж звичайні виконувані файли Win32, такі як git.exeсама.

Симптом є те , що перший з цих двох зворотних косих рис в UNC шляхах виду \\myserver\folder\repository.gitє відганяє .

Зараз це пом'якшено:

mingw: аргументи спеціального випадку до sh

Виконання MSYS2 робить все можливе, щоб імітувати розширення та зняття котирування командного рядка, яке виконувало б оболонка Unix, що викликає в системах Unix.

Ці правила котирування оболонки Unix відрізняються від правил котирування, що застосовуються до cmd Windows та Powershell, що робить трохи незручним правильне цитування параметрів командного рядка при нерестуванні інших процесів.

Зокрема, git.exeпередає аргументи субпроцесам, які не призначені для інтерпретації як символи підстановки, і якщо вони містять зворотні косої риси, вони не повинні інтерпретуватися як символи втечі, наприклад, при проходженні шляхів Windows.

Примітка. Це лише проблема під час виклику виконуваних файлів MSYS2, а не при виклику таких файлів MINGW, як git.exe. Однак ми часто викликаємо MSYS2 виконувані файли, особливо це стосується встановлення use_shellпрапора в структурі child_process.

Немає елегантного способу визначити, чи .exeфайл, який потрібно виконати, це програма MSYS2 або MINGW.
Але оскільки випадок використання для передачі командного рядка через оболонку настільки поширений, нам потрібно обходити цю проблему хоча б під час виконання sh.exe.

Давайте введемо некрасивий жорсткий тест, чи argv[0]є " sh", і чи відноситься він до MSYS2 Bash, щоб визначити, чи потрібно цитувати аргументи інакше, ніж зазвичай.

Це все ще не вирішує проблему повністю, але принаймні це щось.

Між іншим, це також вирішує проблему, коли git clone \\server\repoне вдалося через неправильне поводження з косою косою рисою під час передачі шляху до git-upload-packпроцесу.

Далі нам потрібно подбати про те, щоб процитувати не тільки пробіли та зворотні риси, але й фігурні дужки.
Оскільки псевдоніми часто проходять через MSYS2 Bash, і оскільки псевдоніми часто отримують такі параметри, як HEAD@{yesterday}це, це дійсно важливо.

Побачити t/t5580-clone-push-unc.sh


0

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

Рішення: Там, де репонується клопотання, відкрийте папку .git та конфігураційний файл.

Для встановленого URL-адреси віддаленого походження:

[remote "origin"]
    url = file:///C:/Documentation/git_server/kurmisoftware
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.