git 更新保留自己分支的裸存储库镜像

fhg3lkii  于 2023-02-28  发布在  Git
关注(0)|答案(1)|浏览(155)

我有自己的GIT服务器,我在其中做了一个公共repo的"裸克隆"。让我们称PUB为公共repo,LOC为我自己服务器上的裸克隆。我使用LOC作为远程开发,创建PUB中没有的我自己的分支。然后我将我的分支推送到LOC。
我想从PUB到LOC获取任何新内容,但我不想自己的任何分支从LOC推送到PUB。
我不能在PUB上做任何操作,因为它不在我的控制范围内。我可以在LOC上做任何操作。
为了达到我所描述的目的,我有一个每晚运行的脚本,它执行:

git --git-dir ${LOC_PATH} remote update --prune

如果我使用将PUB克隆到LOC

git clone --mirror <remote_repo>

然后在脚本执行时,我自己的分支从LOC中被擦除。
如果我使用将PUB克隆到LOC

git clone --bare <remote_repo>

那么脚本似乎成功地将PUB提取到LOC(这是命令输出所建议的);但是用浏览器观察LOC内容或将LOC提取到我的PC上时,我在日志中没有看到我知道存在于PUB中的任何新提交。
阅读其他stackoverflow问题的答案,似乎正确的命令是:

git --git-dir ${LOC_PATH} fetch --all

但目前我坚持使用git ... remote update ...,因为它应该执行隐式fetch操作。
有什么解决方案可以自动更新这种古怪的镜像形式吗?
我看了看:

和一些其他网站上找到的互联网。显然我没有找到可行的解决方案。

wfypjpf4

wfypjpf41#

我检查了我的机器与一些repos和得出以下结论:

  • git remote update确实执行了隐式fetch和...
  • 单独使用git fetch也不能解决这个问题。

在上述操作之后,FETCH_HEAD被创建并指向公共远程存储库(在问题中称为PUB)上的最新提交。由于本地存储库(称为LOC)是一个空存储库,因此不可能在其上执行mergepull。当pull从LOC发出时,最新提交不在那里。
应用FETCH_HEAD的强力解决方案是在LOC上简单地应用git reset --soft FETCH_HEAD。之后,您将看到所有新的提交。
另一种解决方案(如the answer to How do I update my bare repo?中所述)是首先使用git fetch *:*,我找不到将*:*传递给git submodule update的方法,但也许有一种方法。
正如评论中提到的,git clone--mirror选项做的正是它应该做的:它镜像了远程数据库,任何额外的分支或提交都会被丢弃,所以这对于备份来说很好,但是如果你想要的不是一个精确的副本,这就不好了。

相关问题