如何在GitHub上推送我的开源库,当它作为封闭源代码git存储库的子模块 checkout 时?

xfb7svmp  于 2022-10-23  发布在  Git
关注(0)|答案(1)|浏览(169)

我的情况是这样的:我是GitHub上开源library的维护者,作为我工作的一部分,我还负责各种开源(非基于GitHu的)git存储库。这些封闭源代码git存储库中的许多都作为子模块链接到我在GitHub上的开源库。
正因为如此,我经常会在一个封闭源代码存储库中工作,我会在我的开放源代码库中遇到一些我想改变的东西。我将在子模块中进行更改并构建和测试它,然后我想提交它并将更改推送到GitHub……直到大约四个月前,这一切都很好——但最近GitHu已经收紧了他们的安全策略,因此他们不再接受来自基于https的存储库 checkout 的推送,而只接受来自ssh存储库签入的推送。
然而,我的封闭源代码存储库中的.gitmodules文件都被配置为通过https URL checkout 开放源代码子模块(这样我的同事就可以在不知道我的GitHub登录信息的情况下git submodule update --init --recursive子模块),这意味着GitHub不会让我推送我的更改。
为了清晰起见,下面是我的.gitmodules文件中的相关摘录:

[submodule "submodules/muscle"]
    path = submodules/muscle
    url = https://github.com/jfriesne/muscle.git

我的解决方法是在我的机器上对开源库进行单独的(基于ssh的) checkout ,并手动将任何本地更改的文件复制到该库,从那里进行提交和推送,然后返回到我的子模块,执行git stash,然后执行m1n 8o1p。这是可行的,但手动复制文件有点繁琐,容易出错。我怀念能够像过去那样做一个简单的cd submodules/muscle ; git commit -mblah ; git push
我的问题是,有没有办法向GitHub认证自己,以便我可以直接将更改推送到https checkout 的子模块?

klr1opcd

klr1opcd1#

你仍然可以通过https推送,你只需要使用GitHub“令牌”(过期,这意味着你必须时不时地重新生成并更新它们,这是一个痛苦)。
要通过ssh访问GitHub,即使URL是https://github.com/<path>,也可以考虑使用Git的insteadOf特性。这个特定的功能配置起来有点混乱,但一旦完成,就可以直接使用:

git config --global url.ssh://git@github.com/jfriesne/muscle.git.insteadOf https://github.com/jfriesne/muscle.git

配置选项的是将出现在某些.git/config文件的remote.*remote*.url条目中的URL。已配置选项的nameurl开头,以m1on5o1p结尾,并具有通常的点,但在这两个点之间插入replacementURL。
(如果github.com的ssh配置指定了User git,则可以从url.*replacement*.insteadOf = *original*设置中省略git@the git config documentation中的短语有点混乱,因为它描述了完全通用的形式,即只替换URL的前缀,保留其余部分:例如,可以使用它使所有github.com访问都使用ssh。)

相关问题