2011-03-23 55 views
54

混帳初學者問題:移動一個Git倉庫了一個層級

我有與msysgit本地版本的小型私人webproject。沒有外部存儲庫,因爲它只適用於我,所以我可以根據需要做任何事情。

我已經在項目目錄中設置了這個設置,即在「webroot」中。

現在必須創建第二個目錄,並放置爲與webroot平行。我們稱之爲資產。

所以結構如下內容:

\ project directory 
----\webroot 
----\assets 

我很想包括Git倉庫這個新的目錄,所以我會還的版本修改文件存放在那裏,但我當然可以't使用「git add ../assets」。我也不想在project_directory中創建一個新的git項目,因爲這會丟失我以前的所有提交。

那麼我該如何將存儲庫從「webroot」移出到「project_directory」,同時保留我的提交,然後才能夠包含「資產」?

+0

不完全是你在問什麼,但你可以創建一個分支並添加資產。 – 2011-03-23 16:32:18

回答

56

所以,你希望你的git回購協議是這樣的:

<projectdir> 
    /.git 
    /webroot 
    /assets 

要做到這一點,你必須在你的回購現有文件移動到一個新的webroot子目錄。

cd <git repo root> 
mkdir webroot 
git mv <all your files> webroot 
git commit --all -m "moved all existing files to new 'webroot' directory" 

然後,在你的本地文件系統要重新定位你的克隆一個目錄之上的地方,現在是:

cd <projectdir> 
mv webroot/* . 
rmdir webroot 

那麼你一定要到assets目錄(文件)添加到混帳回購協議:

git add assets 
git commit -m "added assets to the repo" 
+1

好的,顯然我沒有提供足夠的信息。該存儲庫已位於/ projectdir/webroot /內部,因爲這是它最初創建的位置。由於資產目錄來臨,如果存儲庫的行爲就像在/ projectdir /中創建的那樣,我更喜歡它,而這種情況並非如此。 git mv不會讓我將文件移動到存儲庫之外。 – Sorcy 2011-03-26 12:37:41

+0

@Sorcy:我相信我明白你想要做什麼。我更新了我的答案以澄清它。 – 2011-03-26 13:24:11

+0

謝謝,這正是我正在尋找的解決方案。 :) – Sorcy 2011-03-26 19:56:36

5

您提交不在本地依賴於它們存儲在混帳回購協議中的「根目錄」文件夾中。

您可以簡單地刪除webroot目錄recheckout在新位置「/ project directory」中的存儲庫添加assets目錄並提交。

rm -Rf webroot 
git clone path-to-repo 
git add assets 
git commit -m "Added assets directory" 
git push 
8

我假設你的意思重寫歷史,包含所有修訂的所有文件,就好像它們一直在一個子目錄根目錄/,而不是在根

的git的過濾分支幫助頁的答案,在這裏,重寫所有現有的裁判(支部)和標籤的改進版本:

time git filter-branch --index-filter 'git ls-files -s | 
     sed "s-\t\"*-&webroot/-" | 
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all 

已經採取謹慎措施,以使這是一個索引只操作,這樣的過程將跑得快甚至大回購。記住(當滿意時)擺脫原始參考(.git/refs/original/*)並重新包裝回購以釋放過時的樹對象。

+1

你能解釋一下如何擺脫原始文獻並重新包裝回購?它只是GC還是其他的東西? – NateS 2016-11-19 13:19:29

6

您也可以將您的.git目錄上移一個級別並更新您的工作樹。

cd projectdir 
mv ./webroot/.git ./.git 
git config core.worktree /absolute-path-to-project-dir 
git add assets 
git commit -m 'adding assets folder' 

不是正面的,但我敢肯定,core.worktree的路徑必須是絕對的。

+0

下面是爲我工作的訂單。當我在我想要移動.git文件的文件夾中時: 'mv .git/../' – user2038085 2015-02-21 20:46:59

0

以下命令會重寫您的Git歷史記錄。它看起來好像內容一直在webroot。如果多個人在使用回購協議,通常重寫歷史記錄會很麻煩。既然你一個人工作,它應該沒問題。

git filter-branch --index-filter ' 
    git read-tree --prefix="webroot/" $GIT_COMMIT && \ 
    git ls-files \ 
     | sed "s/\/.*//" \ 
     | sort \ 
     | uniq \ 
     | grep -v "^webroot" \ 
     | xargs -L1 git rm -r --cached > /dev/null' 
相關問題