相同文件的两个 git repos

ste*_*esu 4 git backup project-management github

在我的开发计算机上,我以前只是将 git 用作自动备份/恢复系统。我知道这并不是 git 的用途,但它对我来说非常有效。我有一个简单的脚本,它每 5 分钟运行一次(类似于 Windows 任务计划程序)并检查是否有任何文件已更改。如果是这样,它会创建一个新提交(带有消息“自动提交”)并将其推送到我在外部硬盘驱动器上的镜像。我也可以将其扩展到推送到其他位置的镜像。

我不想停止这样做,因为系统不止一次挽救了我的生命。在电源故障、意外文件删除或客户突然决定他们喜欢 2 个月前的项目外观并且他们想要恢复所有更改之间 - 将所有内容回滚到任何时间点的能力是非常宝贵的。

现在,当我想将这些存储库之一放在 github 上进行协作时,问题就来了。每次我推送到 github 时,它都会创建数十或数百或提交,通常代码不完整,因为我正在修改文件五分钟后。

我希望有一个位于同一目录中并监视相同文件的第二个存储库,但是我希望它只手动提交。这样,当我推送到 github 时,只有有意义的提交,而且我所有的自动备份都不会被窥探。

这甚至可能吗?

快速编辑 -

谷歌搜索,这个git rebase命令有什么用吗?似乎它可能会破坏所有自动提交,这并不是理想的行为。

长编辑 -

这个小项目一直是一个噩梦

按照@janos 的建议,我在每个文件夹中设置了第二个存储库。为了设置这些,我只是git clone在当前存储库上使用。我修改了我的autosave.bat文件以使用GIT_DIR并且GIT_WORK_TREE认为一切都会很花哨......事实并非如此

首先,为了好玩,在 Windows 7 PC 上尝试以下操作:

test.bat
--------

CD C:\SomeFolder
FOR /D %%i in (*) DO (
    CD %%i
    set GIT_WORK_TREE=%cd%
    echo %GIT_WORK_TREE%
    CD ..
)
Run Code Online (Sandbox Code Playgroud)

这样的结果应该很明显了吧?我们逐步遍历 中的每个子目录SomeFolder,将其设置为当前GIT_WORK_TREE,然后输出GIT_WORK_TREE。输出:

C:\SomeFolder
C:\SomeFolder
C:\SomeFolder
C:\SomeFolder
....
Run Code Online (Sandbox Code Playgroud)

看起来批处理脚本是乱序执行的(set GIT_WORK_TREE=%cd%CD %%i完成之前处理)。当每个项目都在其他项目的存储库中时,您只能想象这对我的备份造成的恐怖。

我试图解决这个问题,git --git-dir=backup.git --work-tree=%cd%只在文件夹名称中有空格时出现错误(我不得不加%cd%引号)

我终于开始工作了,backup.git但没有被识别为 git 目录并被添加到存储库中!为了安全起见,我在 .gitignore 中添加了以下内容:

# git is really making me angry today
/.git/
/backup.git/
Run Code Online (Sandbox Code Playgroud)

有了这个,我认为它终于可以工作了,但我不寒而栗地测试我的远程备份,看看它们是否真的设置正确。

Sto*_*ica 5

我不认为你的设置很奇怪。我知道至少有一个人每次保存文件时都有一个 emacs 钩子来提交他的 repo(顺便说一句,他是一个 xemacs 维护者)。

由于GIT_DIRGIT_WORK_TREE变量,有一种完全干净的方式可以做你想做的事。例如,给定任何 Git 存储库,您可以设置一个“自动提交”存储库,该存储库独立于您推送到 GitHub 的“官方”存储库。

初始化自动提交仓库

cd /path/to/project
export GIT_DIR=/tmp/autocommit.git
export GIT_WORK_TREE=$PWD
git init
git add .
git commit -m init
Run Code Online (Sandbox Code Playgroud)

更新自动提交 repo = autocommit.sh

#!/bin/sh
export GIT_DIR=/tmp/autocommit.git           ## same path as you initialized
export GIT_WORK_TREE=/path/to/real/project   ## same path as you initialized
git add --all                                ## --all takes care of deletes too
git commit -m auto-commit
Run Code Online (Sandbox Code Playgroud)

就是这样。这两个 repos 甚至不需要知道另一个 repos 的存在。

更新

回答您的后续问题:

如果我使用 GIT_DIR 在同一目录中创建第二个 repo,我是否还必须在提交手动提交之前导出 GIT_DIR=/tmp/.git?

对于您的手动提交,根本不要使用这些变量。像往常一样使用 Git 存储库。autocommit repo 是完全独立的,它不会以任何方式影响您的常规 repo。简而言之,您的日常使用不需要任何设置。

我主要在 Windows 上工作,我不确定 GIT_DIR 环境变量是否有效 - 我可以使用 git --git-dir=... 一样有效吗?

我建议将自动提交器包装到它自己的脚本中,它可以在其中设置它需要的环境变量。由于您有多个自动提交存储库,因此您可能想要创建一个带有autocommit.sh参数的公共库,您可以从包装器脚本中调用这些参数,每个存储库一个。例如。这只是一种方法。

是否可以更改现有仓库的 git 目录?是否像重命名 .git 文件夹一样简单?因为我已经有四五个项目自动提交到默认存储库而不是 autocommit.git,我想更改这些。

我建议按原样保留您的常规回购。像这样为自动提交创建新的克隆:

git clone --bare /path/to/proj1 /my/autocommits/proj1.git
Run Code Online (Sandbox Code Playgroud)