GIt - различия в структуре dir между клоном и подмодулем - PullRequest
0 голосов
/ 06 января 2012

Надеясь, что кто-то может знать объяснение этого непоследовательного поведения. У меня была эта проблема как с публичными репозиториями, так и с собственными репозиториями проекта, но, например, ради этого я буду использовать Facebook SDK от GitHub .

Если я клонирую этот репо, он извлекается в папку с именем php-sdk. Этого вполне ожидаемо, хотя в списке файлов репо на GitHub эта папка не отображается.

Если я клонирую его как подмодуль в другом проекте (что было бы довольно распространенной операцией для такого SDK, как этот), я просто получаю содержимое папки, непосредственно выводимой в выбранный каталог.

У меня также случалось так, что когда я оборачиваю все файлы моего проекта в каталог и фиксирую его в репозитории, он иногда не появляется в этой структуре при клонировании (тот же вывод, что и в примере с подмодулем выше). Изменение префикс имени .git dir, похоже, меняет это, но не влияет на результат команды submodule.

Есть ли причина, по которой все эти команды ведут себя по-разному, обрабатывая первый каталог в структуре репо? Я неправильно понимаю, как хранить мои файлы в репо? Полагаю, вы можете подать это с небольшими неудобствами, но я хотел бы получить условные обозначения, чтобы сделать мои репозитории более удобными для клонирования.

1 Ответ

2 голосов
/ 06 января 2012

Как правило, в хранилище нет директории «обертывания». Ваши ожидания, что таковые есть, - это то, что вводит вас в заблуждение. По умолчанию Git-репозиторий является каталогом .git. Ваша песочница или извлеченный материал находятся на том же корневом уровне, что и папка .git. Когда вы создаете клон, он автоматически проверяет ветку master. Папка .git и извлечение являются фактическим корнем вашего рабочего пространства git.

Обычно Git выводит имя и создает каталог для вашего рабочего пространства, когда вы используете команды clone и git submodule add. Он создаст каталог и затем поместит git repo (эту папку .git), а затем извлечет в него файлы основной ветки. Тем не менее, вы можете указать git clone <repo> . или git clone <repo> <target_dir>, и Git разместит корень вашего репо и извлечения в любом месте.

Так что, если вы создали репо, как это:

mkdir repo.git
cd repo.git
git init
touch foo
git add foo
git commit -m "Initial commit"

Когда вы позже клонируете его с помощью git clone repo.git, только по соглашению он помещается в подкаталог с именем repo, в котором есть файл с именем foo и каталог .git. Однако repo является корневым каталогом извлечения, а не текущим (вы можете сказать, что в нем будет каталог .git). Каталог, из которого вы запускали клон, НЕ будет каталогом, в котором хранится каталог .git или checkout. Если вы хотите, чтобы вы сделали git clone <repo> ., то вы увидите только файл с именем foo и каталог с именем .git, а не каталог с именем repo.

Если вы хотите, чтобы всегда существовал каталог с именем repo, в который вложен весь источник, то вы бы создали репозиторий следующим образом:

mkdir repo.git
cd repo.git
git init
mkdir repo
cd repo
touch foo
git add foo
git commit -m "Initial commit"

Затем, когда вы клонируете его, просто используя git clone <uri>/repo.git, у вас будет каталог с именем repo, содержащий каталог .git, и каталог с именем repo, содержащий файл foo. По моему мнению, это слой косвенности, который может быть громоздким (я знаю, я сделал это ... однажды).

Подмодули - это запись в основном репо, представляющая собой просто каталог, содержащий другое git-репо при определенной проверке. Когда вы запускаете и обновляете субмодуль в первый раз, он в основном просто создает каталог, зарезервированный для субмодуля основным репо, а затем извлекает все это git-репо и извлекает его в этот каталог. Поскольку теперь вы должны понимать, что git-репо - это, как правило, каталог .git и извлечение его вместе с ним, должно быть очевидно, почему в этом каталоге также не будет другого каталога упаковки. Вы в основном назвали каталог, в который должен быть вложен подмодуль при использовании команды git submodule add <repo> [<target_dir>].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...