做网站优化的好处,专业3合1网站建设电话,帮人家做网站怎么赚钱,湛江网站建设一、需求背景
我们公司用gitea搭建了一个git服务器#xff0c;其中支持win7的最高版本是v1.20.6。
我们公司的电脑在任何时候都不能连接外网#xff0c;但是希望将一些开源的仓库移植到内网的服务器来。一是有相关代码使用的需求#xff0c;二是可以建设一个内网能够查阅的…一、需求背景
我们公司用gitea搭建了一个git服务器其中支持win7的最高版本是v1.20.6。
我们公司的电脑在任何时候都不能连接外网但是希望将一些开源的仓库移植到内网的服务器来。一是有相关代码使用的需求二是可以建设一个内网能够查阅的资料库。
外网的仓库是在不断更新的我们不但希望下载到当时版本仓库的内容还要有方法可以同步后续更新的内容。
我们自己也有可能对项目做出修改但是这一部分是和开源项目不一致的内容我们不希望这一部分也被推送。或者说是否同步我们希望自己来决定。
所以总共有这3种使用场景 #mermaid-svg-mnDDBA6oKrQEAIjI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI .error-icon{fill:#552222;}#mermaid-svg-mnDDBA6oKrQEAIjI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mnDDBA6oKrQEAIjI .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-mnDDBA6oKrQEAIjI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mnDDBA6oKrQEAIjI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mnDDBA6oKrQEAIjI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mnDDBA6oKrQEAIjI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mnDDBA6oKrQEAIjI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mnDDBA6oKrQEAIjI .marker.cross{stroke:#333333;}#mermaid-svg-mnDDBA6oKrQEAIjI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mnDDBA6oKrQEAIjI .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mnDDBA6oKrQEAIjI text.actortspan{fill:black;stroke:none;}#mermaid-svg-mnDDBA6oKrQEAIjI .actor-line{stroke:grey;}#mermaid-svg-mnDDBA6oKrQEAIjI .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI .sequenceNumber{fill:white;}#mermaid-svg-mnDDBA6oKrQEAIjI #sequencenumber{fill:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI .messageText{fill:#333;stroke:#333;}#mermaid-svg-mnDDBA6oKrQEAIjI .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mnDDBA6oKrQEAIjI .labelText,#mermaid-svg-mnDDBA6oKrQEAIjI .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-mnDDBA6oKrQEAIjI .loopText,#mermaid-svg-mnDDBA6oKrQEAIjI .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-mnDDBA6oKrQEAIjI .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-mnDDBA6oKrQEAIjI .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-mnDDBA6oKrQEAIjI .noteText,#mermaid-svg-mnDDBA6oKrQEAIjI .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-mnDDBA6oKrQEAIjI .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mnDDBA6oKrQEAIjI .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mnDDBA6oKrQEAIjI .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-mnDDBA6oKrQEAIjI .actorPopupMenu{position:absolute;}#mermaid-svg-mnDDBA6oKrQEAIjI .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-mnDDBA6oKrQEAIjI .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-mnDDBA6oKrQEAIjI .actor-man circle,#mermaid-svg-mnDDBA6oKrQEAIjI line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-mnDDBA6oKrQEAIjI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外网 本地 内网 首次推送 clone push Create 获取外网更新后推送 update pull push Update 本地开发后不影响远端 develop push Not update 外网 本地 内网 二、解决问题
以分布式管理为著称的git自然是可以在无广域网的情况下将本地仓库推送到内网服务器的。但是具体怎么操作呢
2.1 不可行的方法
使用 git push origin 是常规的做法但是只能推送本地分支。当然我可以将远端分支先检出到本地同名分支然后再次推送。但是如果检出之前已经有了本地分支呢我检出的时候不是破坏了已有的本地分支
如果使用 git push origin origin/master会将本地的 origin/master 分支推送到服务器上的 origin/master 分支这么做在Git服务浏览器上是看不到的将来再次克隆的时候也拉不下来。
如果使用 git push origin --mirror 参数推送会将仓库的所有分支推送到 gitea 服务器上但是在Git服务器上啥也看不见。我推测这种方式推送是一比一平移在服务器上存在的 origin/master 分支是看不到的必须是 master 这样的分支才能在服务器中看到。
如果使用 git clone --bare 命令克隆裸仓库然后用 git push --mirror 命令推送到内网这种方法是可行的。但是克隆到本地的裸仓库没有办法继续开发而且克隆的时候如果不是裸仓库呢难道要再克隆一遍吗
2.2 可行的解决方法
前面的方法不可行是因为我将本地的本地分支推送到了远端的本地分支所以未检出到本地的远端分支推送不到远端。
或者是将本地的远端分支推送到了远端的远端分支所以在远端服务器上看不到。
而解决我们的需求需要将本地的远端分支推送到远端的本地分支。
如果在推送命令中添加一个冒号例如git push origin master:main就可以将本地的 master 分支推送到远端的 main 分支。
那么能不能将本地的 origin/master 分支推送到远端的 master 分支呢
git push URL origin/master:master运行报错 错误提示我们没有使用完整引用名称 full refname 。
改为使用完整引用名称然后将分支名 master 替换成通配符 *再加上推送标签的参数 --tags
git push --tags URL refs/remotes/origin/*:refs/heads/*就可以把所有本地的远端分支、以及标签一起推送到内网服务器 在网页端查看已经将所有分支和标签全都推送成功 这样做不需要在本地检出或者创建新分支。
但是会把 HEAD 作为一个分支名也推送上去。。唯一的一点遗憾了。 三、自动化脚本
我写了一个自动化脚本命名 git-push-remotes.bat
echo offREM 读取文件夹名和拼接服务器网址
for %%i in (%cd%) do set name%%~ni
set urlhttp://URL/repos/%name%.gitREM 将本地的所有远端分支推送到远端的本地分支上
git push --tags %url% refs/remotes/origin/*:refs/heads/*
echo.pause将文件复制到已克隆的本地仓库然后双击运行。
就可以自动获取当前文件夹的名称拼接成URL然后推送到同名的内网服务器仓库中。