Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.8k views
in Technique[技术] by (71.8m points)

Git/Github: Manage a forked repository with public and private submodules

I have a forked repository that has three submodules, all of them are public but I want to change one of them for my own private repository. I clone the repository and after that I execute git submodule update --init, git get the public ones, but with the private one git prompts a credential window that avoids downloading.

.submodule file

[submodule "saleor"]
    path = saleor
    url = https://github.com/mirumee/saleor.git
[submodule "saleor-storefront"] -> I want to replace this one with my private repo
    path = saleor-storefront
    url = https://github.com/mirumee/saleor-storefront.git
[submodule "saleor-dashboard"]
    path = saleor-dashboard
    url = https://github.com/mirumee/saleor-dashboard.git

Update 1

With the answer sugested by VonC, a new error occurred, the replaced submodule cannot be downloaded. How to reproduce this error:

  1. I fork saleor-platform repository.
  2. I clone on my machine the forked repository created on step 1:
D:gitestssaleor-platform>git clone https://github.com/<organization>/saleor-platform
  1. Create a new repository to replace saleor-storefront, saleor-storefront is a submodule in saleor-platform the repository forked on step 1.
  2. Replace the submodule as VonC user suggest here, It should be noted that I want to change the saleor-storefront submodule for a private repo inside an organization, and it is a totally new implementation i.e. it only has the initial commit:
D:gitestssaleor-platform>git submodule set-url -- saleor-storefront https://github.com/<organization>/my-new-brand-implementation 
  1. from the parent repository(saleor-platform) check new changes with git status, add new changes git add ., commit the changes git commit -m "Update saleor-storefront submodule":
D:gitestssaleor-platform>git st
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitmodules

no changes added to commit (use "git add" and/or "git commit -a")

D:gitestssaleor-platform>git add .

D:gitestssaleor-platform>git commit -m "Update saleor-storefront submodule"
[master 53b60e5] Update saleor-storefront submodule
 1 file changed, 1 insertion(+), 1 deletion(-)
  1. Push back to my fork:
D:gitestssaleor-platform>git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 353 bytes | 353.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:<organization>/saleor-platform.git
   cbc31e4..53b60e5  master -> master
  1. Finally I clone again my repository:
