[{"data":1,"prerenderedAt":873},["ShallowReactive",2],{"\u002Farticle\u002Fdetail\u002F20250909215534":3,"\u002Farticle\u002Fdetail\u002F20250909215534-surround":862},{"id":4,"title":5,"articleId":6,"articleThumb":7,"body":8,"categoryId":331,"categoryInfo":831,"createDate":835,"description":836,"excerpt":837,"extension":841,"isHidden":842,"isHot":843,"isRecommend":842,"isTop":842,"keywords":844,"meta":845,"navigation":843,"path":846,"rawbody":847,"readingTime":848,"seo":849,"sitemap":850,"stem":851,"tagIds":852,"tagInfo":853,"updateDate":859,"wordCount":860,"__hash__":861},"blog\u002Fblog\u002F2.github仓库代码和gitee仓库代码双向自动同步方案.md","github仓库代码和gitee仓库代码双向自动同步方案","20250909215534","https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20260327203348205.webp",{"type":9,"value":10,"toc":815},"minimark",[11,15,18,21,24,29,41,53,59,72,78,85,90,93,102,125,136,139,143,146,155,200,203,206,209,220,228,232,239,243,249,253,259,263,266,283,470,473,477,486,497,501,504,509,518,523,530,535,545,691,698,711,714,790,793,797,800,803,807,811],[12,13,14],"p",{},"到目前为止，想要实现在本地提交代码至Github仓库时，同时更新至Gitee仓库是可行的。相反，想要在本地提交代码至Gitee仓库时，同时更新至Github仓库也可以实现的。无论我们使用Github还是Gitee任意一个远程仓库，在代码提交时，头可以自动同步到另一个远程仓库，即所谓的双向自动同步(可推送至远端仓库，亦可从远端仓库同步更新)。当然，日常开发中，按照个人喜好，我们只需要选择一种即可。",[12,16,17],{},"Github同步代码至Gitee或者是从Gitee更新代码，都需要借助Github Actions功能。GitHub Actions‌ 是 GitHub 提供的持续集成与持续交付（CI\u002FCD）平台，主要用于自动化软件开发流程中的构建、测试和部署任务。通过yml格式文件配置workflow实现自动化操作，可以实现一次提交，多仓库代码同步。目前Github Actions在实现本地代码提交Github仓库时，同步代码到Gitee，可以自动触发workflow执行，实现自动同步功能。反过来，当Gitee代码库存在更新，Github从Gitee同步更新时，借助Github Actions无法实现自动，只能借助定时任务，定时从Gitee同步代码。",[12,19,20],{},"相对于Github同步方案而言，Gitee同步代码至Github或者从Github更新代码非常简单。借助Gitee提供的强大的仓库镜像功能，只需要在Gitee的源仓库上进行简单配置就可以实现。",[12,22,23],{},"下面介绍Github和Gitee双向同步的具体实现步骤。",[25,26,28],"h2",{"id":27},"_1-github自动同步gitee","1 Github自动同步Gitee",[12,30,31,32,40],{},"Github自动同步Gitee是指在本地提交代码至Github远程仓库时，同步将代码更新至Gitee仓库。目前通过Github Actions 实现Github仓库同步到gitee的Actions有很多，本文主要讲述如何使用【",[33,34,39],"a",{"href":35,"rel":36,"target":38},"https:\u002F\u002Fgithub.com\u002Fwearerequired\u002Fgit-mirror-action",[37],"nofollow","_blank","git-mirror-action","】镜像来实现同步操作。",[12,42,43,47,48,52],{},[44,45,39],"code",{"color":46},"primary"," 是一个用于自动同步 GitHub 和 Gitee（或其他 Git 平台）仓库的 GitHub Action，通过配置工作流（workflow）实现自动化部署。github仓库地址为：【",[33,49,51],{"href":35,"rel":50,"target":38},[37],"wearerequired\u002Fgit-mirror-action@master","】",[12,54,55],{},[56,57,58],"strong",{},"核心功能如下：",[60,61,62,66,69],"ul",{},[63,64,65],"li",{},"双向同步：支持将 GitHub 仓库同步到 Gitee 或其他平台，也可实现反向同步。",[63,67,68],{},"‌灵活配置‌：通过 .yml 文件定义同步规则，支持源仓库与目标仓库的地址映射。",[63,70,71],{},"自动化部署‌：结合 GitHub Actions 工作流，可在代码更新时自动触发同步操作。",[12,73,74,77],{},[56,75,76],{},"同步的原理","：利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中。",[12,79,80,81],{},"详细配置参考：",[33,82,84],{"href":35,"rel":83},[37],"github源码仓库文档",[86,87,89],"h3",{"id":88},"_11-创建gitee目标仓库","1.1 创建Gitee目标仓库",[12,91,92],{},"在实现github仓库同步到gitee仓库之前，首先需要在gitee初始化一个仓库，作为同步的目标仓库。可以直接创建一个空仓库，或者直接通过gitee自带的导入github仓库代码功能。具体导入github仓库步骤如下：",[12,94,95,96,101],{},"① 登陆[",[33,97,100],{"href":98,"rel":99,"target":38},"https:\u002F\u002Fgitee.com\u002Flogin",[37],"gitee","] -> 右上角加号 -> 从github\u002Fgitlab导入仓库。进入页面后，可直接通过url输入，也可以通过github授权后，批量选择导入的仓库。",[103,104,107],"callout",{"color":105,"icon":106},"warning","material-symbols:info-outline",[12,108,109,110,113,114,117,118,52,122,124],{},"温馨提示",[111,112],"br",{},"\n1 从url导入私有仓库时，需要填写仓库的账户和个人令牌。此处的令牌并非密码(github现在不建议直接账户密码认证)，而是GitHub 的「",[56,115,116],{},"Personal access token","」。点击前往设置【",[33,119,116],{"href":120,"rel":121,"target":38},"https:\u002F\u002Fgithub.com\u002Fsettings\u002Ftokens",[37],[111,123],{},"\n2 从github导入仓库，需要github授权才行，授权后可以选择需要导入的仓库。",[12,126,127,128,132,133,135],{},"② 仓库导入成功后，进入仓库，仓库名称后面会显示一个 ",[129,130],"icon",{"name":131},"material-symbols-light:refresh-rounded"," 符号，点击便可手动同步github仓库代码至gitee。私有仓库同步时，需要输入账号和个人令牌(github的",[56,134,116],{},")",[12,137,138],{},"至此，github仓库同步gitee仓库前期准备工作已准备完毕，下面开始介绍如何配置github自动同步代码至gitee。",[86,140,142],{"id":141},"_12-创建ssh公私钥","1.2 创建SSH公私钥",[12,144,145],{},"SSH密钥对由公钥和私钥组成，公钥用于加密数据，私钥用于解密数据，通过非对称加密确保通信安全。使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接到 GitHub，而无需在每次访问时都提供用户名和 personal access token。GitHub通过公钥加密信息，私钥用于解密，从而确认用户身份。",[12,147,148,149,151,152,154],{},"①在本地机器上打开终端应用程序",[111,150],{},"\n②生成SSH密钥对",[111,153],{},"\n使用ssh-keygen命令来生成密钥对。您可以通过以下命令开始：",[156,157,162],"pre",{"className":158,"code":159,"language":160,"meta":161,"style":161},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ssh-keygen -t rsa  -b 4096 -C \"youremail@example.com\"\n","shell","",[44,163,164],{"__ignoreMap":161},[165,166,169,173,177,180,183,187,190,194,197],"span",{"class":167,"line":168},"line",1,[165,170,172],{"class":171},"sBMFI","ssh-keygen",[165,174,176],{"class":175},"sfazB"," -t",[165,178,179],{"class":175}," rsa",[165,181,182],{"class":175},"  -b",[165,184,186],{"class":185},"sbssI"," 4096",[165,188,189],{"class":175}," -C",[165,191,193],{"class":192},"sMK4o"," \"",[165,195,196],{"class":175},"youremail@example.com",[165,198,199],{"class":192},"\"\n",[12,201,202],{},"这里，-t rsa指定了密钥的类型为RSA，-b 4096指定了密钥的位长度为4096位。RSA密钥的长度可以是1024位、2048位或4096位，推荐使用2048位或更高的安全性。-C（Comment）是 ssh-keygen 命令的一个选项，用于为生成的 SSH 密钥对添加注释。注释内容可以是任意文本，但通常推荐使用邮箱地址或密钥用途描述。注释仅保存在公钥文件中，私钥文件不包含此信息。",[12,204,205],{},"执行上述命令后，系统会询问您希望将密钥存储在哪个文件中，默认是~\u002F.ssh\u002Fid_rsa（私钥）和~\u002F.ssh\u002Fid_rsa.pub（公钥）。您可以按回车接受默认设置，或者输入其他路径来存储密钥文件。",[12,207,208],{},"接下来，系统会询问您是否要为密钥设置密码（passphrase）。强烈建议设置密码，因为即使私钥文件被保护，知道密码仍然可以访问您的服务器。如果您不想设置密码，可以按回车跳过此步骤。",[12,210,211,212,215,216,219],{},"如果连续三次回车，生成的秘钥对存储默认位置。",[44,213,214],{"color":46},"id_rsa"," 为私钥，",[44,217,218],{"color":46},"id_rsa.pub","为公钥。如果提示：already exists（已经存在），则可以到电脑位置：C:\\Users\\电脑账号名\\ .ssh 直接使用。",[12,221,222,223,52],{},"具体图文参考：【",[33,224,227],{"href":225,"rel":226,"target":38},"https:\u002F\u002Fgitee.com\u002Fhelp\u002Farticles\u002F4181#article-header0",[37],"生成\u002F添加SSH公钥",[86,229,231],{"id":230},"_13-github配置ssh私钥","1.3 GitHub配置SSH私钥",[12,233,234,235],{},"打开Github需要同步的项目，点击Settings->Secrets->Actions，设置私钥名称为：GITEE_RSA_PRIVATE_KEY，值为：上面生成SSH的私钥，即id_rsa 文件的内容\n",[236,237],"img",{"alt":161,"src":238},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910125740784.webp",[86,240,242],{"id":241},"_14-github配置ssh公钥","1.4 GitHub配置SSH公钥",[12,244,245,246],{},"在Github点击右上角用户图像，点击Settings->SSH and GPG keys->New SSH key，名称为：GITEE_RSA_PUBLIC_KEY，值为：上面生成SSH的公钥，即id_rsa_pub文件内容\n",[236,247],{"alt":161,"src":248},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910130224827.webp",[86,250,252],{"id":251},"_15-gitee配置ssh公钥","1.5 Gitee配置SSH公钥",[12,254,255,256],{},"在Gitee 设置->安全设置->SSH公钥，标题为：GITEE_RSA_PUBLIC_KEY，值为：上面生成SSH的公钥，即id_rsa_pub文件内容\n",[236,257],{"alt":161,"src":258},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910130741176.webp",[86,260,262],{"id":261},"_16-创建github-workflow","1.6 创建Github workflow",[12,264,265],{},"github创建workflow有2种方式，第一种直接在github项目中，点击actions创建新的workflow，第二种就是将项目clone本地，进行配置。二者大同小异，都是配置相应的设置。",[12,267,268,269,272,275,278,279,282],{},"①第一种：点击actions创建新的workflow\n",[236,270],{"alt":161,"src":271},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131433758.webp",[236,273],{"alt":161,"src":274},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131520866.webp",[236,276],{"alt":161,"src":277},"https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131747275.webp","\n②第二种：将项目clone到本地，用vscode打开，根目录下创建文件",[44,280,281],{"color":46},".github\\workflows\\sync-to-gitee.yml","，内容如下：",[156,284,289],{"className":285,"code":286,"filename":287,"language":288,"meta":161,"style":161},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Sync to Gitee\non:\n    push:\n        branches:\n            # 或者你想要同步的分支\n            - main\njobs:\n    sync:\n        runs-on: ubuntu-latest\n        steps:\n            - name: Sync to Gitee\n              uses: wearerequired\u002Fgit-mirror-action@master\n              env:\n                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY\n                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}\n              with:\n                  # 注意替换为你的 GitHub 源仓库地址\n                  source-repo: git@github.com:AnyFork\u002Fanyfork-docs-client.git\n                  # 注意替换为你的 Gitee 目标仓库地址\n                  destination-repo: git@gitee.com:AnyFork\u002Fanyfork-docs-client.git\n","sync-to-gitee.yml","yml",[44,290,291,303,313,321,329,336,345,353,361,372,380,392,403,411,417,428,436,442,453,459],{"__ignoreMap":161},[165,292,293,297,300],{"class":167,"line":168},[165,294,296],{"class":295},"swJcz","name",[165,298,299],{"class":192},":",[165,301,302],{"class":175}," Sync to Gitee\n",[165,304,306,310],{"class":167,"line":305},2,[165,307,309],{"class":308},"sfNiH","on",[165,311,312],{"class":192},":\n",[165,314,316,319],{"class":167,"line":315},3,[165,317,318],{"class":295},"    push",[165,320,312],{"class":192},[165,322,324,327],{"class":167,"line":323},4,[165,325,326],{"class":295},"        branches",[165,328,312],{"class":192},[165,330,332],{"class":167,"line":331},5,[165,333,335],{"class":334},"sHwdD","            # 或者你想要同步的分支\n",[165,337,339,342],{"class":167,"line":338},6,[165,340,341],{"class":192},"            -",[165,343,344],{"class":175}," main\n",[165,346,348,351],{"class":167,"line":347},7,[165,349,350],{"class":295},"jobs",[165,352,312],{"class":192},[165,354,356,359],{"class":167,"line":355},8,[165,357,358],{"class":295},"    sync",[165,360,312],{"class":192},[165,362,364,367,369],{"class":167,"line":363},9,[165,365,366],{"class":295},"        runs-on",[165,368,299],{"class":192},[165,370,371],{"class":175}," ubuntu-latest\n",[165,373,375,378],{"class":167,"line":374},10,[165,376,377],{"class":295},"        steps",[165,379,312],{"class":192},[165,381,383,385,388,390],{"class":167,"line":382},11,[165,384,341],{"class":192},[165,386,387],{"class":295}," name",[165,389,299],{"class":192},[165,391,302],{"class":175},[165,393,395,398,400],{"class":167,"line":394},12,[165,396,397],{"class":295},"              uses",[165,399,299],{"class":192},[165,401,402],{"class":175}," wearerequired\u002Fgit-mirror-action@master\n",[165,404,406,409],{"class":167,"line":405},13,[165,407,408],{"class":295},"              env",[165,410,312],{"class":192},[165,412,414],{"class":167,"line":413},14,[165,415,416],{"class":334},"                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY\n",[165,418,420,423,425],{"class":167,"line":419},15,[165,421,422],{"class":295},"                  SSH_PRIVATE_KEY",[165,424,299],{"class":192},[165,426,427],{"class":175}," ${{ secrets.GITEE_RSA_PRIVATE_KEY }}\n",[165,429,431,434],{"class":167,"line":430},16,[165,432,433],{"class":295},"              with",[165,435,312],{"class":192},[165,437,439],{"class":167,"line":438},17,[165,440,441],{"class":334},"                  # 注意替换为你的 GitHub 源仓库地址\n",[165,443,445,448,450],{"class":167,"line":444},18,[165,446,447],{"class":295},"                  source-repo",[165,449,299],{"class":192},[165,451,452],{"class":175}," git@github.com:AnyFork\u002Fanyfork-docs-client.git\n",[165,454,456],{"class":167,"line":455},19,[165,457,458],{"class":334},"                  # 注意替换为你的 Gitee 目标仓库地址\n",[165,460,462,465,467],{"class":167,"line":461},20,[165,463,464],{"class":295},"                  destination-repo",[165,466,299],{"class":192},[165,468,469],{"class":175}," git@gitee.com:AnyFork\u002Fanyfork-docs-client.git\n",[12,471,472],{},"至此，github workflow配置完毕。以后提交代码至github仓库时，便会触发workflow自动执行，自动将github仓库代码同步至gitee仓库中。",[25,474,476],{"id":475},"_2-github从gitee同步更新","2 Github从Gitee同步更新",[12,478,479,480,485],{},"Github仓库从Gitee仓库同步代码，也是借助Github Actions功能进行实现，能够实现此功能的Actions较多，本文还是采用\n【",[33,481,484],{"href":482,"rel":483,"target":38},"https:\u002F\u002Fgithub.com\u002FYikun\u002Fhub-mirror-action",[37],"Yikun\u002Fgitee-mirror-action","】进行实现。",[12,487,488,489,492,493,496],{},"由于Github Actions在Gitee代码仓库更新时，无法自动感知gitee仓库发生更新，从而不能自动触发workflow的执行，因此形成了2种不同的同步方式：",[56,490,491],{},"webhooks实时同步方式","和",[56,494,495],{},"定时延迟同步方式","。下面分别介绍这2种同步方式的具体实现步骤。",[86,498,500],{"id":499},"_21-定时延迟同步方式","2.1 定时延迟同步方式",[12,502,503],{},"定时延迟同步方式是最简单的一种方式，虽然存在延迟，但大部分情况下对代码同步的实时性要求并不高。可以根据实际需求，调整定时任务频率，增加同步次数。",[12,505,506],{},[56,507,508],{},"1 创建Github目标仓库",[12,510,511,512,517],{},"在实现从Gitee同步代码至目标仓库Github之前，需要在Github上创建一个空的仓库作为同步的目标仓库。登陆【",[33,513,516],{"href":514,"rel":515,"target":38},"https:\u002F\u002Fgithub.com\u002F",[37],"gihub","】->右上角加号->创建仓库，私有或者公有仓库均可。",[12,519,520],{},[56,521,522],{},"2 目标仓库配置SSH私钥",[12,524,525,526,52],{},"github目标仓库创建好后，需要配置仓库SSH私钥，具体步骤参考：【",[33,527,529],{"href":528},"#_13-github%E9%85%8D%E7%BD%AEssh%E7%A7%81%E9%92%A5","1.3 github配置ssh私钥",[12,531,532],{},[56,533,534],{},"3 目标仓库创建Github workflow",[12,536,537,538,541,542,282],{},"在【",[33,539,262],{"href":540},"#_16-%E5%88%9B%E5%BB%BAgithub-workflow","】已经讲述了如何创建Github workflow，此处不在赘述。下面采用第二种方式进行配置。将项目clone到本地，用vscode打开，根目录下创建文件",[44,543,544],{"color":46},".github\\workflows\\sync-to-github.yml",[156,546,549],{"className":285,"code":547,"filename":548,"language":288,"meta":161,"style":161},"name: Sync to Github\non:\n   schedule:\n    # 每个小时10-59分钟之间，从10分钟开始，每5分钟执行一次\n    - cron:  '10\u002F5 * * * *'\njobs:\n    sync:\n        runs-on: ubuntu-latest\n        steps:\n            - name: Sync to Github\n              uses: wearerequired\u002Fgit-mirror-action@master\n              env:\n                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY\n                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}\n              with:\n                  # 注意替换为你的 Gitee源仓库地址\n                  source-repo: git@gitee.com:AnyFork\u002Fanyfork-docs-client.git\n                  # 注意替换为你的 Github 目标仓库地址\n                  destination-repo: git@github.com:AnyFork\u002Fanyfork-docs-client.git\n","sync-to-github.yml",[44,550,551,560,566,573,578,597,603,609,617,623,633,641,647,651,659,665,670,678,683],{"__ignoreMap":161},[165,552,553,555,557],{"class":167,"line":168},[165,554,296],{"class":295},[165,556,299],{"class":192},[165,558,559],{"class":175}," Sync to Github\n",[165,561,562,564],{"class":167,"line":305},[165,563,309],{"class":308},[165,565,312],{"class":192},[165,567,568,571],{"class":167,"line":315},[165,569,570],{"class":295},"   schedule",[165,572,312],{"class":192},[165,574,575],{"class":167,"line":323},[165,576,577],{"class":334},"    # 每个小时10-59分钟之间，从10分钟开始，每5分钟执行一次\n",[165,579,580,583,586,588,591,594],{"class":167,"line":331},[165,581,582],{"class":192},"    -",[165,584,585],{"class":295}," cron",[165,587,299],{"class":192},[165,589,590],{"class":192},"  '",[165,592,593],{"class":175},"10\u002F5 * * * *",[165,595,596],{"class":192},"'\n",[165,598,599,601],{"class":167,"line":338},[165,600,350],{"class":295},[165,602,312],{"class":192},[165,604,605,607],{"class":167,"line":347},[165,606,358],{"class":295},[165,608,312],{"class":192},[165,610,611,613,615],{"class":167,"line":355},[165,612,366],{"class":295},[165,614,299],{"class":192},[165,616,371],{"class":175},[165,618,619,621],{"class":167,"line":363},[165,620,377],{"class":295},[165,622,312],{"class":192},[165,624,625,627,629,631],{"class":167,"line":374},[165,626,341],{"class":192},[165,628,387],{"class":295},[165,630,299],{"class":192},[165,632,559],{"class":175},[165,634,635,637,639],{"class":167,"line":382},[165,636,397],{"class":295},[165,638,299],{"class":192},[165,640,402],{"class":175},[165,642,643,645],{"class":167,"line":394},[165,644,408],{"class":295},[165,646,312],{"class":192},[165,648,649],{"class":167,"line":405},[165,650,416],{"class":334},[165,652,653,655,657],{"class":167,"line":413},[165,654,422],{"class":295},[165,656,299],{"class":192},[165,658,427],{"class":175},[165,660,661,663],{"class":167,"line":419},[165,662,433],{"class":295},[165,664,312],{"class":192},[165,666,667],{"class":167,"line":430},[165,668,669],{"class":334},"                  # 注意替换为你的 Gitee源仓库地址\n",[165,671,672,674,676],{"class":167,"line":438},[165,673,447],{"class":295},[165,675,299],{"class":192},[165,677,469],{"class":175},[165,679,680],{"class":167,"line":444},[165,681,682],{"class":334},"                  # 注意替换为你的 Github 目标仓库地址\n",[165,684,685,687,689],{"class":167,"line":455},[165,686,464],{"class":295},[165,688,299],{"class":192},[165,690,452],{"class":175},[12,692,693,694,697],{},"上面配置了",[44,695,696],{"color":46},"on:schedule:cron","定时任务，时间到了定时任务设置的时间，便会触发workflow执行。",[103,699,700],{"color":105,"icon":106},[12,701,109,702,704,705,707,708,710],{},[111,703],{},"\n1 设定的 schedule 是UCT时间，比如设置的08:00（也就是北京时间的16:00），但实际运行的时间为北京时间17:00 至 17：20 不等。",[111,706],{},"\n2 Schedule在 GitHub 操作工作流运行的高负载期间，事件可能会延迟。高负载时间包括每小时开始。为了减少延迟的可能性，请安排您的工作流在不同的时间运行。实测延迟的时间为几十分钟，或者超过一个小时，甚至在某种极端情况下，将不会执行。",[111,709],{},"\n3 Schedule 设置的 cron 时刻，仅仅是工作流进行计划排队的时刻，而不是准确的运行时刻。",[12,712,713],{},"GitHub Actions 默认使用 UTC 时间。如果你的工作流程应该在特定本地时间执行，你可以在 YAML 文件中指定时区：",[156,715,717],{"className":285,"code":716,"language":288,"meta":161,"style":161},"jobs:\n  job1:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Set Timezone\n      uses: szenius\u002Fset-timezone@v1.0\n      with:\n        timezoneLinux: \"Asia\u002FShanghai\"\n\n",[44,718,719,725,732,741,748,759,769,776],{"__ignoreMap":161},[165,720,721,723],{"class":167,"line":168},[165,722,350],{"class":295},[165,724,312],{"class":192},[165,726,727,730],{"class":167,"line":305},[165,728,729],{"class":295},"  job1",[165,731,312],{"class":192},[165,733,734,737,739],{"class":167,"line":315},[165,735,736],{"class":295},"    runs-on",[165,738,299],{"class":192},[165,740,371],{"class":175},[165,742,743,746],{"class":167,"line":323},[165,744,745],{"class":295},"    steps",[165,747,312],{"class":192},[165,749,750,752,754,756],{"class":167,"line":331},[165,751,582],{"class":192},[165,753,387],{"class":295},[165,755,299],{"class":192},[165,757,758],{"class":175}," Set Timezone\n",[165,760,761,764,766],{"class":167,"line":338},[165,762,763],{"class":295},"      uses",[165,765,299],{"class":192},[165,767,768],{"class":175}," szenius\u002Fset-timezone@v1.0\n",[165,770,771,774],{"class":167,"line":347},[165,772,773],{"class":295},"      with",[165,775,312],{"class":192},[165,777,778,781,783,785,788],{"class":167,"line":355},[165,779,780],{"class":295},"        timezoneLinux",[165,782,299],{"class":192},[165,784,193],{"class":192},[165,786,787],{"class":175},"Asia\u002FShanghai",[165,789,199],{"class":192},[12,791,792],{},"对于一些不需要实时进行同步的需求，可以采用定时延迟同步方案，方便配置也简单。",[86,794,796],{"id":795},"_22-实时同步方式","2.2 实时同步方式",[12,798,799],{},"Webhook是一种事件驱动的通知机制，当发生特定事件（如代码推送、拉取请求创建等）时，会自动向指定的外部服务器发送HTTP POST请求（通常包含事件数据）。这种机制替代了轮询API的实时通知方式，允许开发者在事件发生时立即触发外部操作（如部署、测试或发送通知）。",[12,801,802],{},"Github和Gitee都支持Webhook功能，因此我们可以借助这一功能，在gitee代码发生提交时，触发gitee配置的自定义webhook，webhook通过调用github Api触发github actions自动执行，从而实现实时同步方式。",[25,804,806],{"id":805},"_3-gitee自动同步github","3 Gitee自动同步Github",[25,808,810],{"id":809},"_4-gitee从github同步更新","4 Gitee从Github同步更新",[812,813,814],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":161,"searchDepth":315,"depth":315,"links":816},[817,825,829,830],{"id":27,"depth":305,"text":28,"children":818},[819,820,821,822,823,824],{"id":88,"depth":315,"text":89},{"id":141,"depth":315,"text":142},{"id":230,"depth":315,"text":231},{"id":241,"depth":315,"text":242},{"id":251,"depth":315,"text":252},{"id":261,"depth":315,"text":262},{"id":475,"depth":305,"text":476,"children":826},[827,828],{"id":499,"depth":315,"text":500},{"id":795,"depth":315,"text":796},{"id":805,"depth":305,"text":806},{"id":809,"depth":305,"text":810},{"name":832,"symbol":833,"icon":834,"id":331},"仓库同步","repository","material-symbols-light:sync-desktop-outline","2025-09-09 21:55:35","‌日常工作中，可能会遇到github代码仓库需要自动同步代码至gitee仓库，或者gitee仓库代码同步至github仓库的应用场景，针对这个应用场景，下面便归纳一下github和gitee仓库实现双向自动同步方案和步骤。",{"type":9,"value":838},[839],[12,840,14],{},"md",false,true,"GitHub Actions‌，github，CI\u002FCD，gitee，自动代码同步，双向代码同步，镜像仓库。",{},"\u002Fblog\u002Fgithubgitee","---\ntitle: github仓库代码和gitee仓库代码双向自动同步方案\ndescription: ‌日常工作中，可能会遇到github代码仓库需要自动同步代码至gitee仓库，或者gitee仓库代码同步至github仓库的应用场景，针对这个应用场景，下面便归纳一下github和gitee仓库实现双向自动同步方案和步骤。\nkeywords: GitHub Actions‌，github，CI\u002FCD，gitee，自动代码同步，双向代码同步，镜像仓库。\narticleId: 20250909215534\ncreateDate: \"2025-09-09 21:55:35\"\nupdateDate: \"2026-03-12 10:02:23\"\narticleThumb: https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20260327203348205.webp\ntagIds: \n    - 2\n    - 3\ncategoryId: 5\nisTop: false\nisRecommend: false\nisHot: true\nisHidden: false\nnavigation: true\n---\n\n\n到目前为止，想要实现在本地提交代码至Github仓库时，同时更新至Gitee仓库是可行的。相反，想要在本地提交代码至Gitee仓库时，同时更新至Github仓库也可以实现的。无论我们使用Github还是Gitee任意一个远程仓库，在代码提交时，头可以自动同步到另一个远程仓库，即所谓的双向自动同步(可推送至远端仓库，亦可从远端仓库同步更新)。当然，日常开发中，按照个人喜好，我们只需要选择一种即可。\n\u003C!--more-->\n\n\nGithub同步代码至Gitee或者是从Gitee更新代码，都需要借助Github Actions功能。GitHub Actions‌ 是 GitHub 提供的持续集成与持续交付（CI\u002FCD）平台，主要用于自动化软件开发流程中的构建、测试和部署任务。通过yml格式文件配置workflow实现自动化操作，可以实现一次提交，多仓库代码同步。目前Github Actions在实现本地代码提交Github仓库时，同步代码到Gitee，可以自动触发workflow执行，实现自动同步功能。反过来，当Gitee代码库存在更新，Github从Gitee同步更新时，借助Github Actions无法实现自动，只能借助定时任务，定时从Gitee同步代码。\n\n\n相对于Github同步方案而言，Gitee同步代码至Github或者从Github更新代码非常简单。借助Gitee提供的强大的仓库镜像功能，只需要在Gitee的源仓库上进行简单配置就可以实现。\n\n\n下面介绍Github和Gitee双向同步的具体实现步骤。\n\n\n## 1 Github自动同步Gitee\nGithub自动同步Gitee是指在本地提交代码至Github远程仓库时，同步将代码更新至Gitee仓库。目前通过Github Actions 实现Github仓库同步到gitee的Actions有很多，本文主要讲述如何使用【[git-mirror-action](https:\u002F\u002Fgithub.com\u002Fwearerequired\u002Fgit-mirror-action){target=_blank}】镜像来实现同步操作。\n\n`git-mirror-action`{color=primary} 是一个用于自动同步 GitHub 和 Gitee（或其他 Git 平台）仓库的 GitHub Action，通过配置工作流（workflow）实现自动化部署。github仓库地址为：【[wearerequired\u002Fgit-mirror-action@master](https:\u002F\u002Fgithub.com\u002Fwearerequired\u002Fgit-mirror-action){target=_blank}】\n \n**核心功能如下：**\n- 双向同步：支持将 GitHub 仓库同步到 Gitee 或其他平台，也可实现反向同步。\n- ‌灵活配置‌：通过 .yml 文件定义同步规则，支持源仓库与目标仓库的地址映射。\n- 自动化部署‌：结合 GitHub Actions 工作流，可在代码更新时自动触发同步操作。\n\n**同步的原理**：利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中。\n\n\n详细配置参考：[github源码仓库文档](https:\u002F\u002Fgithub.com\u002Fwearerequired\u002Fgit-mirror-action)\n\n\n### 1.1 创建Gitee目标仓库\n在实现github仓库同步到gitee仓库之前，首先需要在gitee初始化一个仓库，作为同步的目标仓库。可以直接创建一个空仓库，或者直接通过gitee自带的导入github仓库代码功能。具体导入github仓库步骤如下：\n\n\n① 登陆[[gitee](https:\u002F\u002Fgitee.com\u002Flogin){target=_blank}] -> 右上角加号 -> 从github\u002Fgitlab导入仓库。进入页面后，可直接通过url输入，也可以通过github授权后，批量选择导入的仓库。\n::callout{icon=\"material-symbols:info-outline\" color=\"warning\"}\n温馨提示\u003C\u002Fbr>\n1 从url导入私有仓库时，需要填写仓库的账户和个人令牌。此处的令牌并非密码(github现在不建议直接账户密码认证)，而是GitHub 的「**Personal access token**」。点击前往设置【[Personal access token](https:\u002F\u002Fgithub.com\u002Fsettings\u002Ftokens){target=_blank}】\u003C\u002Fbr>\n2 从github导入仓库，需要github授权才行，授权后可以选择需要导入的仓库。\n::\n② 仓库导入成功后，进入仓库，仓库名称后面会显示一个 :icon{name=\"material-symbols-light:refresh-rounded\"} 符号，点击便可手动同步github仓库代码至gitee。私有仓库同步时，需要输入账号和个人令牌(github的**Personal access token**)\n\n\n至此，github仓库同步gitee仓库前期准备工作已准备完毕，下面开始介绍如何配置github自动同步代码至gitee。\n\n\n### 1.2 创建SSH公私钥\nSSH密钥对由公钥和私钥组成，公钥用于加密数据，私钥用于解密数据，通过非对称加密确保通信安全。使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接到 GitHub，而无需在每次访问时都提供用户名和 personal access token。GitHub通过公钥加密信息，私钥用于解密，从而确认用户身份。\n\n\n①在本地机器上打开终端应用程序  \n②生成SSH密钥对  \n使用ssh-keygen命令来生成密钥对。您可以通过以下命令开始：\n```shell\nssh-keygen -t rsa  -b 4096 -C \"youremail@example.com\"\n```\n这里，-t rsa指定了密钥的类型为RSA，-b 4096指定了密钥的位长度为4096位。RSA密钥的长度可以是1024位、2048位或4096位，推荐使用2048位或更高的安全性。-C（Comment）是 ssh-keygen 命令的一个选项，用于为生成的 SSH 密钥对添加注释。注释内容可以是任意文本，但通常推荐使用邮箱地址或密钥用途描述。注释仅保存在公钥文件中，私钥文件不包含此信息。\n\n\n执行上述命令后，系统会询问您希望将密钥存储在哪个文件中，默认是~\u002F.ssh\u002Fid_rsa（私钥）和~\u002F.ssh\u002Fid_rsa.pub（公钥）。您可以按回车接受默认设置，或者输入其他路径来存储密钥文件。\n\n接下来，系统会询问您是否要为密钥设置密码（passphrase）。强烈建议设置密码，因为即使私钥文件被保护，知道密码仍然可以访问您的服务器。如果您不想设置密码，可以按回车跳过此步骤。\n\n\n如果连续三次回车，生成的秘钥对存储默认位置。`id_rsa`{color=primary} 为私钥，`id_rsa.pub`{color=primary}为公钥。如果提示：already exists（已经存在），则可以到电脑位置：C:\\Users\\电脑账号名\\ .ssh 直接使用。\n\n\n具体图文参考：【[生成\u002F添加SSH公钥](https:\u002F\u002Fgitee.com\u002Fhelp\u002Farticles\u002F4181#article-header0){target=_blank}】\n\n\n### 1.3 GitHub配置SSH私钥\n打开Github需要同步的项目，点击Settings->Secrets->Actions，设置私钥名称为：GITEE_RSA_PRIVATE_KEY，值为：上面生成SSH的私钥，即id_rsa 文件的内容\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910125740784.webp)\n\n\n### 1.4 GitHub配置SSH公钥\n在Github点击右上角用户图像，点击Settings->SSH and GPG keys->New SSH key，名称为：GITEE_RSA_PUBLIC_KEY，值为：上面生成SSH的公钥，即id_rsa_pub文件内容\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910130224827.webp)\n\n\n### 1.5 Gitee配置SSH公钥\n在Gitee 设置->安全设置->SSH公钥，标题为：GITEE_RSA_PUBLIC_KEY，值为：上面生成SSH的公钥，即id_rsa_pub文件内容\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910130741176.webp)\n\n\n### 1.6 创建Github workflow\ngithub创建workflow有2种方式，第一种直接在github项目中，点击actions创建新的workflow，第二种就是将项目clone本地，进行配置。二者大同小异，都是配置相应的设置。\n\n\n①第一种：点击actions创建新的workflow\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131433758.webp)\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131520866.webp)\n![](https:\u002F\u002Fgcore.jsdelivr.net\u002Fgh\u002FAnyFork\u002FResource\u002Fimages\u002F20250910131747275.webp)\n②第二种：将项目clone到本地，用vscode打开，根目录下创建文件`.github\\workflows\\sync-to-gitee.yml`{color=primary}，内容如下：\n```yml[sync-to-gitee.yml]\nname: Sync to Gitee\non:\n    push:\n        branches:\n            # 或者你想要同步的分支\n            - main\njobs:\n    sync:\n        runs-on: ubuntu-latest\n        steps:\n            - name: Sync to Gitee\n              uses: wearerequired\u002Fgit-mirror-action@master\n              env:\n                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY\n                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}\n              with:\n                  # 注意替换为你的 GitHub 源仓库地址\n                  source-repo: git@github.com:AnyFork\u002Fanyfork-docs-client.git\n                  # 注意替换为你的 Gitee 目标仓库地址\n                  destination-repo: git@gitee.com:AnyFork\u002Fanyfork-docs-client.git\n```\n至此，github workflow配置完毕。以后提交代码至github仓库时，便会触发workflow自动执行，自动将github仓库代码同步至gitee仓库中。\n\n\n## 2 Github从Gitee同步更新\nGithub仓库从Gitee仓库同步代码，也是借助Github Actions功能进行实现，能够实现此功能的Actions较多，本文还是采用\n【[Yikun\u002Fgitee-mirror-action](https:\u002F\u002Fgithub.com\u002FYikun\u002Fhub-mirror-action){target=_blank}】进行实现。\n\n由于Github Actions在Gitee代码仓库更新时，无法自动感知gitee仓库发生更新，从而不能自动触发workflow的执行，因此形成了2种不同的同步方式：**webhooks实时同步方式**和**定时延迟同步方式**。下面分别介绍这2种同步方式的具体实现步骤。\n\n### 2.1 定时延迟同步方式\n定时延迟同步方式是最简单的一种方式，虽然存在延迟，但大部分情况下对代码同步的实时性要求并不高。可以根据实际需求，调整定时任务频率，增加同步次数。\n\n**1 创建Github目标仓库**\n\n 在实现从Gitee同步代码至目标仓库Github之前，需要在Github上创建一个空的仓库作为同步的目标仓库。登陆【[gihub](https:\u002F\u002Fgithub.com\u002F){target=_blank}】->右上角加号->创建仓库，私有或者公有仓库均可。\n\n\n**2 目标仓库配置SSH私钥**\n\n\ngithub目标仓库创建好后，需要配置仓库SSH私钥，具体步骤参考：【[1.3 github配置ssh私钥](#_13-github配置ssh私钥)】\n\n**3 目标仓库创建Github workflow**\n\n在【[1.6 创建Github workflow](#_16-创建github-workflow)】已经讲述了如何创建Github workflow，此处不在赘述。下面采用第二种方式进行配置。将项目clone到本地，用vscode打开，根目录下创建文件`.github\\workflows\\sync-to-github.yml`{color=primary}，内容如下：\n```yml[sync-to-github.yml]\nname: Sync to Github\non:\n   schedule:\n    # 每个小时10-59分钟之间，从10分钟开始，每5分钟执行一次\n    - cron:  '10\u002F5 * * * *'\njobs:\n    sync:\n        runs-on: ubuntu-latest\n        steps:\n            - name: Sync to Github\n              uses: wearerequired\u002Fgit-mirror-action@master\n              env:\n                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY\n                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}\n              with:\n                  # 注意替换为你的 Gitee源仓库地址\n                  source-repo: git@gitee.com:AnyFork\u002Fanyfork-docs-client.git\n                  # 注意替换为你的 Github 目标仓库地址\n                  destination-repo: git@github.com:AnyFork\u002Fanyfork-docs-client.git\n```\n上面配置了`on:schedule:cron`{color=primary}定时任务，时间到了定时任务设置的时间，便会触发workflow执行。\n::callout{icon=\"material-symbols:info-outline\" color=\"warning\"}\n温馨提示\u003C\u002Fbr>\n1 设定的 schedule 是UCT时间，比如设置的08:00（也就是北京时间的16:00），但实际运行的时间为北京时间17:00 至 17：20 不等。\u003C\u002Fbr>\n2 Schedule在 GitHub 操作工作流运行的高负载期间，事件可能会延迟。高负载时间包括每小时开始。为了减少延迟的可能性，请安排您的工作流在不同的时间运行。实测延迟的时间为几十分钟，或者超过一个小时，甚至在某种极端情况下，将不会执行。\u003C\u002Fbr>\n3 Schedule 设置的 cron 时刻，仅仅是工作流进行计划排队的时刻，而不是准确的运行时刻。\n::\nGitHub Actions 默认使用 UTC 时间。如果你的工作流程应该在特定本地时间执行，你可以在 YAML 文件中指定时区：\n```yml\njobs:\n  job1:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Set Timezone\n      uses: szenius\u002Fset-timezone@v1.0\n      with:\n        timezoneLinux: \"Asia\u002FShanghai\"\n\n```\n对于一些不需要实时进行同步的需求，可以采用定时延迟同步方案，方便配置也简单。\n\n\n### 2.2 实时同步方式\nWebhook是一种事件驱动的通知机制，当发生特定事件（如代码推送、拉取请求创建等）时，会自动向指定的外部服务器发送HTTP POST请求（通常包含事件数据）。这种机制替代了轮询API的实时通知方式，允许开发者在事件发生时立即触发外部操作（如部署、测试或发送通知）。\n\n\nGithub和Gitee都支持Webhook功能，因此我们可以借助这一功能，在gitee代码发生提交时，触发gitee配置的自定义webhook，webhook通过调用github Api触发github actions自动执行，从而实现实时同步方式。\n\n\n\n\n## 3 Gitee自动同步Github\n## 4 Gitee从Github同步更新\n",16.1,{"title":5,"description":836},{"loc":846},"blog\u002F2.github仓库代码和gitee仓库代码双向自动同步方案",[305,315],[854,856],{"name":100,"icon":855,"symbol":100,"id":305},"simple-icons:gitee",{"name":857,"symbol":857,"icon":858,"id":315},"github","ri:github-fill","2026-03-12 10:02:23",2904,"FXvOcy6wtiRSX7i0FdOsE_ihnBq3V8O5p82vesoduYM",[863,868],{"title":864,"path":865,"stem":866,"articleId":867,"children":-1},"Algolia DocSearch快速开启网站全文检索功能","\u002Fblog\u002Falgolia-docsearch","blog\u002F1.Algolia DocSearch快速开启网站全文检索功能","20250605153423",{"title":869,"path":870,"stem":871,"articleId":872,"children":-1},"网页字体设置：默认字体、font-family 和 @font-face 使用指南","\u002Fblog\u002Ffont-family-@font-face","blog\u002F3.网页字体设置：默认字体、font-family 和 @font-face 使用指南","20250731101333",1778143540262]