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

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

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

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

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

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.

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