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

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

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

一、需求

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 工具,并且替换脚本中的相应参数。

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

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

相关文章

VOL_dev问题随记----question++!!!

目录 1.问题&#xff1a;代码生成&#xff0c;快捷编辑不生效(linktrue没用)2.问题&#xff1a;代码生成后&#xff0c;后端报文件以重复定义3.问题&#xff1a;控制台报using无法引用类包4.问题&#xff1a;代码生成后&#xff0c;生成业务类库后无效&#xff0c;系统出现未找…

什么是redis雪崩

Redis雪崩是指在使用Redis作为缓存数据库时&#xff0c;由于某种原因导致Redis服务器不可用或性能严重下降&#xff0c;从而导致大量的请求集中到数据库服务器上&#xff0c;甚至直接导致数据库服务器崩溃。 当Redis服务器出现雪崩时&#xff0c;原本应该被缓存的数据无法从缓…

Android Audio实战——AudioTrack分析(二十六)

AudioTrack 是用于播放音频数据的类,可以使用 set 方法设置音频数据,然后使用 start 来启动播放。而 pause 和 stop 则是用于控制播放过程的方法。不管 APP 使用什么播放音频文件,最终都是由 AudioTrack 将数据传递下去。 一、源码分析 1、主要方法 构造函数:创建 AudioT…

GPT在企业自动化方面的应用

GPT和类似的自然语言处理技术在企业自动化方面有许多应用。以下是一些主要的应用领域&#xff1a; 自动化客户支持&#xff1a; 使用GPT可以构建自动化的客户支持系统&#xff0c;能够理解和生成自然语言文本&#xff0c;回答常见问题&#xff0c;解决用户的疑问和问题。 自动…

记一次Mac端mysql重置密码

在执行mysql命令的时候&#xff0c;报如下的错误&#xff0c;表示不支持mysql命令&#xff1a; zsh: command not found: mysql 1. 先查看mysql服务是否存在 在系统偏好设置中查看&#xff1a; 2. 发现mysql服务已经在运行&#xff0c;可能因为/usr/local/bin目录下缺失mysq…

如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。 考虑一个简化的餐厅订单处理系统&#xff0c;其中包括服务员&#xff08;Waiter&#xff09;、厨师&#xff08;Chef&#xff09;和收银员&#xff08;Cashier&#xff09;。订单从服务员开始&#xff0c;然后传递给厨师&#xff0c…

使用BeanDefinition来构建Spring Bean并注入Spring上下文中

在做中间件产品的时候&#xff0c;为了给业务方一个好用的客户端&#xff0c;我们一般会提供一个自定义的xxx-spring-boot-starter&#xff0c;那么我们就可能涉及到将自己的客户端中的某个类初始化并注入到Spring上下文中去。为了更标准化去初始化这个类&#xff0c;让Spring来…

Windows10系统下CGAL的安装编译

文章目录 环境与依赖库1、环境2、依赖库Boost库安装步骤Qt安装步骤CGAL5.6安装步骤CGAL5.6编译环境与依赖库 1、环境 Windows10系统Visual Studio 20222、依赖库 Boost库版本:1.73Qt库版本:5.12CGAL版本:5.6Boost库安装步骤 boost是CGAL的强制依赖库。 1、下载boost_1_73…

ubuntu22.04搭建RTSP服务器

大致命令如下&#xff1a; git clone --depth 1 gitgithub.com:ZLMediaKit/ZLMediaKit.git sudo apt-get install build-essential sudo apt-get install cmake #除了openssl,其他其实都可以不安装 sudo apt-get install libssl-dev sudo apt-get install libsdl-dev sudo apt…

无法获取前置摄像头的预览图像?【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结HarmonyOS和OpenHarmony区别和联系项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了无法获取前置摄像头的预览图像的问题。 问题:前置摄像头…

(一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。

本文简单介绍一下ClickHouse 中的 MaterializedMySQL 数据库引擎的使用方法、设置、特性和限制。以下是具体的内容和步骤&#xff1a; 介绍和使用说明: MaterializedMySQL 是一个实验性的数据库引擎。它允许创建一个 ClickHouse 数据库&#xff0c;其中包含了 MySQL 中的所有表…

linux基于用户身份对资源访问进行控制的解析及过程

linux中用户分为三类 1.超级用户&#xff08;root&#xff09; 拥有至高无上的权限 2.普通用户 人为创建、权限小&#xff0c;权限受到控制 3.程序用户 运行程序的用户&#xff0c;不是给人使用的&#xff0c;给程序使用的&#xff0c;一般不给登录&#xff01; 组账…

【LeetCode刷题笔记(13-1)】【Python】【回文数】【反转整数】【简单】

文章目录 引言回文数题目描述提示 题意分析解决方案1&#xff1a;【反转字符串】解决方案2&#xff1a;【反转整数】题外话结束语 9. 回文数 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0…

【AI】人工智能爆发推进器之卷积神经网络

目录 一、什么是卷积神经网络 1. 卷积层&#xff08;Convolutional Layer&#xff09; 2. 激活函数&#xff08;Activation Function&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 4. 全连接层&#xff08;Fully Connected Layer&#xff09; 5. 训练过程…

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…

区块链白皮书:基础建设见成效,国产自主生态正发展壮大

“区块链是全球信任机器的重要组成部分”——比尔盖茨 随着科技的飞速发展&#xff0c;区块链技术已成为引领全球创新的重要力量。近日&#xff0c;中国信通院发布了《区块链白皮书&#xff08;2023年&#xff09;》&#xff0c;为我们揭示了这一领域的前沿动态和未来发展趋势…

JDK 14全景透视:每个Java开发者必知的新特性

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 JDK 14全景透视&#xff1a;每个Java开发者必知的新特性 前言&#xff1a;switch表达式标准化Switch表达式成为正式特性的意义&#xff1a;如何使用Switch表达式&#xff1a;注意事项&#xff1a; ins…

docker安装Nacos和Rabbitmq

一、安装Nacos 首先需要拉取对应的镜像文件&#xff1a;&#xff08;切换版本加上对应版本号即可&#xff0c;默认最新版&#xff09; docker pull nacos/nacos-server 接着挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p …

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示&#xff0c;求 A, A2, A3, A4&#xff0c;并回答诸问题&#xff1a; 中间有几章这里没有写&#xff0c;感兴趣可以自己去学&#xff0c;组合数学跟高中差不多&#xff0c…

ElasticSearch 常用运维命令收集

ElasticSearch 常用运维命令收集 1. 集群健康检查 快速查看 curl -XGET localhost:9200/_cat/health?v&pretty集群的健康状态status&#xff0c;还可以了解到集群当前有多少节点number_of_nodes&#xff0c;多少个数据节点number_of_data_nodes&#xff0c;有多少个主分片…