gitea的git库备份与恢复
文章目录
- gitea库的备份与恢复
- 概述
- 笔记
- 实验环境
- 更新git for windows
- 更新 TortoiseGit
- 备份已经存在的gitea的git库目录
- 使用gitea本身来备份所有git库目录
- 将gitea库恢复到新目录
- m1
- m2
- m3
- 启动gitea - 此时已经恢复完成
- FETCH_HEAD 中有硬写位置
- 再查一下app.ini, 是否改漏了。
- m1
- m2
- 总结
- 用gitea备份/恢复库无解
- 折中的方法
- END
gitea库的备份与恢复
概述
在本地搭建了gitea的git库.
最开始用的gitea 1.16.8。
本人比较手欠,看见新版本就想升级。
换了几个高版本后,渐渐发现,在启动gitea服务时有以前不曾见过的错误提示(e.g. git库的健康检查错误之类的)。
以前一直用旧版的时候,不曾发现报错问题。
就怀疑是升级后,gitea新版对旧版格式不兼容引起的。因为我的git也换了好几次新版本。
想对现有的本地gitea的git库目录进行备份与恢复,看看能不能解决启动gitea新版的报错问题。
主要还是心里有点怕,为以后gitea的git库损坏和迁移做准备。
笔记
实验环境
win10x64
Git-2.45.1-64-bit.exe
TortoiseGit-2.16.0.0-64bit.msi
gitea-1.22.0-gogit-windows-4.0-amd64.exe.7z
更新git for windows
当前的git也不算旧
E:\git_rep_local>git --version
git version 2.44.0.windows.1
安装 Git-2.45.1-64-bit.exe
更新 TortoiseGit
当前版本
TortoiseGit 2.15.0.0 (C:\Program Files\TortoiseGit\bin)
安装 TortoiseGit-2.16.0.0-64bit.msi
安装完TortoiseGit-2.16.0.0-64bit.msi后,要关闭计算机,再重启计算机。否则计算机桌面反复启动。
重启后,查看git和TortoiseGit版本,都是最新的了。

备份已经存在的gitea的git库目录
这个得先做,而且还要保留备份一段时间(确认更新了gitea的库运行正常了),免得发生杯具。

使用gitea本身来备份所有git库目录
我已经做了实验验证过了,现在重新做实验,顺便记录笔记。
停掉了gitea服务,删掉了目录 e:\git_rep_local
将备份中的git_rep_local目录,释放到 e:

我用的旧版gitea和新版差的不多。
旧版为gitea-1.21.10

新版为 gitea-1.22.0-gogit-windows-4.0-amd64.exe.7z
必须用当前原版的gitea(升级前,正常能用的旧版gitea)的来做备份, 否则报错后,库备份的不能用于恢复。

gitea运行时,要依赖git.
我这里,为了避免环境变量污染,将PATH值都清掉了
先写个.bat, 将git环境备齐。
运行 env_git.bat.
E:\git_rep_local>git --version
git version 2.45.1.windows.1
看到git已经是刚升级过的2.45.1
开始备份(请确认没有正在运行的gitea实例)
gitea-1.21.10-gogit-windows-4.0-amd64.exe dump
不是马上能备份完的,等待命令行结束。

只有用旧版(原版)的gitea备份git库,才能正确完成,不能用新版的gitea.
如果备份时命令行报错,就要从备份的原版gitea的git库中重新备份。
将gitea库恢复到新目录
恢复到新目录的意义(可以在本机的新的目录开始gitea实例,或者在其他计算机上部署本地git库的副本)
建立 E:\git_rep_local_v1,作为空的新目录。
将env_git.bat,gitea-1.22.0-gogit-windows-4.0-amd64.exe,gitea-dump-1716879579.zip拷贝到新目录。

先将gitea-dump-1716879579.zip中的东西释放到E:\git_rep_local_v1

E:\git_rep_local_v1\respos 改名为 gitea-repositories
删掉 E:\git_rep_local_v1\custom\conf\app.ini , 原因 : 这个目录中底层只有一个app.ini,和 E:\git_rep_local_v1\app.ini内容一致,经过实验,发现,最终与运行的配置文件是E:\git_rep_local_v1\custom\conf\app.ini 。等一会将E:\git_rep_local_v1\app.ini,再覆盖回来。
修改 E:\git_rep_local_v1\app.ini 中关于E:\git_rep_local的内容到 E:\git_rep_local_v1
我这里改了2处

