1-远程仓库环境准备

1.1-注册 Gitee 账号

由于使用 Git 作为版本控制工具,所以只要是 Git 支持的托管平台都是可以的。比如 Github、Gitlab。这里使用 Gitee 主要是考虑到安卓端访问 Gitee 更容易。

1.2-创建远程仓库

创建一个远程仓库,用于存放笔记文件。

2-本地仓库环境准备

多端同步的核心工具是 Git,因此首先要在每个需要同步的平台上配置好 Git 环境。

2.1-安装和配置 Git

PC 端安装和配置 Git 非常容易,因此不再赘述了,这里主要说一下安卓端。

Git 没有直接提供 Andriod 端的版本,所以需要借助 Termux 这个安卓平台上的终端模拟器来安装和运行。

使用 Termux 还有一个特点就是很多操作和 Linux 平台上都是一致的,比如后面要使用 bash 脚本进行本地和远程仓库之间的同步操作,Linux 和 安卓端可以使用除了路径信息不一样外完全相同的脚本。

因此首先要安装 Termux

2.1.1-安装 Termux

Termux 可以通过 F-Droid 或者从 Github 下载安装包来安装。

2.1.2-为 Termux 获取设备存储访问权限

由于安卓环境的特殊性,Termux 本身是没有安卓设备存储的访问权限的,因为后续要对本地仓库文件夹进行一系列的操作,所以这一部是非常必要重要的。

  1. Termux 中执行以下命令:

    termux-setup-storage
  2. 之后手机会提示授权,同意即可。

之后,Termux 会在 目录(~Termux 默认用户的 Home 目录,对应于手机存储的实际的 /data/data/com.termux/files/home 目录)下创建几个目录来映射手机对应的目录,当然,都是在 /storage/emulated/0 之下的目录。具体映射情况如下表:

Termux 中的路径 手机存储中的实际路径 说明
~/storage/shared /storage/emulated/0 相当于手机的默认用户的 Home 目录。
~/storage/downloads /storage/emulated/0/Download 从系统浏览器等应用下载的文件默认保存目录。
~/storage/dcim /storage/emulated/0/DCIM 相机捕获的图片和视频的常规存储目录。
~/storage/pictures /storage/emulated/0/Pictures 用户可访问的图片存储目录。
~/storage/music /storage/emulated/0/Music 用户音乐列表中的音频文件存储目录。
~/storage/movies /storage/emulated/0/Movies 用户可访问的电影存储目录。
~/storage/external-1 外部存储卡路径(如果存在) 如果设备有外部存储卡,此目录会映射到外部存储卡的 Termux 私有文件夹。

这里重点需要关注的是 ~/storage/shared -> /storage/emulated/0

总之,就可以在 Termux 中使用映射的路径来访问手机的目录了,包括后续在 Termux 中访问、git 操作、bash 脚本中都使用映射的路径来访问。

2.1.3-在 Termux 中安装 Git

Termux 的默认包管理器是 pkg。习惯上,在使用包管理器安装特定的包之前,首先应更新软件包索引

  1. 更新 pkg 软件包索引。

    Termux 中输入以下命令:

    pkg update
  2. 安装 Git

    Termux 中输入以下命令:

    pkg install git

至此,安卓平台的 Git 就安装完成了。

2.1.4-配置 Git 用户信息

配置本地 Git 的 user.nameuser.email 信息,这对于 Git 的推送操作来说是必不可少的。

Termux 中输入以下两条命令:

  1. git config --global user.name "your name"
  2. git config --global user.email "your@email.com"

其中,

  • config 表示此命令用于配置一些东西;
  • --global 表示配置全局信息,即配置的内容对当前用户下的所有本地 Git 仓库都生效,这不是必要的,但没有特殊需求的话推荐这样做;
  • user.nameuser.email 是所要配置的对象,对于推送操作来说,这两个信息是必不可少的;
  • 最后的字符串是配置的内容,一般与代码托管平台上的信息相一致。

2.2-配置 SSH 密钥

创建 SSH 密钥是为了使用 SSH 协议更方便快捷的对远程仓库进行拉取推送

SSH 密钥是一种加密技术,一个 SSH 密钥包含一个公钥和一个私钥,公钥用于公开给别人,别人使用此公钥加密后的数据,只有对应的私钥能解密。因此,SSH 加密技术通常用于单向通信。

