[英]How do I set up a local Git repository and a local backup directory?
我按照以下答案之一的说明设置了两个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_bak
,我希望所有文件等作为工作目录/Users/Hristo/Sites/Kamma
副本副本,作为备份副本存在
我如何用Git做到这一点? 我已经在我的机器上安装了它,运行Snow Leopard。
是的,你绝对可以做到这一点。 虽然我建议您的备份文件夹在另一台计算机上。
请阅读此主题, 有效地同时使用Git和Dropbox?
我认为说明书提供了您正在寻找的内容; “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
git init
将创建一个git repo。 要进行备份,请在原始git clone --no-hardlinks
上执行git clone --no-hardlinks
以复制它。 从那里你可以从一个回购推动到另一个回购。
注意:同一台计算机上的“备份”副本不是备份(特别是如果它位于同一磁盘上)。 为了可靠,您确实需要将数据复制到一个(或多个!)不同的机器/介质,最好是在不同的位置。
听起来你的“备份”是一个裸存储库 ,但希望它是一个非裸存储库(即你希望它有自己的工作树签出)。
问题是推送到非裸存储库通常不是一个好主意。 实际上,这样的推送可能会更新HEAD指向的分支而不更新索引或工作树。 这可能导致接收存储库中非常混乱的情况(例如,添加的文件显示为已删除状态等)。 出于这个原因,Git版本1.7.0及更高版本默认拒绝接受推送到当前检出的非裸存储库分支。
注意:当您推送到裸存储库进行备份时,推送提交中包含的所有文件都在那里,它们只是没有签出(它们被压缩并保存在Git中,对象存储为“松散对象”和“打包文件” “)。 推送的数据表示您提交和推送的内容的完整历史记录副本。 您无法直接访问内容。 相反,您必须将其克隆到非裸存储库(从而检出提交)或使用git archive
提取一组文件而无需额外的存储库或完整的检出。
我真的不相信你需要像你描述的那样。
如果您需要检查存储库的旧快照(并且您不想在正常的工作存储库中执行此操作),那么您应该只是克隆一个临时副本并检查所需的旧提交。 本地克隆很便宜,因为它们可以硬链接对象存储文件而不是复制它们。 历史提交图通常是“回到过去”所需要的。 虽然Git会让你随意重写历史图,但你并没有真正做出不可恢复的更改,因为它通常需要-f
/ --force
开关和/或提供恢复机制(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/*' )
在备份存储库中,设置一个post-receive
或post-update
钩子,它执行git reset --hard
。 这将使索引和工作树与当前签出的分支保持同步。
Git FAQ “为什么我不会在”git push“之后看到远程仓库中的变化?”指向一个可以相对安全地执行此操作的示例post-update
脚本 (如果工作树或索引是脏的,它会保存一个存储 - 如果推送了具有相同路径名的新添加文件,这仍然可以丢失未跟踪的文件)。
( H="$BACKUP"/.git/hooks/post-update && curl http://utsl.gen.nz/git/post-update >$H && chmod +x "$H" )
如果要更新备份存储库,请将其推送到备份存储库。
(cd "$WORKING" && git push "$REMOTE")
如果您使用这样的设置,您绝对应该避免在备份工作树中工作。 你在那里做的任何提交,你离开那里的任何阶段性更改,以及你留在那里的任何未跟踪的文件都可能丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.