Как сделать внешний репозиторий и встроенный репозиторий работать как общий/автономный репозиторий?
У меня есть большой проект (скажем, A repo
), и в нем есть одна дочерняя папка, пришедшая из B repo
. Я бы встретил предупреждение, как показано ниже, когда я фиксирую из A repo
warning: adding embedded git repository: extractor/annotator-server
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint: git submodule add <url> extractor/annotator-server
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint: git rm --cached extractor/annotator-server
hint:
hint: See "git help submodule" for more information.
Я видел git-submodule
и git-subtree
:
Поддержание Git-репо внутри другого Git-репо
https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
Но они мне не нравятся, потому что им нужен дополнительный конфиг.
То, что я хочу, например:
структура как:
A/
--- a.py
--- B/
--- B/b.py
Когда я меняю B/b.py
-
Если я нахожусь на пути A/
, git add
может обнаружить изменение B/b.py
, git push
только B/b.py
это в репо.
git add . (would add changes under A/ )
git push (would push changes under A/ )
git pull (would pull changes under A/ )
git clone XXX:A (would clone all files under A/ , A/B/ is just looks like plain folder with all files, not a repo )
-
Если я нахожусь на пути A/B/
, git add
только добавляет изменения B/b.py
в B repo, и git push
только фиксирует это в B repo.
git add . (would add changes under B/ , but not add changes to A repo)
git push (would push changes under B/ , but not push changes to A repo)
git pull (would clone changes under B/ , )
git clone XXX:B (would clone all files under B/ )
-
Как только я хочу snyc A и B на другой машине, просто сделать
git clone A
rm -rf A/B/
git clone B ./B
git add . && git commit 'sync with B'
Другими словами, A и B действуют как отдельное репо.
Но правда в том, что репо рассматривает репо как субмодуль:
Репо https://github.com/eromoe/test
B репо https://github.com/eromoe/test2
Как заставить репо отслеживать все файлы в A/
, а репо B отслеживать все файлы в A/B/
? Я хочу, чтобы A и B действовали как автономное хранилище без каких-либо других настроек.
Ответы
Ответ 1
Вы можете использовать команды ниже для добавления файлов из test2 repo для проверки репо, как показано ниже:
# In local test repo
rm -rf test2
git clone https://github.com/eromoe/test2
git add test2/
git commit -am 'add files from test2 repo to test repo'
git push
Примечание:
Вы должны использовать git add test2/
(с косой чертой, а не git add test2
).
git add test2/
будет относиться к папке test2
и будет использоваться как обычная папка и файл для тестового репо (режим создания 100644
).
git add test2
будет обрабатывать папку test2
как подмодуль для тестового репо (режим создания 160000
).
Ответ 2
Возможно, git напомнил хранилище. Это помогло мне:
git rm --cached your_folder_with_repo
git commit -m "remove cached repo"
git add your_folder_with_repo/
git commit -m "Add folder"
git push
Ответ 3
Если вам не нужна точная версия B A, вы можете сохранить текущую настройку (вложенные git repos).
У вас будет предупреждение "встроенное репо", но помимо этого оба РЕПО будут вести себя так, как вы ожидаете, каждый из которых добавляет, совершает и толкает только свои репозитории.
Примечание: вы можете сделать это предупреждение коротким/пустым с помощью git config advice.addEmbeddedRepo
Ответ 4
@rost shan Ваш ответ работал для меня, чтобы вставить субмодули после получения предупреждения, например, предупреждение: добавление встроенного репозитория git: your_repo_folder.
git rm --cached your_folder_with_repo
Примечание: это "ca c hed", а не "ca s hed".
@Marina Liu - в ответе MSFT подчеркивается конец косой черты "/" после
git add your_repo_folder/
который легко пропустить.