2012-01-05 2 views
0

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

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

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

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

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

ответ

2

В основном нет каталога 'wrapping', хранящегося как часть репозитория. Ваши ожидания, что есть один, - это то, что вводит вас в заблуждение. Git repo по умолчанию - это каталог с именем .git. Ваша песочница или материал, который выгружен, размещается на том же корневом уровне, что и папка .git. Когда вы делаете клон, он автоматически проверяет основную ветку. Папка .git и checkout - это фактический корень вашего рабочего пространства 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.

Если вы хотите всегда быть директория репо вложенности все источник в то вы бы сотворенной репо, как это:

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.По-моему, это слой косвенности, который может быть громоздким (я знаю, я сделал это ... один раз).

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

Смежные вопросы