D:gitests> git clone --recurse-submodules https://github.com/<organization>/saleor-platform saleor-platform2
Cloning into 'saleor-platform2'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (9/9), done.
Receiving objects:  67% (138/205)), reused 3 (delta 0), pack-reused 196
Receiving objects: 100% (205/205), 68.41 KiB | 463.00 KiB/s, done.
Resolving deltas: 100% (99/99), done.
Submodule 'saleor' (https://github.com/mirumee/saleor.git) registered for path 'saleor'
Submodule 'saleor-dashboard' (https://github.com/mirumee/saleor-dashboard.git) registered for path 'saleor-dashboard'
Submodule 'saleor-storefront' (https://github.com/<organization>/my-new-brand-implementation) registered for path 'saleor-storefront'
Cloning into 'D:/git/tests/saleor-platform2/saleor'...
remote: Enumerating objects: 178730, done.
remote: Total 178730 (delta 0), reused 0 (delta 0), pack-reused 178730
Receiving objects: 100% (178730/178730), 100.26 MiB | 2.60 MiB/s, done.
Resolving deltas: 100% (130671/130671), done.
Cloning into 'D:/git/tests/saleor-platform2/saleor-dashboard'...
remote: Enumerating objects: 168, done.
remote: Counting objects: 100% (168/168), done.
remote: Compressing objects: 100% (132/132), done.
remote: Total 38062 (delta 69), reused 71 (delta 32), pack-reused 37894
Receiving objects: 100% (38062/38062), 24.61 MiB | 1.93 MiB/s, done.
Resolving deltas: 100% (25652/25652), done.
Cloning into 'D:/git/tests/saleor-platform2/saleor-storefront'...
remote: Enumerating objects: 113, done.
remote: Counting objects: 100% (113/113), done.
remote: Compressing objects: 100% (98/98), done.
remote: Total 113 (delta 2), reused 113 (delta 2), pack-reused 0
Receiving objects: 100% (113/113), 300.56 KiB | 523.00 KiB/s, done.
Resolving deltas: 100% (2/2), done.
Submodule path 'saleor': checked out '3b31391b92b184b591ef4e85ff6a59cd52cdad98'
Submodule path 'saleor-dashboard': checked out '8bcb8b70878078b74133aea0244dc840d75b492f'
fatal: remote error: upload-pack: not our ref 3ba4ffa8a14f90398462b84e5da088baeb84dfc6
fatal: the remote end hung up unexpectedly
Fetched in submodule path 'saleor-storefront', but it did not contain 3ba4ffa8a14f90398462b84e5da088baeb84dfc6. Direct fetching of that commit failed.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If your git config credential.helper is set (for instance, to manager-core on Windows), the credential Windows should cache your GitHub credentials (GitHub user account/password)

Try first:

git ls-remote https://github.com/<me>/saleor-storefront.git

(replace <me> by your GitHub user account, assuming you have forked saleor-storefront)

Once you have cached your credentials, and git ls-remote does not ask for those anymore, try again to change the submodule URL.

Make sure to change the URL with git submodule set-url, as I suggested in your previous question.

An error message like the remote end hung up unexpectedly Fetched in submodule path 'saleor-storefront', but it did not contain xxx is explained here.

You need for the parent repository (your fork) to add and commit the new remote submodule repository tree SHA1, which should be done through git submodule set-url, and then push that updated fork.


Test: I have forked, then clone saleor-platform.

D:gitestssaleor-platform>git submodule update --init
Submodule 'saleor' (https://github.com/mirumee/saleor.git) registered for path 'saleor'
Submodule 'saleor-dashboard' (https://github.com/mirumee/saleor-dashboard.git) registered for path 'saleor-dashboard'
Submodule 'saleor-storefront' (https://github.com/mirumee/saleor-storefront.git) registered for path 'saleor-storefront'
Cloning into 'D:/git/tests/saleor-platform/saleor'...
Cloning into 'D:/git/tests/saleor-platform/saleor-dashboard'...
Cloning into 'D:/git/tests/saleor-platform/saleor-storefront'...
Submodule path 'saleor': checked out '3b31391b92b184b591ef4e85ff6a59cd52cdad98'
Submodule path 'saleor-dashboard': checked out '8bcb8b70878078b74133aea0244dc840d75b492f'
Submodule path 'saleor-storefront': checked out '3ba4ffa8a14f90398462b84e5da088baeb84dfc6'

Then I forked saleor-storefront.
I replace that submodule by my own forked submodule:

D:gitestssaleor-platform>git submodule set-url -- saleor-storefront https://github.com/VonC/saleor-storefront
Synchronizing submodule url for 'saleor-storefront'

Update the changed .gitmodules:

D:gitestssaleor-platform>git st
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitmodules

no changes added to commit (use "git add" and/or "git commit -a")

D:gitestssaleor-platform>git add .

D:gitestssaleor-platform>git commit -m "Update saleor-storefront submodule"
[master d9f1f79] Update saleor-storefront submodule
 1 file changed, 1 insertion(+), 1 deletion(-)

Push back to my fork

D:gitestssaleor-platform>git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes | 337.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/VonC/saleor-platform
   cbc31e4..d9f1f79  master -> master

Clone again the main repo (my fork) with my forked submodule:

D:gitests> git clone --recurse-submodules https://github.com/VonC/saleor-platform saleor-platform2
Cloning into 'saleor-platform2'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (9/9), done.
Receiving objects:  67% (138/205) 205 (delta 3), reused 3 (delta 0), pack-reused 19666% (136/205)
Receiving objects: 100% (205/205), 68.40 KiB | 454.00 KiB/s, done.
Resolving deltas: 100% (99/99), done.
Submodule 'saleor' (https://github.com/mirumee/saleor.git) registered for path 'saleor'
Submodule 'saleor-dashboard' (https://github.com/mirumee/saleor-dashboard.git) registered for path 'saleor-dashboard'
Submodule 'saleor-storefront' (https://github.com/VonC/saleor-storefront) registered for path 'saleor-storefront'
Cloning into 'D:/git/tests/saleor-platform2/saleor'...
remote: Enumerating objects: 237, done.
remote: Counting objects: 100% (237/237), done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 178889 (delta 93), reused 78 (delta 49), pack-reused 178652
Receiving objects: 100% (178889/178889), 100.57 MiB | 9.63 MiB/s, done.
Resolving deltas: 100% (130714/130714), done.
Cloning into 'D:/git/tests/saleor-platform2/saleor-dashboard'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 37906 (delta 1), reused 1 (delta 0), pack-reused 37894
Receiving objects: 100% (37906/37906), 23.81 MiB | 12.03 MiB/s, done.
Resolving deltas: 100% (25584/25584), done.
Cloning into 'D:/git/tests/saleor-platform2/saleor-storefront'...
remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 34033 (delta 21), reused 15 (delta 8), pack-reused 33987
Receiving objects: 100% (34033/34033), 17.14 MiB | 3.04 MiB/s, done.
Resolving deltas: 100% (23073/23073), done.
Submodule path 'saleor': checked out '3b31391b92b184b591ef4e85ff6a59cd52cdad98'
Submodule path 'saleor-dashboard': checked out '8bcb8b70878078b74133aea0244dc840d75b492f'
Submodule path 'saleor-storefront': checked out '3ba4ffa8a14f90398462b84e5da088baeb84dfc6'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...