基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

  • 一、需求
  • 二、上传本地 Git 仓库
    • 2.1 初始版本
    • 2.2 优化版本
  • 三、 GitHub 创建空仓库
    • 3.1 初始版本
    • 3.2 优化版本
  • 四、Gitee 创建空仓库

一、需求

app目录下的每个文件夹都是一个git仓库,如何使用shell脚本将所有git仓库都上传到github上

server@dev-fj-srv:~/code/app$ tree -L 1
.
|-- FreemeBadgeProvider
|-- FreemeCalculator
|-- FreemeCamera
|-- FreemeCamera2 

在这里插入图片描述

二、上传本地 Git 仓库

2.1 初始版本

要使用 shell 脚本将 app 目录下的所有 Git 仓库上传到 GitHub 上,可以按照以下步骤进行操作:

  1. 首先,确保你在 GitHub 上创建了一个空的远程仓库,用于存储你的应用程序仓库。

  2. 创建一个新的 shell 脚本文件(例如 upload_to_github.sh),并使用文本编辑器打开它。

  3. 在脚本文件中,添加以下内容:

#!/bin/bash# 进入 app 目录
cd ~/code/app# 遍历 app 目录下的每个文件夹
for repo in */; do# 进入每个 Git 仓库目录cd "$repo"# 添加远程仓库地址git remote add origin <GitHub 仓库的 URL># 推送代码到远程仓库git push -u origin master# 返回到 app 目录cd ..
done
  1. 替换 <GitHub 仓库的 URL> 为你在 GitHub 上创建的远程仓库的 URL 地址。确保每个仓库都有正确的远程仓库地址。

  2. 保存并关闭脚本文件。

  3. 在终端中,进入包含脚本文件的目录,并为脚本文件添加执行权限。可以使用以下命令:

chmod +x upload_to_github.sh
  1. 运行脚本文件,使用以下命令:
./upload_to_github.sh

脚本将自动进入每个仓库目录,并将其推送到对应的远程仓库。你需要在每个仓库的首次推送时提供 GitHub 账户的用户名和密码或访问令牌,以确保权限验证。

2.2 优化版本

如果你希望在脚本中使用固定链接和文件夹名来构建 GitHub 仓库的 URL,你可以对脚本进行以下修改:

#!/bin/bash# 进入 app 目录
cd ~/code/app# 遍历 app 目录下的每个文件夹
for repo in */; do# 进入每个 Git 仓库目录cd "$repo"# 获取文件夹名folder_name=$(basename "$PWD")# 构建远程仓库地址repo_url="https://github.com/<你的用户名>/${folder_name}.git"# 添加远程仓库地址git remote add origin "$repo_url"# 推送代码到远程仓库git push -u origin master# 返回到 app 目录cd ..
done

在上述脚本中,你需要将 <你的用户名> 替换为你在 GitHub 上的用户名。

这样,脚本将会根据每个文件夹的名称构建对应的 GitHub 仓库 URL,并将其作为远程仓库地址添加到各个仓库中。

请注意,这种方法假设每个文件夹的名称与对应的 GitHub 仓库名称完全匹配。如果文件夹名称和仓库名称不一致,你可能需要对脚本进行进一步修改以适应你的情况。

希望这次修改能满足你的需求!如果你需要进一步帮助,请随时提问。

三、 GitHub 创建空仓库

3.1 初始版本

你可以使用 shell 脚本通过 GitHub API 在 GitHub 上创建一个空的远程仓库。以下是一个使用 cURL 命令的示例脚本:

#!/bin/bash# 你的 GitHub 用户名和访问令牌
USERNAME="<你的用户名>"
ACCESS_TOKEN="<你的访问令牌>"# 仓库名称
REPO_NAME="my-repo"# 构建 API URL
API_URL="https://api.github.com/user/repos"# 创建仓库的 JSON 数据
JSON_DATA="{\"name\":\"$REPO_NAME\",\"private\":false}"# 发送 POST 请求创建仓库
curl -u "$USERNAME:$ACCESS_TOKEN" -d "$JSON_DATA" "$API_URL"

