V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
0o0O0o0O0o
V2EX  ›  git

一个备份 git 仓库的思路,各位有什么建议

  •  
  •   0o0O0o0O0o · 9 天前 · 1006 次点击
    git config alias.backup '!f() { ([ -f "/path/to/git-backup/$1/HEAD" ] || git init --bare "/path/to/git-backup/$1") && (git remote set-url --delete origin "/path/to/git-backup/$1" 2>/dev/null; git remote set-url --add origin "/path/to/git-backup/$1"); }; f'
    
    cd /path/to/something
    
    git init
    git remote add origin [email protected]:username/something.git
    
    git backup something
    
    git remote -v
    # origin	[email protected]:username/something.git (fetch)
    # origin	[email protected]:username/something.git (push)
    # origin	/path/to/git-backup/something (push)
    

    如此在每次 push 到 github/gitlab 的同时,还会 push 到 /path/to/git-backup 下,然后再用备份工具对 /path/to/git-backup 进行备份,这样:

    1. 不用考虑排除哪些文件,不挑备份工具,备份脚本不复杂
    2. 不用考虑用的是什么 git hosting service
    3. 不需要额外运行个服务(本来是打算跑个 gitea/gogs 的,但是为了可以加密备份放弃了)

    未解决:

    1. 并非本地做的一些变更提交,例如 actions 中产生的
    2. 未 push 的,其实我并没有这个需求,我认为只对 push 过的负责挺好的
    3. 代码以外的东西,例如 issues 、pull requests 、discussions 中的讨论,尽管我没有这个需求
    4. .gitignore 排除掉的秘密、配置文件,虽然以前提问过,站内有人推荐 git-crypt ,但我觉得我还需要一个别的方案

    各位对此思路有什么想法和建议吗?

    第 1 条附言  ·  7 天前

    以及实际在用的 git alias

    !f() {
      set -e
    
      local git_backup_name="$1"
      local git_backup_root="/path/to/git-backup"
      local git_backup_branch="git-backup"
    
      if [ -z "$git_backup_name" ]; then
        echo "usage: git backup <name>"
        exit 1
      fi
    
      if [ ! -f "$git_backup_root/$git_backup_name/HEAD" ]; then
        git init --bare "$git_backup_root/$git_backup_name"
      fi
    
      git remote set-url --delete origin "$git_backup_root/$git_backup_name" 2>/dev/null || true
      git remote set-url --add origin "$git_backup_root/$git_backup_name"
    
      if ! git remote get-url "$git_backup_branch" >/dev/null 2>/dev/null; then
        git remote add "$git_backup_branch" "file:///dev/null"
        git remote set-url --push "$git_backup_branch" "$git_backup_root/$git_backup_name"
      fi
    
      git remote -v
    };
    f
    
    1. 创建本地的 bare repo
    2. 添加到 origin 的 push 中
    3. 添加一个单独的分支,并且利用一个来自 stackoverflow 的 trick 只允许 push
    12 条回复    2024-06-17 21:55:58 +08:00
    hellodigua
        1
    hellodigua  
       9 天前
    怎么感觉多此一举,github 本身就算备份了吧

    如果你担心 github 仓库出现问题的话,写一个 github action ,每天定时打包一个 zip 发送到 OSS 里面
    0o0O0o0O0o
        2
    0o0O0o0O0o  
    OP
       9 天前
    @hellodigua

    > github 本身就算备份了

    我觉得不算,例如存在封号 /t/924024 ,我觉得没有用户尤其是大陆用户可以保证自己理解并永远遵守了所有 ToS ,因为有些事情不受你控制 (如 https://docs.github.com/en/site-policy/other-site-policies/github-and-trade-controls ),也没有人可以保证风控不会出 BUG

    > 写一个 github action ,每天定时打包一个 zip 发送到 OSS 里面

    理解,优点是可以备份不是自己在本地发起的提交,但个人觉得没这个思路优雅和安全:

    1. github repo 有 public 也有 private ,还可能是某个 organization 的 member ,每个仓库一个 github actions 有维护负担,只用一个 actions 则面临权限问题,尝试突破就无法遵循安全实践

    2. 用到的 git hosting service 可能不止 github ,还有 gitlab 或者一些自建的服务
    hellodigua
        3
    hellodigua  
       9 天前
    你要是担心公有 git 的安全性问题,那不如自建一个私有 gitlab ,每个仓库同时上传到 github 和私有 gitlab ,定期对 gitlab 整体备份就行了
    0o0O0o0O0o
        4
    0o0O0o0O0o  
    OP
       9 天前
    @hellodigua #3

    这就是我之前的思路,见优势里列的第 3 条,我本来为了可以加密备份甚至打算直接本地跑一个的,转念一想既然都本地了,那直接用路径就行了,不需要跑个服务了,用法都一样
    awesomes
        5
    awesomes  
       9 天前   ❤️ 1
    工作不饱和嘛
    maymay5
        6
    maymay5  
       9 天前
    这是我现在用的方案:
    * 一台支持文件同步的 NAS
    * GitHub 照常 push ,NAS 自动同步我最新的代码文件至本地
    * 同样的这个方案我也放在我的 Windows Service 上,但是为了防止覆盖,我 Server 上专门做了个 Windows 服务,用日期文件夹方式进行版本管理,缺点就是烧硬盘,而且做了自动备份,没做自动删除,每隔个十天半个月我就要去手动删垃圾
    缺点:
    * NAS 不能版本管理,纯覆盖,只能说聊胜于无
    maymay5
        7
    maymay5  
       9 天前
    忘记说优点了哈哈:硬盘不坏的前提下,天王老子来了我代码或者程序也不会丢,一定可以还原
    pigf
        8
    pigf  
       9 天前
    我就没有这些顾虑,我写的代码没什么价值
    0o0O0o0O0o
        9
    0o0O0o0O0o  
    OP
       9 天前 via iPhone
    @maymay5 #6

    - 我不想让私钥或者可以读私有仓库的 PAT 离开我的笔记本电脑,所以没办法在别的设备上去主动同步仓库;
    - 如果是利用同步备份的工具来做,可以看我列出的优点中的第一条:需要维护麻烦的排除规则,因为本地仓库文件夹里有各种 .*ignore ,有时甚至还会有不在 ignore 文件中但也不打算提交的文件,又或者是 submodule 等等;
    - 工具你可以试试 restic ,压缩、加密、增量,有快照有策略
    BeijingBaby
        10
    BeijingBaby  
       9 天前
    想的太复杂了,直接无脑同步推送到另一个自建 git 就行了。
    0o0O0o0O0o
        11
    0o0O0o0O0o  
    OP
       9 天前
    改了改配置文件,已经用上了,一段时间后再来总结一下实际体验中的优缺点
    dreammis
        12
    dreammis  
       9 天前 via iPhone
    自己搭建 gitea ,直接从外部 clone ,自动会同步
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1186 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 18:23 · PVG 02:23 · LAX 11:23 · JFK 14:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.