首页 > 编程知识 正文

如何将github上的项目拉到本地(git拉取最新版本到本地)

时间:2023-05-03 05:13:01 阅读:84449 作者:1841

有最近的需要。 因为最近在一个平台上更新了内容,所以它提供的订阅机制是RSS订阅分发。 但是,其中包含的一些附加信息有点尴尬,不能直接发布到其他同类内容平台。 因此,我考虑通过程序首先处理不适当的信息,然后定期将RSS文件更新为自己的Github Pages,然后将在其他同类内容平台上获取的RSS变为在自己的Github Pages上托管的RSS

于是,需求变得比较明确:

可以托管程序执行,不仅可以获取RSS文件的内容,还可以通过程序进行修改; 您可以定期更新任务,并根据更新任务的内容在仓库中指定分支。 我首先想起了一个叫Github Actions的工具。 众所周知,该工具在衡量2019年向公众开放后,许多员工将自己博客的编译工作从本地线扔向了Github Actions; 一些商家编写的前端小工具可以通过Github Actions快速部署工程,从而提高了效率并降低了成本。 即使是有后端的项目,只要在后端寻找存储数据的位置(bai ),就可以以低成本或零成本构建个人主页。 这对于提高生产率是非常有效的东西啊。

但是,其实Github Actions和Jenkins的功能是一致的,都是CI/CD的DevOps生产力工具,但是Github Actions以其易用性上市后非常受欢迎。

虽然一直知道这个功能,但是没有什么可以使用的场景,所以很困扰。 今天,这个需求正好让我可以使用Github Actions,以零成本解决需求。

首先,准备更新RSS的主程序convertRSS.py和requirements.txt。

导入请求

导入操作系统,系统

导入地址解析

# #主获取内容代码

取得网址(URL ) :

# # some server请求需要头,其他资源返回模式

headers={

'用户代理' : ' Mozilla/5.0 (windows nt 10.0; Win64; x64 )苹果维基/537.36 (khtml,like Gecko ) chrome/92.0.4515.131 safari/537.36 ',

}

page=requests.get(URL,头=头).content

# # converttostrwithinutf-8编码

页面=页面编码(utf-8 )。

返回页

# #主转换代码

ef convert _ content (内容) :

content=content.replace('zning源创库),'张宁网源创库) ) ) ) ) ) )。

返回内容

if __name__=='__main__':

# #新系统阵列输入

arg _ prsr=arg parse.argument分析器(

arg_prsr.add_argument('--url ',需要=真,类型=str,默认值=',帮助='需要. whichonerssxment

args=arg _ prsr.parse _ args (sys.argv [ 1: ]

url=args.url

# # placeaflagtojudgeshouldwritefiletodiskornot

标志=假

URL _ content=转换_ content (获取_ URL ) )

URL_list=URL.split('/' )。

IFOS.path.exists(URL_list[-1] ) :

withopen(URL_list[-1],' r ',编码=' utf-8 ' ) as文件:

IF (文件读)!=URL_content(:

标志=真

else:

# if the file dose not exist,theflagshouldplacedtruetoconvertfirsttime

标志=真

if标志:

# #写入到磁盘代码

withopen(URL_list[-1],' w ',编码=' utf-8 ' ) as文件:

文件写入(URL _ content ) )。

打印(' therssxmlhadupdate,转换完成. ' )

是sys.exit(0)

else:

print("The RSS Xml have no change, convert abort.") sys.exit(1)

这里解释下我的程序的逻辑:通过系统执行传参--url将需要处理的RSS XML URL传值进入,后通过函数get_url()完成源文件的获取并转换成字符串,紧接着通过convert_content()函数处理替换源文件字符串。完成后紧接着判断本地是否有该文件,如果没有则直接创建,如果有则判断本地文件是否与处理替换后文件内容是否相同,如果不相同则覆盖修改本地文件完成更新,并以0返回值正常退出,如果相同则无需更新,以1返回值返回退出程序。

至于为什么设计这两个返回值,文末会讲到。

下面是该程序的requirements.txt,显然得,不再赘述:

requests==2.25.1

之后Github Actions创建一个仓库,把这俩文件放进去。

另外是需要去Settings-Developer settings-Personal access tokens(链接:https://github.com/settings/tokens)里面生成一个密钥,将这个密钥添加到仓库设置的Actions secrets(链接:https://github.com/``{username}/``{reponame}/settings/secrets/actions),在Actions secrets的名字即是配置文件引入的变量名,这里我的仓库叫CONVERT_TOKEN。

文件和密钥均备妥后,点击菜单标签Actions,后点击set up a workflow yourself,进入创建自己的工作流。

工作流创建文件使用的是YAML语法,具体使用文档可以查阅:https://docs.github.com/cn/actions 这里不再赘述更多用法,直接贴出本示例项目创建的工作流文件convert-rss.yml:

name: 'Convert RSS Actions' on: schedule: - cron: '0,15,30,45 * * * *' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout from repo uses: actions/checkout@main with: ref: main - name: Install Python latest uses: actions/setup-python@main with: python-version: '3.x' architecture: 'x64' - name: Install dependencies run: | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Doing fetch run: python convertRSS.py --url https://zning.me/atom.xml - name: Commit files run: | git config --local user.email "zhn038@gmail.com" git config --local user.name "ZNing" git add . git commit -m "提交RSS XML更新 $(date "+%Y-%m-%d %H:%M:%S")" - name: Push changes uses: ad-m/github-push-action@master with: github_token: ${{ secrets.CONVERT_TOKEN }} branch: main

Github会在该分支仓库里创建.github/workflow文件夹,并在里面创建工作流文件convert-rss.yml,文件名没有任何要求,Github Actions会对该文件夹下所有.yml进行解析与执行。

这里稍微解释一下我自己这个工作流文件所干的事情:

工作流名称为Convert RSS Actions;工作流为定时计划工作流,工作时间是每隔15分钟一次;工作流build有6个任务,顺序执行,每个步骤的具体是:检出main仓库;安装最新版Python 3;根据仓库是否有requirements.txt安装Python依赖;执行Python程序,对RSS XML进行处理;对更新的RSS XML进行提交;对更新的RSS XML进行推送至指定分支。

创建好后,就等着Github Actions自己按计划调起Actions工作即可,不过根据实际测试,由于这玩意儿全球从业者估计使用的都挺多的,所以实际执行时间并不会完全按照设定的时间走,一般会晚个8-12分钟。

仓库所有内容其实都可以本地创建,其中Actions的定义文件在本地创建.github/workflow文件夹后放置提交推送给Github也是可以的,只不过我这边为了演示方便,就不再在本地做操作了,直接在Github网页上直接将所有步骤都解决了。

这里解释一下刚才Python返回值的问题,因为我需要区分两种状态情况,而Github Actions是可以根据返回值判断该节点运行正常与否(详见:https://docs.github.com/cn/actions/creating-actions/setting-exit-codes-for-actions)只要是0就认为是正常,非0则是异常,且异常不会继续执行接下来的节点。

而我的需求其实就正好是,如果有更新则提交并推送仓库,如果没有则终止即可。因此上面的Python程序才会设置如此的返回值。

不过可能是我Python程序有点小问题,发现如果内容相同的时候,后台程序也会提交更新,但是这个情况出现的很随机,有的时候又比对相同1值退出,正常返回错误。目前不太清楚这是为什么,欢迎知道的大佬在评论区留言。

最后,本文示例程序正常开源,协议MIT,欢迎自取使用:

Github:https://github.com/zning1994/github-actions-examples

Gitee镜像:https://gitee.com/zning/github-actions-examples

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。