在上述脚本中,你需要将 <你的用户名> 替换为你的 GitHub 用户名,并将 <你的访问令牌> 替换为你的 GitHub 访问令牌。

脚本中使用的 GitHub API 是 /user/repos,它允许你创建一个属于当前用户的新仓库。name 参数指定了仓库名称,private 参数设置为 false 表示创建一个公开仓库。

运行脚本后,它将使用提供的用户名和访问令牌发送一个 POST 请求来创建一个空的远程仓库。

请确保在运行脚本之前安装了 cURL 工具,并且替换脚本中的相应参数。

3.2 优化版本

基于response

server@dev-fj-srv:~/Desktop$ ./create_repo.sh 
{"id": 735911698,"node_id": "R_kgDOK90fEg","name": "FreemeNotes","full_name": "fangjian98/FreemeNotes","private": false,"owner": {"login": "fangjian98","id": 59403187,"node_id": "MDQ6VXNlcjU5NDAzMTg3","avatar_url": "https://avatars.githubusercontent.com/u/59403187?v=4","gravatar_id": "","url": "https://api.github.com/users/fangjian98","html_url": "https://github.com/fangjian98","followers_url": "https://api.github.com/users/fangjian98/followers","following_url": "https://api.github.com/users/fangjian98/following{/other_user}","gists_url": "https://api.github.com/users/fangjian98/gists{/gist_id}","starred_url": "https://api.github.com/users/fangjian98/starred{/owner}{/repo}","subscriptions_url": "https://api.github.com/users/fangjian98/subscriptions","organizations_url": "https://api.github.com/users/fangjian98/orgs","repos_url": "https://api.github.com/users/fangjian98/repos","events_url": "https://api.github.com/users/fangjian98/events{/privacy}","received_events_url": "https://api.github.com/users/fangjian98/received_events","type": "User","site_admin": false},"html_url": "https://github.com/fangjian98/FreemeNotes","description": null,"fork": false,"url": "https://api.github.com/repos/fangjian98/FreemeNotes","forks_url": "https://api.github.com/repos/fangjian98/FreemeNotes/forks","keys_url": "https://api.github.com/repos/fangjian98/FreemeNotes/keys{/key_id}","collaborators_url": "https://api.github.com/repos/fangjian98/FreemeNotes/collaborators{/collaborator}","teams_url": "https://api.github.com/repos/fangjian98/FreemeNotes/teams","hooks_url": "https://api.github.com/repos/fangjian98/FreemeNotes/hooks","issue_events_url": "https://api.github.com/repos/fangjian98/FreemeNotes/issues/events{/number}","events_url": "https://api.github.com/repos/fangjian98/FreemeNotes/events","assignees_url": "https://api.github.com/repos/fangjian98/FreemeNotes/assignees{/user}","branches_url": "https://api.github.com/repos/fangjian98/FreemeNotes/branches{/branch}","tags_url": "https://api.github.com/repos/fangjian98/FreemeNotes/tags","blobs_url": "https://api.github.com/repos/fangjian98/FreemeNotes/git/blobs{/sha}","git_tags_url": "https://api.github.com/repos/fangjian98/FreemeNotes/git/tags{/sha}","git_refs_url": "https://api.github.com/repos/fangjian98/FreemeNotes/git/refs{/sha}","trees_url": "https://api.github.com/repos/fangjian98/FreemeNotes/git/trees{/sha}","statuses_url": "https://api.github.com/repos/fangjian98/FreemeNotes/statuses/{sha}","languages_url": "https://api.github.com/repos/fangjian98/FreemeNotes/languages","stargazers_url": "https://api.github.com/repos/fangjian98/FreemeNotes/stargazers","contributors_url": "https://api.github.com/repos/fangjian98/FreemeNotes/contributors","subscribers_url": "https://api.github.com/repos/fangjian98/FreemeNotes/subscribers","subscription_url": "https://api.github.com/repos/fangjian98/FreemeNotes/subscription","commits_url": "https://api.github.com/repos/fangjian98/FreemeNotes/commits{/sha}","git_commits_url": "https://api.github.com/repos/fangjian98/FreemeNotes/git/commits{/sha}","comments_url": "https://api.github.com/repos/fangjian98/FreemeNotes/comments{/number}","issue_comment_url": "https://api.github.com/repos/fangjian98/FreemeNotes/issues/comments{/number}","contents_url": "https://api.github.com/repos/fangjian98/FreemeNotes/contents/{+path}","compare_url": "https://api.github.com/repos/fangjian98/FreemeNotes/compare/{base}...{head}","merges_url": "https://api.github.com/repos/fangjian98/FreemeNotes/merges","archive_url": "https://api.github.com/repos/fangjian98/FreemeNotes/{archive_format}{/ref}","downloads_url": "https://api.github.com/repos/fangjian98/FreemeNotes/downloads","issues_url": "https://api.github.com/repos/fangjian98/FreemeNotes/issues{/number}","pulls_url": "https://api.github.com/repos/fangjian98/FreemeNotes/pulls{/number}","milestones_url": "https://api.github.com/repos/fangjian98/FreemeNotes/milestones{/number}","notifications_url": "https://api.github.com/repos/fangjian98/FreemeNotes/notifications{?since,all,participating}","labels_url": "https://api.github.com/repos/fangjian98/FreemeNotes/labels{/name}","releases_url": "https://api.github.com/repos/fangjian98/FreemeNotes/releases{/id}","deployments_url": "https://api.github.com/repos/fangjian98/FreemeNotes/deployments","created_at": "2023-12-26T12:41:16Z","updated_at": "2023-12-26T12:41:16Z","pushed_at": "2023-12-26T12:41:16Z","git_url": "git://github.com/fangjian98/FreemeNotes.git","ssh_url": "git@github.com:fangjian98/FreemeNotes.git","clone_url": "https://github.com/fangjian98/FreemeNotes.git","svn_url": "https://github.com/fangjian98/FreemeNotes","homepage": null,"size": 0,"stargazers_count": 0,"watchers_count": 0,"language": null,"has_issues": true,"has_projects": true,"has_downloads": true,"has_wiki": true,"has_pages": false,"has_discussions": false,"forks_count": 0,"mirror_url": null,"archived": false,"disabled": false,"open_issues_count": 0,"license": null,"allow_forking": true,"is_template": false,"web_commit_signoff_required": false,"topics": [],"visibility": "public","forks": 0,"open_issues": 0,"watchers": 0,"default_branch": "main","permissions": {"admin": true,"maintain": true,"push": true,"triage": true,"pull": true},"allow_squash_merge": true,"allow_merge_commit": true,"allow_rebase_merge": true,"allow_auto_merge": false,"delete_branch_on_merge": false,"allow_update_branch": false,"use_squash_pr_title_as_default": false,"squash_merge_commit_message": "COMMIT_MESSAGES","squash_merge_commit_title": "COMMIT_OR_PR_TITLE","merge_commit_message": "PR_TITLE","merge_commit_title": "MERGE_MESSAGE","network_count": 0,"subscribers_count": 0
}