将改完的 E:\git_rep_local_v1\app.ini 拷贝为 E:\git_rep_local_v1\custom\conf\app.ini, 否则看不到存在的git库,且库位置也变到了\data下面的gitea-repositories
将原始gitea的git目录 E:\git_rep_local 改名为 E:\git_rep_local_v0, 这样如果在改E:\git_rep_local_v1中有关于原始库路径E:\git_rep_local时,如果没改对(或漏改),容易看出问题。
运行 E:\git_rep_local_v1\env_git.bat
找到自己计算机上sqlite3的官方工具目录 E:\tools\database\sqlite3.44.2\sqlite-tools-win-x64-3440200

在E:\git_rep_local_v1\env_git.bat命令行中临时添加sqlite3的环境变量
set path=E:\tools\database\sqlite3.44.2\sqlite-tools-win-x64-3440200;%path%
现在看一下PATH,git版本,sqlite3版本
E:\git_rep_local_v1>path
PATH=E:\tools\database\sqlite3.44.2\sqlite-tools-win-x64-3440200;C:\Program Files\Git\cmd;C:\Windows\system32;C:\Windows;C:\Windows\system32\wbem;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\binE:\git_rep_local_v1>sqlite3.exe --version
3.44.2 2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f (64-bit)E:\git_rep_local_v1>git --version
git version 2.45.1.windows.1
现在环境全了。
修改 gitea-db.sql
因为我采用的是sqlite3数据库,库的位置是在gitea-db.sql描述的。
在gitea-db.sql中查找 E: (我的库在E盘)子字样的字符串,最终可以找到记录.git库的磁盘物理位置
能找到几处,都改成实际的新库位置。有些SQL还记录要使用的gitea版本,也一起改了。
m1
INSERT INTO `app_state` (`id`, `revision`, `content`) VALUES ('runtime-state',6,'{"last_app_path":"E:/git_rep_local/gitea-1.21.10-gogit-windows-4.0-amd64.exe","last_custom_conf":"E:\\git_rep_local\\custom\\conf\\app.ini"}');
将磁盘位置改为自己的新git目录 E:\git_rep_local_v1
INSERT INTO `app_state` (`id`, `revision`, `content`) VALUES ('runtime-state',6,'{"last_app_path":"E:/git_rep_local_v1/gitea-1.22.0-gogit-windows-4.0-amd64.exe","last_custom_conf":"E:\\git_rep_local_v1\\custom\\conf\\app.ini"}');
哦, 原来使用哪个app.ini这里也记录了。
m2
INSERT INTO `notice` (`id`, `type`, `description`, `created_unix`) VALUES (872,1,'Repository garbage collection failed for E:\git_rep_local_v0\gitea-repositories\xx\my_local_git_prj.git. Stdout: ' || X'0a' || 'Error: context deadline exceeded',1715561802);
修改如下
INSERT INTO `notice` (`id`, `type`, `description`, `created_unix`) VALUES (872,1,'Repository garbage collection failed for E:\git_rep_local_v1\gitea-repositories\xx\my_local_git_prj.git. Stdout: ' || X'0a' || 'Error: context deadline exceeded',1715561802);
m3
现在将 gitea-db.sql 导入gitea的sqlite3数据库。
这个导入,必须在没有gitea.db的情况下进行。如果存在gitea.db,需要删掉再运行命令行。
sqlite3.exe gitea.db < gitea-db.sql
这个导入需要1分钟左右。

启动gitea - 此时已经恢复完成
为了方便,写个脚本(run_gitea.bat)来运行gitea
set PATH=C:\Program Files\Git\cmd;%PATH%
call gitea-1.22.0-gogit-windows-4.0-amd64.exe
运行后,发现有lfs报错。且提示从1.19之后,已经去掉了lfs选项。
查看配置文件,

删除app.ini中的LFS_CONTENT_PATH选项

再运行 run_gitea.bat
看到警告
2024/05/28 16:16:45 ...dules/setting/log.go:72:prepareLoggerConfig() [E] Deprecation: config option `[log].ROUTER` presents, please use `[log].logger.router.MODE` instead because this fallback will be/has been removed in 1.21
查找log选项

