Как я могу поделиться с кем-нибудь небольшой частью моего репозитория?

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

Однако там есть десятки папок, и не каждая папка в репозитории имеет для него отношение.

Я только недавно начал использовать git и не нашел в Интернете ничего, что подразумевает, что это возможно.

Как я могу поделиться только соответствующими папками в моем репозитории?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
42
2

Ответы 2

Нет простого способа сделать это. В git коммиты представляют собой полные снимки содержимого репо. Чтобы создать версию репо, содержащую только определенные папки, вам нужно будет создать новый набор коммитов только с этими папками, то есть с отдельной историей. Тогда будет сложно интегрировать работу, проделанную над этим репо, обратно в ваше исходное репо.

Это одна из причин, по которой у каждого проекта должно быть собственное репо. Термин «каждый проект» здесь немного расплывчат, но суть в том, что репо должно содержать группу активов, над которыми обычно будут работать / изменяться вместе. Люди, которые привыкли к TFVC и тому подобному, выступают за так называемые структуры «монорепозитория»; если вы используете такую ​​структуру, вы работаете вопреки принципам git.

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

Вот пример.

Предположим, в вашем репозитории есть 4 подпапки (foo1 foo2 foo3 foo4), и вы хотите поделиться 2 из них (foo2 and foo4) со своим коллегой, а ваша ветка - master.

Дерево вашего репозитория:

.
├── foo1
├── foo2
├── foo3
└── foo4

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

1) Сделать ветку без foo1 и foo3:

git checkout -b base master
git rm -rf foo1 foo3
git commit -m 'base for colleague'

2) Создайте бандл с начальной веткой colleague от base для своего коллеги:

git checkout --orphan colleague base
git commit -m 'init colleague'
git bundle create colleague.bundle colleague

3) Поделитесь файлом colleague.bundle с коллегой. Его можно использовать как удаленный репозиторий только для чтения.

4) Ваш коллега клонирует из пакета и создает собственное репо myrepo:

git clone <path to colleague.bundle> -- myrepo
cd myrepo
git checkout -b master origin/colleague
#in the repo, there are only foo2 and foo4
#make his/her changes to foo2 and foo4, and commit them

5) Ваш коллега дает вам свои новые коммиты, и вы их применяете. Вот один из возможных способов:

#your colleague creates a bundle 'return.bundle' and send it to you
git bundle create return.bundle master

#you fetch his/her 'master' from the bundle and apply the new commits to your own 'master'
git fetch <path to return.bundle> master:from_my_colleague
git checkout master
git cherry-pick colleague..from_my_colleague

#after all is done, you could delete those branches
git branch -D base colleague from_my_colleague

Коммитером этих новых коммитов будете вы, а их авторами - ваш коллега. Сначала вы также можете просто отправить свою ветку colleague в реальный удаленный репозиторий и попросить своего коллегу загрузить его и создать из него master. Но это может включать управление репозиторием, такое как создание репозитория и контроль доступа, в то время как пакет является более простым. И, наконец, ваш коллега может просто отправить свой master в настоящий удаленный репозиторий, а затем вы загрузите его в свой репозиторий и примените новые коммиты к вашему master.

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