为了优化代码以输出仓库 URL 和成功或失败的提示信息,你可以使用命令替换(command substitution)来捕获 curl 命令的输出,并根据返回状态进行相应的处理。下面是经过修改的示例脚本:

#!/bin/bash# 你的 GitHub 用户名和访问令牌
USERNAME="<你的用户名>"
ACCESS_TOKEN="<你的访问令牌>"# 仓库名称
REPO_NAME="my-repo"# 构建 API URL
API_URL="https://api.github.com/user/repos"# 创建仓库的 JSON 数据
JSON_DATA="{\"name\":\"$REPO_NAME\",\"private\":false}"# 发送 POST 请求创建仓库并捕获输出
response=$(curl -s -u "$USERNAME:$ACCESS_TOKEN" -d "$JSON_DATA" "$API_URL")# 检查返回状态并输出相应信息
if [[ $? -eq 0 ]]; thenrepo_url=$(echo "$response" | grep -o '"html_url": "[^"]*' | grep -o '[^"]*$')echo "仓库创建成功!"echo "仓库 URL:$repo_url"
elseecho "仓库创建失败!"
fi

在上述脚本中,-s 参数用于 curl 命令,以静默模式发送请求并隐藏进度信息。$? 是上一个命令的返回状态,我们使用它来检查 curl 命令是否成功执行。grep 命令用于从 curl 输出中提取仓库 URL。