改为提示中的选项试试
[log]
logger.router.MODE = console
又看到有警告
2024/05/28 16:22:38 ...dules/setting/log.go:72:prepareLoggerConfig() [E] Deprecation: config option `[log].ROUTER` presents, please use `[log].logger.router.MODE` instead because this fallback will be/has been removed in 1.21
查找选项log

改为如下
[log]
logger.router.MODE = console
LEVEL = info
ROOT_PATH = E:/git_rep_local/log
logger.router.MODE = console
再试试
现在启动后,只有一个警告
2024/05/28 16:26:11 routers/init.go:116:InitWebInstalled() [I] Git version: 2.45.1 (home: E:\git_rep_local_v1\data\home)2024/05/28 16:26:11 routers/init.go:118:InitWebInstalled() [W] sha256 hash support is disabled - requires Git >= 2.42. Gogit is currently unsupported.
因为现在git版本已经为2.45.1, 已经>=2.42, sha256被禁用了。这个正常,就不管了。
现在gitea启动的命令行输出如下,只有一个sha256警告
E:\git_rep_local_v1>set PATH=C:\Program Files\Git\cmd;C:\Windows\system32;C:\Windows;C:\Windows\system32\wbem;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\binE:\git_rep_local_v1>call gitea-1.22.0-gogit-windows-4.0-amd64.exe
2024/05/28 16:55:45 cmd/web.go:242:runWeb() [I] Starting Gitea on PID: 141284
2024/05/28 16:55:45 cmd/web.go:111:showWebStartupMessage() [I] Gitea version: 1.22.0 built with GNU Make 4.3, go1.22.3 : bindata, sqlite, sqlite_unlock_notify
2024/05/28 16:55:45 cmd/web.go:112:showWebStartupMessage() [I] * RunMode: prod
2024/05/28 16:55:45 cmd/web.go:113:showWebStartupMessage() [I] * AppPath: E:/git_rep_local_v1/gitea-1.22.0-gogit-windows-4.0-amd64.exe
2024/05/28 16:55:45 cmd/web.go:114:showWebStartupMessage() [I] * WorkPath: E:\git_rep_local_v1
2024/05/28 16:55:45 cmd/web.go:115:showWebStartupMessage() [I] * CustomPath: E:\git_rep_local_v1\custom
2024/05/28 16:55:45 cmd/web.go:116:showWebStartupMessage() [I] * ConfigFile: E:\git_rep_local_v1\custom\conf\app.ini
2024/05/28 16:55:45 cmd/web.go:117:showWebStartupMessage() [I] Prepare to run web server
2024/05/28 16:55:46 routers/init.go:116:InitWebInstalled() [I] Git version: 2.45.1 (home: E:\git_rep_local_v1\data\home)
2024/05/28 16:55:46 routers/init.go:118:InitWebInstalled() [W] sha256 hash support is disabled - requires Git >= 2.42. Gogit is currently unsupported.
2024/05/28 16:55:46 ...s/setting/session.go:77:loadSessionFrom() [I] Session Service Enabled
2024/05/28 16:55:46 ...s/storage/storage.go:176:initAttachments() [I] Initialising Attachment storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\attachments
2024/05/28 16:55:46 ...s/storage/storage.go:166:initAvatars() [I] Initialising Avatar storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\avatars
2024/05/28 16:55:46 ...s/storage/storage.go:192:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\repo-avatars
2024/05/28 16:55:46 ...s/storage/storage.go:186:initLFS() [I] Initialising LFS storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\lfs
2024/05/28 16:55:46 ...s/storage/storage.go:198:initRepoArchives() [I] Initialising Repository Archive storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\repo-archive
2024/05/28 16:55:46 ...s/storage/storage.go:208:initPackages() [I] Initialising Packages storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\packages
2024/05/28 16:55:46 ...s/storage/storage.go:219:initActions() [I] Initialising Actions storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\actions_log
2024/05/28 16:55:46 ...s/storage/storage.go:223:initActions() [I] Initialising ActionsArtifacts storage with type: local
2024/05/28 16:55:46 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\actions_artifacts
2024/05/28 16:55:46 routers/init.go:138:InitWebInstalled() [I] SQLite3 support is enabled
2024/05/28 16:55:46 routers/common/db.go:23:InitDBEngine() [I] Beginning ORM engine initialization.
2024/05/28 16:55:46 routers/common/db.go:30:InitDBEngine() [I] ORM engine initialization attempt #1/10...
2024/05/28 16:55:46 cmd/web.go:194:serveInstalled() [I] PING DATABASE sqlite3
2024/05/28 16:55:46 cmd/web.go:194:serveInstalled() [W] Table system_setting Column version db default is , struct default is 1
2024/05/28 16:55:46 routers/init.go:144:InitWebInstalled() [I] ORM engine initialization successful!
2024/05/28 16:55:46 ...er/issues/indexer.go:76:func1() [I] PID 141284: Initializing Issue Indexer: bleve
2024/05/28 16:55:46 ...xer/stats/indexer.go:41:populateRepoIndexer() [I] Populating the repo stats indexer with existing repositories
2024/05/28 16:55:46 ...xer/stats/indexer.go:87:populateRepoIndexer() [I] Done (re)populating the repo stats indexer with existing repositories
2024/05/28 16:55:46 ...er/issues/indexer.go:153:func2() [I] Issue Indexer Initialization took 1.9888ms
2024/05/28 16:55:46 ...s/actions/cleanup.go:36:cleanExpiredArtifacts() [I] Found 0 expired artifacts
2024/05/28 16:55:46 ...s/actions/cleanup.go:60:cleanNeedDeleteArtifacts() [I] Found 0 artifacts pending deletion
2024/05/28 16:55:46 cmd/web.go:304:listen() [I] Listen: http://0.0.0.0:3000
2024/05/28 16:55:46 cmd/web.go:308:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
2024/05/28 16:55:46 cmd/web.go:311:listen() [I] LFS server enabled
2024/05/28 16:55:46 ...s/graceful/server.go:50:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 141284
去网gitea页端看看 http://localhost:3000/
此时,用户名和密码都是以前自己设置好的。
进去之后,看到没有自己的git库。
看日志,发现访问的还是E:\git_rep_local,估计是导出的data目录还是记录的以前的旧位置。
将data目录删除。