在每个平台上都需要生成一对 SSH 密钥。

  1. 生成 SSH 密钥

    每个平台生成 SSH 密钥的命令基本是一致的:

    ssh-keygen -t rsa -C "注释信息"

    其中,

    • ssh-keygenOpenSSH 提供的一个用于生成 SSH 密钥对的工具;
    • -t rsa 指定了密钥的类型或者说使用的加密算法;
    • -C "注释信息" 指定了密钥的注释信息,这不是必要的,但通常的做法是用自己的邮箱地址作为注释信息。

输入命令后一路回车即可。

  1. 将每个平台的公钥添加到托管平台上

上一步生成后在 ~/.ssh 目录下会有 id_rsaid_rsa.pub 两个文本文件,其中,id_rsa 里存的是私钥,id_rsa.pub 里存的是公钥,将每个平台上的 id_rsa.pub 文件中的内容分别复制,并添加到托管平台的 SSH 公钥列表中。

2.3-创建并配置本地仓库

2.3.1-创建本地仓库

  1. 首先分别在每个平台上,创建好用于存放笔记的文件夹,建议使用统一的名字,如 Joplin

安卓端,为了 Joplin 软件以及你自己能够方便的访问,建议将目录创建在 /storage/emulated/0 之下,比如 /storage/emulated/0/Joplin

  1. 初始化 Git 仓库,进入仓库目录,输入以下命令:

    git init .

  2. 配置远程仓库的链接

首先应获取远程仓库的 SSH 链接,建议复制粘贴,以免错误。在远程仓库的页面中就可以找到,注意要找的是 SSH 链接,应该类似下面这个样子:

git@gitee.com:mtueih/joplin.git

在仓库目录中,输入以下命令:

git remote add origin "git@gitee.com:mtueih/joplin.git"

注意将后面的链接替换成你的仓库的 SSH 链接。

★【针对安卓端】将仓库目录添加到 Git 的安全目录列表中

处于对安全的考虑,当执行一个 Git 操作时,如果操作的目标仓库的所有权不属于执行此操作的用户,这个操作不会被执行,并且 Git 会给出错误信息。简而言之就是 Git 只允许对属于的仓库执行操作。

Termux 环境中,通常都是以其默认用户的身份执行 Git 操作的,而创建在 /storage/emulated/0 之下的 Git 仓库的所有权并不是 Termux默认用户的,而是手机的默认用户的,或者说是因为此仓库的路径在 Termux 的默认用户的 Home 目录之外,这就会导致前述问题。

如前所述,将仓库目录创建在 /storage/emulated/0/Joplin 是迫不得已,所以有两种解决办法,一是修改仓库的所有权,二是将仓库目录添加到 Termux 的默认用户的全局 Git 配置的安全目录列表中。这里使用第二种方法。

在 Termux 中执行以下命令:

git config --global --add safe.directory /storage/emulated/0/joplin

这里注意将后面的仓库路径修改为你的仓库的实际路径,经实验,在此处使用 Termux 所映射的绝对/相对路径(/data/data/com.termux/files/home/storage/shared/joplin~/storage/shared/joplin),和手机存储的实际路径(/storage/emulated/0/joplin),三者都是可以的,但是在没有解决这个问题之前执行 Git 命令,Git 给出的错误消息中,使用的是 /storage/emulated/0/joplin,至于为什么,咱就不得而知了。


至此,远程和本地仓库的环境就准备好了。接下来就需要设置 Joplin 以让其将同步内容输出至本地仓库文件夹了。

3-设置 Joplin 的同步路径

这一步在每个平台上的步骤都差不多,进入 Joplin 关于同步的设置,将同步目标改为文件系统,然后输入/选择之前创建的仓库路径即可。

如需加密,需要在每个平台上设置相同的主密码。

4-通过脚本简化同步流程

至此三端的同步其实已经搭建好了,但每次都要敲一大堆命令来同步实在是,尤其是在安卓端。另外我们可能需要,自动,定时触发同步操作,因此就不得不借助脚本。

由于操作系统之间的父子关系,实际上只需要为不同的平台编写两个脚本(当然,每个平台可能有细微的差异)就好:Powershell 脚本(什么?不会有人用 Windows 不装 Powershell 吧?那 bat 脚本也行)和Bash 脚本。

4.1-Bash 脚本

由于 Bash 几乎是所有类 Unix 环境(包括 Termux)的默认 shell 工具,所以这里编写 Bash 的脚本。

这里以安卓端为例。

★经实测,在安卓端只能使用 /storage/emulated/0/joplin/data/data/com.termux/files/home/storage/shared/joplin 这两个绝对路径,使用 ~/storage/shared/joplin 是不行的,Git 会找不到这个路径。

#!/bin/bash