如果 curl 命令成功执行,脚本将提取仓库 URL 并输出成功的提示信息,否则将输出失败的提示信息。

请确保在运行脚本之前安装了 cURL 工具,并且替换脚本中的相应参数。

四、Gitee 创建空仓库

你可以使用 shell 脚本通过 Gitee API 在 Gitee 上创建一个空的远程仓库。以下是一个使用 cURL 命令的示例脚本:

#!/bin/bash# 你的 Gitee 用户名和访问令牌
USERNAME="<你的用户名>"
ACCESS_TOKEN="<你的访问令牌>"# 仓库名称
REPO_NAME="my-repo"# 构建 API URL
API_URL="https://gitee.com/api/v5/user/repos"# 创建仓库的 JSON 数据
JSON_DATA="{\"name\":\"$REPO_NAME\",\"private\":false}"# 发送 POST 请求创建仓库
curl -X POST -H "Content-Type: application/json" -H "Authorization: token $ACCESS_TOKEN" -d "$JSON_DATA" "$API_URL"

在上述脚本中,你需要将 <你的用户名> 替换为你的 Gitee 用户名,并将 <你的访问令牌> 替换为你的 Gitee 访问令牌。

脚本中使用的 Gitee API 是 /api/v5/user/repos,它允许你以当前用户的身份创建一个新的仓库。name 参数指定了仓库名称,private 参数设置为 false 表示创建一个公开仓库。

运行脚本后,它将使用提供的用户名和访问令牌发送一个 POST 请求来创建一个空的远程仓库。

请确保在运行脚本之前安装了 cURL 工具,并且替换脚本中的相应参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/227391.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性&#xff0c;但c依赖于特定的平台。java没有指针&#xff0c;它的引用可以理解为安全指针&#xff0c;而c和c一样具有指针。java支持自动垃圾回收&#xff0c;而c需要手动回收。java不支持多重继承&#xff0c;只能通过实现多个接口来…

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…

Prometheus快速入门实战

介绍 prometheus 受启发于 Google 的 Brogmon 监控系统&#xff08;相似 kubernetes 是从 Brog 系统演变而来&#xff09;。2016 年 5 月继 kubernetes 之后成为第二个加入 CNCF 基金会的项目&#xff0c;同年 6 月正式发布 1.0 版本。2017 年底发布基于全新存储层的 2.0 版本…

nginx设置跨域访问

目录 一&#xff1a;前端请求 二&#xff1a;后端设置 网站架构前端使用jquery请求&#xff0c;后端使用nginxphp-fpm 一&#xff1a;前端请求 <script> $.getJSON(http://nngzh.youjoy.com/cc.php, { openid: sd, }, function(res) { alert(res); if(res.code 0) …

华锐视点为广汽集团打造VR汽车在线展厅,打破地域限制,尽享购车乐趣

随着科技的飞速发展&#xff0c;我们正在进入一个全新的时代——元宇宙时代。元宇宙是一个虚拟的世界&#xff0c;它不仅能够模拟现实世界&#xff0c;还能够创造出现实世界无法实现的事物。而汽车行业作为人类生活的重要组成部分&#xff0c;也在积极探索与元宇宙的融合&#…

CompletableFuture是什么?以及CompletableFuture的作用

文章目录 CompletableFuture 今天我们来聊聊 CompletableFuture CompletableFuture CompletableFuture 是 JDK1.8 里面引入的一个基于事件驱动的异步回调类。 简单来说&#xff0c;就是当使用异步线程去执行一个任务的时候&#xff0c;我们希望在任务结束以后触发一个后续的动作…