重新运行run_gitea.bat,看看gitea能不能生成自己需要的data目录中的东西。
E:\git_rep_local_v1>set PATH=C:\Program Files\Git\cmd;C:\Windows\system32;C:\Windows;C:\Windows\system32\wbem;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\TortoiseGit\binE:\git_rep_local_v1>call gitea-1.22.0-gogit-windows-4.0-amd64.exe
2024/05/28 17:04:07 cmd/web.go:242:runWeb() [I] Starting Gitea on PID: 154472
2024/05/28 17:04:07 cmd/web.go:111:showWebStartupMessage() [I] Gitea version: 1.22.0 built with GNU Make 4.3, go1.22.3 : bindata, sqlite, sqlite_unlock_notify
2024/05/28 17:04:07 cmd/web.go:112:showWebStartupMessage() [I] * RunMode: prod
2024/05/28 17:04:07 cmd/web.go:113:showWebStartupMessage() [I] * AppPath: E:/git_rep_local_v1/gitea-1.22.0-gogit-windows-4.0-amd64.exe
2024/05/28 17:04:07 cmd/web.go:114:showWebStartupMessage() [I] * WorkPath: E:\git_rep_local_v1
2024/05/28 17:04:07 cmd/web.go:115:showWebStartupMessage() [I] * CustomPath: E:\git_rep_local_v1\custom
2024/05/28 17:04:07 cmd/web.go:116:showWebStartupMessage() [I] * ConfigFile: E:\git_rep_local_v1\custom\conf\app.ini
2024/05/28 17:04:07 cmd/web.go:117:showWebStartupMessage() [I] Prepare to run web server
2024/05/28 17:04:08 routers/init.go:116:InitWebInstalled() [I] Git version: 2.45.1 (home: E:\git_rep_local_v1\data\home)2024/05/28 17:04:08 routers/init.go:118:InitWebInstalled() [W] sha256 hash support is disabled - requires Git >= 2.42. Gogit is currently unsupported.
2024/05/28 17:04:08 ...s/setting/session.go:77:loadSessionFrom() [I] Session Service Enabled
2024/05/28 17:04:08 ...s/storage/storage.go:176:initAttachments() [I] Initialising Attachment storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\attachments
2024/05/28 17:04:08 ...s/storage/storage.go:166:initAvatars() [I] Initialising Avatar storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\avatars
2024/05/28 17:04:08 ...s/storage/storage.go:192:initRepoAvatars() [I] Initialising Repository Avatar storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\repo-avatars
2024/05/28 17:04:08 ...s/storage/storage.go:186:initLFS() [I] Initialising LFS storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\lfs
2024/05/28 17:04:08 ...s/storage/storage.go:198:initRepoArchives() [I] Initialising Repository Archive storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\repo-archive
2024/05/28 17:04:08 ...s/storage/storage.go:208:initPackages() [I] Initialising Packages storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\packages
2024/05/28 17:04:08 ...s/storage/storage.go:219:initActions() [I] Initialising Actions storage with type: local
2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\actions_log
2024/05/28 17:04:08 ...s/storage/storage.go:223:initActions() [I] Initialising ActionsArtifacts storage with type: local2024/05/28 17:04:08 ...les/storage/local.go:33:NewLocalStorage() [I] Creating new Local Storage at E:\git_rep_local_v1\data\actions_artifacts
2024/05/28 17:04:08 routers/init.go:138:InitWebInstalled() [I] SQLite3 support is enabled
2024/05/28 17:04:08 routers/common/db.go:23:InitDBEngine() [I] Beginning ORM engine initialization.
2024/05/28 17:04:08 routers/common/db.go:30:InitDBEngine() [I] ORM engine initialization attempt #1/10...
2024/05/28 17:04:08 cmd/web.go:194:serveInstalled() [I] PING DATABASE sqlite3
2024/05/28 17:04:08 cmd/web.go:194:serveInstalled() [W] Table system_setting Column version db default is , struct default is 1
2024/05/28 17:04:08 routers/init.go:144:InitWebInstalled() [I] ORM engine initialization successful!
2024/05/28 17:04:10 ...er/issues/indexer.go:76:func1() [I] PID 154472: Initializing Issue Indexer: bleve
2024/05/28 17:04:10 ...xer/stats/indexer.go:41:populateRepoIndexer() [I] Populating the repo stats indexer with existing repositories
2024/05/28 17:04:10 ...xer/stats/indexer.go:87:populateRepoIndexer() [I] Done (re)populating the repo stats indexer with existing repositories
2024/05/28 17:04:10 ...s/actions/cleanup.go:36:cleanExpiredArtifacts() [I] Found 0 expired artifacts
2024/05/28 17:04:10 ...s/actions/cleanup.go:60:cleanNeedDeleteArtifacts() [I] Found 0 artifacts pending deletion
2024/05/28 17:04:10 cmd/web.go:304:listen() [I] Listen: http://0.0.0.0:3000
2024/05/28 17:04:10 cmd/web.go:308:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
2024/05/28 17:04:10 cmd/web.go:311:listen() [I] LFS server enabled
2024/05/28 17:04:10 ...s/graceful/server.go:50:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 154472
2024/05/28 17:04:10 ...er/issues/indexer.go:153:func2() [I] Issue Indexer Initialization took 103.8375ms
可以啊,gitea已经按照生成了新的data目录,且启动时需要的目录都指向了新目录 E:\git_rep_local_v1
去网页端看看 http://localhost:3000/
还是没看到自己在新目录的git库
用 sqlitestudio-3.3.3.zip 看看 gitea.db 哪里写了旧库的位置?
看了一圈,没找到,应该不在gitea.db中。如果在的话,那么在导入sql前的替换中,就能看到。
看了一圈,是不是硬写在E:\git_rep_local_v1\gitea-repositories\me\my_local_git_prj.git的文件中了。 这种可能性比较大。找一下。
FETCH_HEAD 中有硬写位置