# 设置本地仓库路径(根据实际情况修改)
repo_path="/storage/emulated/0/joplin" # 切换到本地仓库目录
cd $repo_path # 检查是否有未提交的改动
if git status --porcelain | grep -q .; then
echo "检测到本地改动,准备提交..."
# 添加所有改动到暂存区
git add .
# 提交改动,使用当前时间作为提交信息
commit_message="自动提交于 $(date +%Y-%m-%d\ %H:%M:%S)"
git commit -m "$commit_message"
echo "本地改动已提交。"
else
echo "本地没有未提交的改动。"
fi # 获取远程和本地仓库的最新提交哈希值
local_hash=$(git rev-parse HEAD)
git fetch origin main
remote_hash=$(git rev-parse origin/main) # 比较本地和远程仓库的哈希值
if [ "$local_hash" != "$remote_hash" ]; then
# 检查本地哈希值是否包含在远程分支中
if git merge-base --is-ancestor $remote_hash $local_hash; then
echo "本地仓库比远程仓库新,准备推送更改..."
git push origin main
echo "推送完成。"
elif git merge-base --is-ancestor $local_hash $remote_hash; then
echo "远程仓库比本地仓库新,准备拉取更改..."
git pull origin main
echo "拉取完成。"
else
# 本地和远程仓库有分歧,询问用户保留哪个版本
echo "本地和远程仓库有分歧。请选择保留哪个版本:"
echo "1) 保留远程版本 (pull --rebase)"
echo "2) 保留本地版本 (push --force)"
echo "3) 手动解决冲突"
read -p "请选择一个选项 (1/2/3): " user_choice if [ "$user_choice" == "1" ]; then
echo "准备拉取远程更改并变基..."
git pull --rebase origin main
echo "拉取并变基完成。"
elif [ "$user_choice" == "2" ]; then
echo "准备强制推送本地更改..."
git push --force origin main
echo "强制推送完成。"
elif [ "$user_choice" == "3" ]; then
echo "请手动解决冲突。"
# 在这里可以添加手动解决冲突的步骤,例如使用 git mergetool
else
echo "无效的选择,脚本终止。"
fi
fi
else
echo "远程仓库和本地仓库同步,无需操作。"
fi

其他平台(除了 Windows)只有仓库路径不一样,其他都是一样的。

4.2-Powershell 脚本

# 设置本地仓库路径(根据实际情况修改)
$repo_path = "E:\Joplin" # 切换到本地仓库目录
Set-Location -Path $repo_path # 检查是否有未提交的改动
$git_status = git status --porcelain
if ($git_status) {
Write-Host "检测到本地改动,准备提交..."
# 添加所有改动到暂存区
git add .
# 提交改动,使用当前时间作为提交信息
$commit_message = "自动提交于 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
git commit -m $commit_message
Write-Host "本地改动已提交。"
} else {
Write-Host "本地没有未提交的改动。"
} # 获取远程和本地仓库的最新提交哈希值
$local_hash = git rev-parse HEAD
git fetch origin main
$remote_hash = git rev-parse origin/main # 比较本地和远程仓库的哈希值
if ($local_hash -ne $remote_hash) {
# 检查本地哈希值是否包含在远程分支中
if (git merge-base --is-ancestor $remote_hash $local_hash) {
Write-Host "本地仓库比远程仓库新,准备推送更改..."
git push origin main
Write-Host "推送完成。"
} elseif (git merge-base --is-ancestor $local_hash $remote_hash) {
Write-Host "远程仓库比本地仓库新,准备拉取更改..."
git pull origin main
Write-Host "拉取完成。"
} else {
# 本地和远程仓库有分歧,询问用户保留哪个版本
Write-Host "本地和远程仓库有分歧。请选择保留哪个版本:"
Write-Host "1) 保留远程版本 (pull --rebase)"
Write-Host "2) 保留本地版本 (push --force)"
Write-Host "3) 手动解决冲突"
$user_choice = Read-Host "请选择一个选项 (1/2/3)" if ($user_choice -eq "1") {
Write-Host "准备拉取远程更改并变基..."
git pull --rebase origin main
Write-Host "拉取并变基完成。"
} elseif ($user_choice -eq "2") {
Write-Host "准备强制推送本地更改..."
git push --force origin main
Write-Host "强制推送完成。"
} elseif ($user_choice -eq "3") {
Write-Host "请手动解决冲突。"
# 在这里可以添加手动解决冲突的步骤,例如使用 git mergetool
} else {
Write-Host "无效的选择,脚本终止。"
}
}
} else {
Write-Host "远程仓库和本地仓库同步,无需操作。"
}