jmeter函数助手-常用汇总

一.函数助手介绍 1.介绍及作用 介绍&#xff1a; jmeter自带的一个特性&#xff0c;可以通过指定的函数规则创建后进行调用该函数&#xff0c;在后续接口请求参数中进行调用 作用 &#xff08;1&#xff09;做参数化。 2.如何使用 jmeter工具栏-->工具-->函数助手…

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术&#xff08;License Plate Recognition, LPR&#xff09;在交通计算机视觉&#xff08;Computer Vision, CV&#xff09;领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

VSCODE 修改Test模式下的的java jvm堆内存大小

在settings.json中添加如下语句 "java.test.config": {"vmArgs": ["-Xmx12G"]},

《HelloGitHub》第 93 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

超简单实用,推荐的深度学习科研必备网站(轻松找论文,代码项目,写论文综述)

一个非常有用的深度学习必备网站 网址推荐 接触新方向需要了解的内容1.在某一个研究方向下&#xff0c;有哪些算法模型可以用&#xff1f;不同算法之间效果对比如何&#xff1f;2.在某一个研究方向下&#xff0c;到底有哪些论文&#xff0c;模型是可以用的&#xff1f;3.在某一…

【办公技巧】怎么批量提取文件名到excel

Excel是大家经常用来制作表格的文件&#xff0c;比如输入文件名&#xff0c;如果有大量文件需要输入&#xff0c;用张贴复制或者手动输入的方式还是很费时间的&#xff0c;今天和大家分享如何批量提取文件名。 打开需要提取文件名的文件夹&#xff0c;选中所有文件&#xff0c…

【VS】NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。

问题描述 报错 NETSDK1045 严重性代码说明项目文件行禁止显示状态错误NETSDK1045当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标&#xff0c;或使用支持 .NET 6.0 的 .NET SDK 版本。RCSoftDrawMicrosoft.NET.TargetFrameworkInference.ta…

Linux stress命令---压力测试

一、使用场景 CPU压力测试 内存压力测试 磁盘IO测试 Swap可用性测试 二、语法及常用参数 stress [选项] [进程数] -?, --help&#xff1a;显示帮助信息 --version&#xff1a;显示版本信息 -v, --verbose&#xff1a;详细输出 -q, --quiet&#xff1a;静默输出 -t, --timeout&…

AI安全综述

1、引言 AI安全这个话题&#xff0c;通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生&#xff0c;包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性&#xff0c;有一系列的理论来论述对抗样本…

ARM串口通信编程实验

完成&#xff1a;从终端输入选项&#xff0c;完成点灯关灯&#xff0c;打开风扇关闭风扇等操作 #include "gpio.h" int main() {char a;//char buf[128];uart4_config();gpio_config();while(1){//接收一个字符数据a getchar();//发送接收的字符putchar(a);switch(…

精品Nodejs实现的校园疫情防控管理系统的设计与实现健康打卡

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Win…

c语言-指针练习题

目录 前言一、题目一二、题目二总结 前言 为了巩固c语言中关于指针知识点的掌握&#xff0c;本篇文章记录关于指针的练习题。 一、题目一 有n个整数&#xff0c;使前面各数顺序往后移动m个位置&#xff0c;最后m个数变成最前面的m个数 写一函数实现以上功能&#xff0c;在主函…

C语言课程设计参考题目

一、工资管理系统 需求分析 工资信息存放在文件中&#xff0c;提供文件的输入、输出等操作&#xff1b;要实现浏览功能&#xff0c;提供显示、排序操作&#xff1b;而查询功能要求实现查找操作&#xff1b;另外还应该提供键盘式选择菜单以实现功能选择。 2、总体设计 整个系统可…

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

&#x1f451; YOLOv8改进有效系列目录 &#x1f451; 前言 Hello&#xff0c;各位读者们好 本专栏自开设两个月以来已经更新改进教程60余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新&#xff0c;也有损失函数和一些细节点上的创新。同时本人一些讲解视频…