073013986e5b302c20976d5978aae4e983ceeac5 branch 'master' of E:\git_rep_local\gitea-repositories\me\my_local_git_prj
改为
073013986e5b302c20976d5978aae4e983ceeac5 branch 'master' of E:\git_rep_local_v1\gitea-repositories\me\my_local_git_prj
又翻了翻,好像就这一处。
再运行 run_gitea.bat试试,启动正常。
去网页端看看 http://localhost:3000/, 还不行。
将data目录删掉,重新运行run_gitea.bat试试. 不行。
现在不知道gitea将旧仓库位置写在哪里了。
再查一下app.ini, 是否改漏了。
招了一下,还真改漏了。
这次搜索 E: 这2个字符
m1
[repository]
ROOT = E:/git_rep_local/gitea-repositories
改为
[repository]
ROOT = E:/git_rep_local_v1/gitea-repositories
m2
[log]
logger.router.MODE = console
LEVEL = info
ROOT_PATH = E:/git_rep_local/log
改为
[log]
logger.router.MODE = console
LEVEL = info
ROOT_PATH = E:/git_rep_local_v1/log
将 E:\git_rep_local_v1\app.ini 更新到 E:\git_rep_local_v1\custom\conf\app.ini
将 E:\git_rep_local_v1\data目录删了, 让gitea自动生成。
运行 run_gitea.bat, 启动信息正常。
访问网页 http://localhost:3000/, 不行,git库还是没有。
将 E:\git_rep_local_v1\data目录删了, 从备份gitea-dump-1716879579.zip中释放。
运行 run_gitea.bat, 启动信息正常。
访问网页 http://localhost:3000/, 不行,git库还是没有。
不过已经没有路径找不到的错误信息了。
总结
当前的gitea版本(gitea-1.22.0-gogit-windows-4.0-amd64.exe),只能将仓库恢复到另外一台计算机上的相同位置(包括本机的相同位置)。
那如果是windows的gitea库迁移到linux,那该着办呢?
看到gitea命令行还有针对单个库的备份和恢复,但是命令行不知道怎么用(总是报错)。
现在对gitea有点不放心了。改天再找找,需要将库备份和恢复的目录位置问题搞定才行。
这种git库的备份和恢复,怎么可以和具体的磁盘位置关联起来呢?这不科学啊。
用gitea备份/恢复库无解
官方资料说的和软件实际运行情况不一样,算了。
第三方的资料就更没说我遇到的这种细节。
gitea的这功能(备份/恢复)做的真磕碜。
折中的方法
先从已有gitea库克隆一个完整版本下来到目录dir_a。
在gitea服务端建立一个空库(库名和已经克隆下来的库名相同),这时可以得到库的克隆url_b.
在dir_a中右击,清空save的所有数据。将提交地址改成url_b.
然后在dir_a中,用TortoiseGit push到服务端的空库,等待完成。
此时,在随便一个本地空目录dir_c,克隆url_b, 等待完成。
此时,在dir_c中,右击,用TortoiseGit查看历史,可以看到该库的所有历史记录都有。说明克隆成功。
这种方法,折中的解决了gitea库的备份问题,且和gitea库的物理位置无关。
END
相关文章:
gitea的git库备份与恢复
文章目录 gitea库的备份与恢复概述笔记实验环境更新git for windows更新 TortoiseGit备份已经存在的gitea的git库目录使用gitea本身来备份所有git库目录将gitea库恢复到新目录m1m2m3启动gitea - 此时已经恢复完成FETCH_HEAD 中有硬写位置再查一下app.ini, 是否改漏了。m1m2 总结…...
【强化学习05】从Q学习到深度Q学习
深度Q学习(Deep Q-Learning, DQN)是将深度学习与Q学习结合起来的一种强化学习方法,利用神经网络来近似Q值函数,解决传统Q学习在大规模或连续状态空间中的局限性。下面详细解释DQN的机理。 背景知识 Q学习 Q学习是一种值函数法&…...
FPGA实现多路并行dds
目录 基本原理 verilog代码 仿真结果 基本原理 多路并行dds,传统DDS的局限性在于输出频率有限。根据奈奎斯特采样定理,单路DDS的输出频率应小于系统时钟频率的一半。但是在很多地方,要使采样率保持一致,所以,为了…...
ArcgisPro3.1.5安装手册
ArcgisPro3.1.5安装手册 一、目录介绍: 二、安装教程: (1)安装顺序:最先安装运行环境(runtime6.0.5),接着安装install里面的文件,最后复制path里面的文件替换到软件bin文件夹下即可。 (2)具体安装步骤ÿ…...
三大主流框架
Web前端开发领域中,三大主流框架通常指的是: React:由Facebook开发的一个用于构建用户界面的JavaScript库。React以其组件化、声明式编程和虚拟DOM等特点而广受欢迎,能够高效地更新和渲染大型应用。 Vue.js:由尤雨溪创…...
【C++】:vector容器的底层模拟实现迭代器失效隐藏的浅拷贝
目录 💡前言一,构造函数1 . 强制编译器生成默认构造2 . 拷贝构造3. 用迭代器区间初始化4. 用n个val值构造5. initializer_list 的构造 二,析构函数三,关于迭代器四,有关数据个数与容量五,交换函数swap六&am…...
必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)
1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…...
centos安装Redis
在CentOS上安装Redis的步骤如下: 使用yum安装依赖库: sudo yum install -y gcc make 下载Redis源码: wget http://download.redis.io/releases/redis-6.0.9.tar.gz 解压Redis源码: tar xzf redis-6.0.9.tar.gz 编译Redis&…...
继承与多态2
2.5(杨.丹尼尔梁英文第11版P537:*13.12)(几何对象的面积求和)写一个方法,将数组中所有几何对象的面积求和。 方法签名是: 公共静态双求和区域(几何对象【】a) 编写一个测试程序&…...
在RT-Thread下为MPU手搓以太网MAC驱动-3
文章目录 MAC驱动支持不同的PHY芯片关于对PHY设备抽象的改进RT-Thread下PHY设备抽象接口的改进关于对PHY设备抽象的改进 这是个人驱动开发过程中做的一些记录,仅代表个人意见和理解,不喜勿喷 MAC驱动需要支持不同的PHY芯片 MAC驱动支持不同的PHY芯片 关…...
Cocos Creator 2D物理引擎的使用详解
前言 Cocos Creator是一款优秀的游戏开发工具,它提供了强大的2D物理引擎,帮助开发者轻松实现游戏中的物理效果。在本文中,我们将详细介绍Cocos Creator中2D物理引擎的使用方法,并通过代码实现来演示其具体应用。 对惹࿰…...
618局外人抖音:别人挤压商家“拼价格”,它默默联合商家“抢用户”?
文|新熔财经 作者|宏一 “618”来临之际,各电商平台和短视频平台早已打响了“促销大战”。不过,今年各大平台都更积极适应新的消费形式,调整了“大促动作”。 比如淘宝、京东带头取消了沿用十年之久的预售机制&…...
【Unity AR开发插件】五、运行示例程序
专栏 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 链接: Unity开发AR系列 热更数据制作:制作热更数据-AR图片识别场景 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可…...
JavaScript className 类名属性操作
在JavaScript中,可以通过className属性来操作HTML元素的类名。 添加类名:可以使用element.className "className"来添加一个类名到元素中。 var element document.getElementById("myElement"); element.className " newC…...
做场外个股期权怎么询价
做场外个股期权怎么询价?没有具体的哪家做市商是询价是最低的,个人投资者需要通过机构通道方询价进行对比,各券商的报价由询价机构方提供给到投资者,可以参考不同券商的报价进行比对,再决定是否进行投资。本文来自&…...
Databend 开源周报第 146 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持 Expressio…...
Android12.0 SIM卡语言自适应
文章目录 需求语言设定Settings中语言切换流程检测到SIM卡,更新系统语言最终修改 需求 要求系统语言跟随SIM卡的语言变化。 语言设定 (1)系统预置语言, 即在makefile中指定的语言 (2)重启, 如果未插卡, 则系统语言为预置的语言 (3)重启插入SIM卡开机, 会自适应为…...
滴滴一季度营收同比增长14.9%至491亿元 经调整EBITA盈利9亿元
【头部财经】5月29日,滴滴在其官网发布2024年一季度业绩报告。一季度滴滴实现总收入491亿元,同比增长14.9%;经调整EBITA(非公认会计准则口径)盈利9亿元。其中,中国出行一季度实现收入445亿元,同…...
C语言 指针——指针变量的定义、初始化及解引用
目录 指针 内存如何编址? 如何对变量进行寻址? 用什么类型的变量来存放变量的地址? 如何显示变量的地址?编辑 使用未初始化的指针会怎样? NULL是什么? 如何访问指针变量指向的存储单元中的数据? 指针变量的…...
详解 Spark 的运行架构
一、核心组件 1. Driver Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作主要负责: 将用户程序转化为作业 (job)在 Executor 之间调度任务 (task)跟踪 Executor 的执行情况通过 UI 展示查询运行情况 2. Exec…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