使用 Joplin + Git + Gitee 实现笔记的多端同步的更多相关文章

  1. git的学习笔记(二):git远程操作

    1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...

  2. [常用工具] git基础学习笔记

    git基础学习笔记,参考视频:1小时玩转 Git/Github 添加推送信息,-m= message git commit -m "添加注释" 查看状态 git status 显示 ...

  3. Git Pro读书笔记

    本文为Git Pro读书笔记,所有内容均来自Git Pro 1 Git基础 1.1 记录每次更新到仓库 在Git里,文件有4种状态,modified, staged, commited, 还有一种状态 ...

  4. Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'

    大家在通过本地仓库上传文件到远程仓库时,会报出 error:failed to push some refs to 'git@gitee.com:name/project.git' 的错误. 解决方法 ...

  5. git tag 常用笔记

    git tag 常用笔记 查看 tag 列出现有 tag git tag 列出 v1.4.2 相关的 tag git tag -l "v1.4.2" 查看指定 tag 的信息 gi ...

  6. 【第十一篇】- Git Gitee之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git Gitee 大家都知道国内访问 Github 速度比较慢,很影响我们的使用. 如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务--Gitee(gitee.com). G ...

  7. Git&Gitee

    目录 Git Git介绍 安装 命令学习 Git的作用 git与svn比较 Git,GitHub,GitLab,Gitee Git工作流程 Git常用命令 在仓库目录终端下 - 设置全局用户 在仓库目 ...

  8. idea+git+gitee的使用

    idea+git+gitee的使用 下载git并安装 进入官网,选择合适的版本进行下载: 点击进入官网 下载完毕后,安装git 安装idea中的gitee插件 注意:安装好之后重启idea 进入ide ...

  9. git的学习笔记

    1. Git介绍 Git是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发. Git ...

  10. git的学习笔记(一):git本地操作

    1.Git介绍 Git是一个开源的分布式版本控制软件,用以有效.高速的处理从很小到非常大的项目版本管理. Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发. Git ...

随机推荐

  1. JMeter调用python脚本

    JMeter调用python脚本 前提 具备python环境 具备jdk环境 一.编写python脚本 python脚本如下: import random # 随机一个 1~100 的随机数 prin ...

  2. jar脚本练习

    javaServer.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_131 export APP_HOME=/u01/app expo ...

  3. 概率学习(Genshin中)

    目前待补充:停时定理的部分例题. 定义 首先定义样本空间 \(\Omega\),是所有样本点(结果)的集合. 随机事件 \(A\) 是样本空间的子集. 定义事件和为事件并,积为事件交. 事件域 \(\ ...

  4. kickstart和PXE安装

    Kickstart安装Kickstart是一种无人值守的安装方式如果在安装过程中出现要填写参数的情况,安装程序首先会去查找Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数:如果没有 ...

  5. ABB机器人维修I/O通信详细解释

    信号解析的深度探索与解析 在ABB机器人维修系统那精密而复杂的运作机制中,I/O(Input/Output)信号与外围机械手间的通信,是通过一种既高度组织化又精心设计的层次结构来实现的.这一结构严格遵 ...

  6. FastAPI路由与请求处理进阶指南:解锁企业级API开发黑科技 🔥

    title: FastAPI路由与请求处理进阶指南:解锁企业级API开发黑科技 date: 2025/3/3 updated: 2025/3/3 author: cmdragon excerpt: 5 ...

  7. 赶快检查,木马可能已经植入服务器,Redis未授权访问漏洞记录,redis的key值出现backup要谨慎

    问题描述:为图省事,很多时候我们在使用redis的时候会使用默认空密码,这就增加了安全隐患,如果有下属情况,那赶快去检查下redis,木马或许已经植入服务器,应尽快处理: 1.redis绑定在 0.0 ...

  8. php批量删除记录

    <?php $arr = $_POST["item"]; $db = new mysqli("localhost","root",&q ...

  9. mysql : 第5章 数据库的安全性

    -- 创建用户CREATE USER utest@localhost IDENTIFIED BY 'temp';-- 查看所有用户SELECT * FROM mysql.user;-- 查看表级权限S ...

  10. 解决kali虚拟机无法联网问题

    解决kali虚拟机无法联网问题 1.排查虚拟机网络连接-检查ipv4设置,确定好手动连接还是DHCP 如图一 2.排查虚拟网络编辑器-网卡配置,确定虚拟机直连外部网络是否为同一网口 如图二 3.排查虚 ...