【问题标题】:Two git repos for the same files相同文件的两个 git 存储库
【发布时间】:2013-12-30 02:57:39
【问题描述】:

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

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

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

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

这可能吗?

快速编辑 -

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

长篇编辑 -

这个小项目一直是噩梦

按照@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/

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

【问题讨论】:

  • 这是一个关于它的 SO 问题:stackoverflow.com/questions/2519446/…
  • @lincb:这个问题并没有完全解决我自己的问题。他们的问题是文件权限之一。给定一个目录有 4 个文件,他们希望其中 2 个文件在一个 repo 中,2 个文件在另一个 repo 中。我想要两个 repos 中的所有 4 个文件,但希望一个 repo 有 300 次提交,而另一个 repo 有一个包含所有更改的大规模提交。
  • 哦,对不起。我会寻找别的东西。

标签: git github backup project-management


【解决方案1】:

我认为您的设置并不奇怪。我知道至少有一个人每次保存文件时都有一个 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

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

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

更新

回答您的后续问题:

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

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

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

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

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

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

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

【讨论】:

  • 两个问题:首先,如果我使用GIT_DIR 在同一目录中创建第二个存储库,在提交手动提交之前我是否还必须export GIT_DIR=/tmp/.git?其次,我主要在 Windows 上工作,我不确定 GIT_DIR 环境变量是否可以工作 - 我可以同样有效地使用 git --git-dir=... <command> 吗?
  • 实际上,第三个问题真的很快 - 是否可以更改现有 repo 的 git 目录?像重命名.git 文件夹一样简单吗?因为我已经有四五个项目自动提交到默认仓库而不是autocommit.git,我想更改这些。
  • 接受这一点,因为它引导我朝着正确的方向前进,但根据我的编辑,还有很多意想不到的工作要做 - 比如 git 无法将 backup.git 识别为 git目录自动。
  • @stevendesu 哎哟。很抱歉听到你的麻烦。如果你 ping 我,我可以给你一些提示。例如,不要在 DOS 中编写脚本。你可以使用 Git Bash!我现在没有 Windows,但在最坏的情况下,您可以拥有一个 DOS 包装脚本,该脚本调用 bash 脚本来完成真正的工作,这样事情就不会那么痛苦了。 DOS 对脚本来说真的很糟糕,但是如果你有 Git Bash,就没有理由坚持使用 DOS。顺便说一句,我在工作中一直在编写这种脚本,但我现在在家,所以我不能提供更多细节。
【解决方案2】:

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

【讨论】:

  • 我试过了,效果很好;您从上面的链接下载 4 个文件,将它们放在路径中的任何位置(最简单的位置是您家下的 bin 目录,git bash 窗口似乎会自动添加到路径中),然后运行以下命令: git multi work ...这将创建一个新的 bash shell,然后您可以使用它来执行您的正常任务(例如 git add、git commit、git pull、git push 等)。
  • 此链接已关闭。有人可以帮忙吗?
猜你喜欢
  • 2012-04-29
  • 2015-12-26
  • 2011-06-19
  • 2020-12-06
  • 2011-01-12
  • 2014-08-18
  • 2020-02-05
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多