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

UPDATE

我按照以下答案之一的说明设置了两个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.

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

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

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

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

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

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

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

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

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

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

# 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/*'
)

>在备份存储库中,设置一个执行git reset -hard的post-receive或post-update挂钩.这将使索引和工作树与当前签出的分支保持同步.

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

( H="$BACKUP"/.git/hooks/post-update &&
  curl http://utsl.gen.nz/git/post-update >$H && chmod +x "$H" )

>如果要更新备份存储库,请将其推送到备份存储库.

(cd "$WORKING" && git push "$REMOTE")

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

相关文章
相关标签/搜索