两个git repos用于相同的文件

时间:2013-12-30 02:57:40

标签: git github backup project-management

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

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

现在,当我想在github上放置其中一个存储库以进行协作时问题就出现了。每次我推送到github它会创建数十或数百或提交,通常是不完整的代码,因为我正在修改文件时五分钟左右。

我希望有一个第二个存储库,它们位于同一个目录中并监视相同的文件,但我希望它只能手动提交。这样,当我推送到github时,只有有意义的提交,我的所有自动备份都被隐藏起来。

这甚至可能吗?

快速编辑 -

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

长编辑 -

这个小项目是 NIGHTMARE

根据@janos的建议,我在每个文件夹中设置了第二个存储库。为了设置它们,我只在当前存储库中使用git clone。我修改了我的autosave.bat文件以使用GIT_DIRGIT_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 ..
)

这个结果应该是显而易见的吧?我们逐步浏览SomeFolder中的每个子目录,将其设置为当前GIT_WORK_TREE,然后输出GIT_WORK_TREE。输出:

C:\SomeFolder
C:\SomeFolder
C:\SomeFolder
C:\SomeFolder
....

看起来批处理脚本是无序执行的(在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/

有了这个,我认为它终于有效了,但我不禁测试我的远程备份,看看它们是否真的设置正确。

2 个答案:

答案 0 :(得分:4)

我认为您的设置并不奇怪。我知道至少有一个人在每次保存文件时都有一个emacs钩子来提交他的回购(他是一个xemacs维护者btw)。

由于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

更新自动提交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

就是这样。这两个回购甚至不需要知道对方的存在。

<强>更新

回答您的后续问题:

  

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

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

  

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

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

  

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

我建议按原样保留常规回购。为autocommit创建新的克隆,如下所示:

git clone --bare /path/to/proj1 /my/autocommits/proj1.git

答案 1 :(得分:1)

我没有尝试过这个解决方案,但概念似乎正确。 http://grahamc.com/blog/multiple-git-repositories-one-directory-dotfiles/似乎将Git环境变量设置为一个目录,同时在另一个目录中设置了repo。