如何设置本地Git存储库和本地备份目录?

时间:2011-02-26 03:02:42

标签: git backup repository local

更新

我按照以下答案之一的说明设置了两个Git存储库,但备份目录中没有工作目录中的文件副本。这就是我在备份目录中看到的内容......

$ ls
total 0
drwxr-xr-x  10 Hristo  staff  340 Feb 25 21:40 Kamma.git

......但我期待以下内容......

$ ls
total 16
drwxr-xr-x   6 Hristo  staff   204 Dec 19 19:51 css
drwxr-xr-x   3 Hristo  staff   102 Nov 13 18:00 images
-rw-r--r--@  1 Hristo  staff  4440 Feb 26 03:20 index.html
drwxr-xr-x  15 Hristo  staff   510 Feb 24 14:19 js

同样,我希望我的主要工作目录/Users/Hristo/Sites/Kamma成为我进行更改并进行提交和还原等的地方。

我希望/Users/Hristo/Sites/Kamma_bak成为我定期推送重要更改的地方,例如我的项目的新版本,其中所有内容都是我的工作目录的副本,而不是最新的副本。

我希望这是有道理的。


原帖

我想建立一个本地Git存储库。例如,我希望我的主要位置是/Users/Hristo/Sites/Kamma,这是我将完成所有工作的地方。

我希望能够提交更改并恢复到以前的版本等...,颠覆的工作方式。但我还希望有一个备份目录/Users/Hristo/Sites/Kamma_bak作为故障保护,我会偶尔“推送”版本。

在此备份目录/Users/Hristo/Sites/Kamma_bak中,我希望所有文件等作为工作目录/Users/Hristo/Sites/Kamma

的备份副本的副本存在

我如何用Git做到这一点?我已将它安装在我的机器上,运行Snow Leopard。

3 个答案:

答案 0 :(得分:5)

是的,你绝对可以这样做。虽然我建议您的备份文件夹在另一台计算机上。

请阅读此主题Using Git and Dropbox together effectively?

我认为说明书提供了您正在寻找的内容; “dropbox”部分当然是可选的(它只是一个文件夹)。

编辑:忘掉Dropbox位。 Dropbox只是一个本地文件夹+一个在异地复制它的服务。这些说明也适用于本地文件夹。

创建一个(本地)裸仓库的重要位置,您将其设置为'git remote'并将更改推送到。

让我从引用的帖子中复制并粘贴,然后为你做出更改。

这样的事情应该有效:

~/Sites/Kamma $ git init
~/Sites/Kamma $ git add .
~/Sites/Kamma $ git commit -m "first commit"
~/Sites/Kamma $ cd ~/Sites/Kamma_bak

~/Sites/Kamma_bak $ mkdir Kamma.git
~/Sites/Kamma_bak $ cd Kamma.git
~/Sites/Kamma_bak $ git init --bare
~/Sites/Kamma_bak $ cd ~/Sites/Kamma

~/Sites/Kamma $ git remote add origin ~/Sites/Kamma_bak/Kamma.git
~/Sites/Kamma $ git push origin master

答案 1 :(得分:1)

git init将创建一个git repo。要进行备份,请在原始仓库上执行git clone --no-hardlinks复制。从那里你可以从一个回购推动到另一个回购。

答案 2 :(得分:1)

注意:同一台计算机上的“备份”副本不是备份(特别是如果它位于同一磁盘上)。为了可靠,您确实需要将数据复制到一台(或多台)不同的机器/介质,最好是在不同的位置。

听起来你的“备份”是bare repository,但希望它是一个非裸存储库(即你希望它有自己的工作树签出)。

问题是推送到非裸存储库通常不是一个好主意。实际上,这样的推送可能会更新HEAD指向的分支而不更新索引或工作树。这可能导致接收存储库中非常混乱的情况(例如,添加的文件显示为已删除状态等)。出于这个原因,Git版本1.7.0及更高版本默认拒绝接受推送到当前检出的非裸存储库分支。

注意:当您推送到裸存储库进行备份时,推送提交中包含的所有文件都在那里,它们只是没有签出(它们被压缩并保存在Git中,对象存储为“松散对象”和“打包文件”)。推送的数据表示您提交和推送的内容的完整历史记录副本。您无法直接访问内容。相反,您必须将其克隆到非裸存储库(从而检出提交)或使用git archive提取一组文件,而无需额外的存储库或完整的检出。


我真的不相信你需要像你描述的那样。

如果您需要检查存储库的旧快照(并且您不想在正常的工作存储库中执行此操作),那么您应该只是克隆一个临时副本并检出所需的旧提交。本地克隆很便宜,因为它们可以硬链接对象存储文件而不是复制它们。历史提交图通常是“回到过去”所需要的。虽然Git会让你随意重写历史图表,但由于它通常需要-f / --force个开关和/或提供恢复机制(reflogs,refs /),因此你不会真正做出不可恢复的更改。原始/,收集未引用对象之前的最低年龄要求等。)

最好有另一个存储库(特别是在另一个位置的另一台机器上),您可以在其中推送提交以进行备份(以便您可以从(例如){{1}恢复但是,裸存储库通常就足够了。当你需要恢复时,你只需要克隆。如果要在不打扰正常工作存储库的情况下检查某些旧快照,可以在某处进行临时克隆。良好的提交卫生,rm -rf working_repogit diff(尤其是git log-p选项)和-S通常可以提供您可能需要的任何“考古”信息来自旧提交而不需要检查任何东西(它们甚至可以在裸存储库中工作)。


但是,如果您愿意接受风险,您可以完全按照自己的意愿行事。

与任何其他“尖锐”工具一样,Git会让你冒着“自己在脚下射击”的风险(原谅混合比喻)。

  1. 创建和配置备份存储库,并将其作为远程数据库添加到工作存储库中。

    git show
  2. 在备份存储库中,设置执行# paths to the repositories WORKING=/path/to/working BACKUP=/path/to/backup # name for the backup repository in the working repository REMOTE=backup ! test -d "$BACKUP" || (echo "error: $BACKUP already exists"; exit 1) && git clone --origin working "$WORKING" "$BACKUP" && ( cd "$BACKUP" && git config receive.denyCurrentBranch false && git remote rm working ) && ( cd "$WORKING" && git remote add "$REMOTE" "$BACKUP" && git config remote."$REMOTE".push 'refs/heads/*:refs/heads/*' ) 的{​​{1}}或post-receive挂钩。这将使索引和工作树与当前签出的分支保持同步。

    Git FAQ “Why won't I see changes in the remote repo after "git push"?”指向可以相对安全地执行此操作的示例post-update script(如果工作树或索引是脏的,它会保存存储 - 这仍然会丢失未跟踪的文件如果推送了具有相同路径名的新添加文件。)

    post-update
  3. 如果要更新它,请推送到备份库。

    git reset --hard
  4. 如果你使用这样的设置,你绝对应该避免在备份工作树中工作。你在那里做的任何提交,你留在那里的任何分阶段的更改,以及你留在那里的任何未跟踪的文件都可能会丢失。