Как сделать внешний репозиторий и встроенный репозиторий работать как общий/автономный репозиторий?

У меня есть большой проект (скажем, 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

  1. Если я нахожусь на пути 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 )
    
  2. Если я нахожусь на пути 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/  )
    
  3. Как только я хочу 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/ 

который легко пропустить.