Git commit/Push/Pull с редкой проверкой
Я начал Git вчера, а до этого я использовал SVN уже много лет. Позвольте мне объяснить вам, чего именно я пытаюсь достичь:
У меня есть главный репозиторий для разных проектов. Что-то вроде этого:
- main_repo / proj1
- main_repo / proj2
- main_repo / proj3
Я не могу создавать отдельные репозитории для этих подпроектов. Теперь я (или другие пользователи) должен иметь возможность извлекать / фиксировать / выдвигать / извлекать в этих независимых проектах.
Для этого я пробую sparse-checkout с помощью следующих команд:
mkdir proj1; cd proj1
git init
git remote add origin https://main_repo
git config core.sparsecheckout true
echo "proj1/" > .git/info/sparse-checkout
git pull origin master
Теперь мне нужно получить все файлы, присутствующие в proj1, в одном и том же текущем каталоге. Я получаю что-то вроде этого:
/proj1/proj1/files_and_dirs_in_proj1
Что мне нужно:
/proj1/files_and_dirs_in_proj1
Во-вторых, это то, что checkout-dir не ведет себя как git-репо. Это не несет.git Dir. Так что я не понимаю, как делать коммиты / push / pull в редких проверенных проектах.
Надеюсь, я объяснил это хорошо. Пожалуйста, предложите.
3 ответа
Если я вас правильно понял, вы хотите:
- создать репозиторий git с тремя проектами внутри него (подпапки proj1, proj2, proj3)
- создать отдельные каталоги для каждой команды, работающей над своим проектом (например, teamproj1, teamproj2, teamproj3)
- в этих папках должны быть только файлы, относящиеся к соответствующему проекту (например, в папке teamproj1 есть только подпапка proj1 и т. д.)
В этом случае вы можете использовать следующие простые шаги:
1) Добавьте свой основной репо в git
git init
git remote add origin ...
git add .
git commit -m 'Initial commit'
git push
2) Клонируйте и настраивайте свои репозитории для каждой команды (teamproj1, teamproj2, teamproj3, ...). Повторите код ниже для каждой команды / проекта
git clone ... teamproj1
cd teamproj1
git config core.sparsecheckout true
echo 'proj1' › .git/info/sparse-checkout
git read-tree -m -u HEAD
3) Бинго. Каждая команда будет со своей папкой и проектом. Эта папка является обычным git-репо, но этот репо покажет только некоторые файлы, которые будут в .git/info/sparse-checkout
Я добавил несколько рисунков, чтобы облегчить понимание этой схемы
Недавний Я упоминаю здесь, что может помочь, особенно в сочетании с git clone --filter=blob:none --no-checkout
git clone --filter=blob:none --no-checkout https://github.com/<me>/<myrepo>
git config core.sparseCheckoutCone false
git sparse-checkout disable
# Add the expected pattern, to include just a subfolder without top files:
git sparse-checkout set /mySubFolder/
# populate working-tree with only the right files:
git read-tree -mu HEAD
Кроме того, с Git 2.32 (второй квартал 2021 г.) " " ( ) и ( ) научился не трогать те дорожки, которые находятся за пределами редкой кассы.
Таким образом, вы не ошибетесь с путями за пределами соответствующих подмодулей.
См. , фиксацию a20f704, фиксацию b243012, фиксацию 719630e, фиксацию d73dbaf, фиксацию 6594afc, фиксацию 4e95698 (8 апреля 2021 г.) Матеус Таварес (
matheustavares
) .
(Слияние Junio C Hamano -
gitster
- в коммите fe069dc, 07 мая 2021 г.)
Фиксацию d5f4b82: соблюдать разреженные шаблоны оформления заказа
Предложено: Элайджа Ньюрен
Подписано: Матеус Таварес
( ) воздерживается от добавления или обновления записей указателя, которые находятся за пределами текущей разреженной проверки, но ( ) не придерживается такого же ограничения.
Это несколько нелогично и непоследовательно.
Так сделайrm
соблюдайте правила разреженности и посоветуйте, как удалитьSKIP_WORKTREE
записи так же, какadd
делает.
Также добавьте несколько тестов для нового поведения.
git config
теперь включает в свою справочную страницу :
Совет отображается, когда либо мужчина
git add
man или же человекмужчина запрашивается обновление записей индекса за пределами текущего разреженного извлечения.
теперь включает в свою справочную страницу :
позволяя удалить файл только из индекса. Когда используются разреженные кассы (см.
git sparse-checkout
),git rm
удалит только пути в шаблонах разреженного оформления заказа.
Во-первых, git - это не svn, разные концепции, разные подходы. Git - это полноценная система контроля версий на клиенте, а не интерфейс для удаленного сервера.
И одно из отличий заключается в том, что вы клонируете весь репозиторий, а не подразделы. Я полагаю, что есть способы создать впечатление, что вы клонировали только подмножество, но на самом деле все репо существует.
В тестировании / использовании, которое я сделал, это не имеет значения. Да, возможно, первоначальное клонирование немного медленнее, но после этого оно действительно быстрое. У моей компании есть большой репозиторий с исходным деревом 4G+, сотни разработчиков, у каждого есть полная копия репозитория, даже если их ответственность может быть разделена на сегменты, даже удаленно через нашу посредственную корпоративную глобальную сеть, проблем не было.