Git commit/Push/Pull с редкой проверкой

Я начал Git вчера, а до этого я использовал SVN уже много лет. Позвольте мне объяснить вам, чего именно я пытаюсь достичь:

У меня есть главный репозиторий для разных проектов. Что-то вроде этого:

  • main_repo / proj1
  • main_repo / proj2
  • main_repo / proj3

Я не могу создавать отдельные репозитории для этих подпроектов. Теперь я (или другие пользователи) должен иметь возможность извлекать / фиксировать / выдвигать / извлекать в этих независимых проектах.

Для этого я пробую sparse-checkout с помощью следующих команд:

  1. mkdir proj1; cd proj1
  2. git init
  3. git remote add origin https://main_repo
  4. git config core.sparsecheckout true
  5. echo "proj1/" > .git/info/sparse-checkout
  6. 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 addman или же человекмужчина запрашивается обновление записей индекса за пределами текущего разреженного извлечения.

теперь включает в свою справочную страницу :

позволяя удалить файл только из индекса. Когда используются разреженные кассы (см. git sparse-checkout), git rm удалит только пути в шаблонах разреженного оформления заказа.

Во-первых, git - это не svn, разные концепции, разные подходы. Git - это полноценная система контроля версий на клиенте, а не интерфейс для удаленного сервера.

И одно из отличий заключается в том, что вы клонируете весь репозиторий, а не подразделы. Я полагаю, что есть способы создать впечатление, что вы клонировали только подмножество, но на самом деле все репо существует.

В тестировании / использовании, которое я сделал, это не имеет значения. Да, возможно, первоначальное клонирование немного медленнее, но после этого оно действительно быстрое. У моей компании есть большой репозиторий с исходным деревом 4G+, сотни разработчиков, у каждого есть полная копия репозитория, даже если их ответственность может быть разделена на сегменты, даже удаленно через нашу посредственную корпоративную глобальную сеть, проблем не было.

Другие вопросы по тегам