簡體   English   中英

如何設置本地Git存儲庫和本地備份目錄?

[英]How do I set up a local Git repository and a local backup directory?

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_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 diffgit log (特別是-p-S選項)和git show通常可以提供你可能想要的舊的提交的任何“考古”信息,而不需要檢查任何東西(它們甚至可以在裸存儲庫)。


但是,如果您願意接受風險,您可以完全按照自己的意願行事。

像任何其他“尖銳”工具一樣,Git會讓你冒險“在腳下射擊自己”(原諒混合比喻)。

  1. 創建和配置備份存儲庫,並將其作為遠程添加到工作存儲庫中。

     # 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/*' ) 
  2. 在備份存儲庫中,設置一個post-receivepost-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" ) 
  3. 如果要更新備份存儲庫,請將其推送到備份存儲庫。

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

如果您使用這樣的設置,您絕對應該避免在備份工作樹中工作。 你在那里做的任何提交,你離開那里的任何階段性更改,以及你留在那里的任何未跟蹤的文件都可能丟失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM