在我的开发计算机上,我以前只使用git作为自动备份/恢复系统。我知道这不是git的用途,但它对我来说非常有效。我有一个简单的脚本,每5分钟运行一次(Windows任务计划程序),并检查是否有任何文件已更改。如果是这样,它会创建一个新的提交(带有“自动提交”消息)并将其推送到我在外部硬盘驱动器上的镜像。我也可以将其扩展到其他位置的镜像。
我不想停止这样做,因为系统不止一次地挽救了我的生命。在电源故障,意外文件删除或客户突然决定他们喜欢2个月前项目的样子并且他们想要恢复所有变更之间 - 将所有内容推回到任何时间点的能力都是非常宝贵的。
现在,当我想在github上放置其中一个存储库以进行协作时问题就出现了。每次我推送到github它会创建数十或数百或提交,通常是不完整的代码,因为我正在修改文件时五分钟左右。
我希望有一个第二个存储库,它们位于同一个目录中并监视相同的文件,但我希望它只能手动提交。这样,当我推送到github时,只有有意义的提交,我的所有自动备份都被隐藏起来。
这甚至可能吗?
快速编辑 -
谷歌搜索,git rebase
命令可以用吗?它似乎可能会破坏所有自动提交,这不是理想的行为。
长编辑 -
这个小项目是 NIGHTMARE 。
根据@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 ..
)
这个结果应该是显而易见的吧?我们逐步浏览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/
有了这个,我认为它终于有效了,但我不禁测试我的远程备份,看看它们是否真的设置正确。
答案 0 :(得分:4)
我认为您的设置并不奇怪。我知道至少有一个人在每次保存文件时都有一个emacs钩子来提交他的回购(他是一个xemacs维护者btw)。
由于GIT_DIR
和GIT_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
#!/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。