2010-06-30 99 views
2

我有一個在項目的學習曲線早期創建的存儲庫。正如我學到的更多,我意識到這是創建問題,因爲我想跟蹤的一些文件在編譯的源代碼中不需要。我想要做的是創建一個新的「項目」父目錄,將現有的源目錄移動到該父目錄中,並將不需要編譯的文件遷移到該父目錄中。移動.git目錄

git可以嗎?我是否會將.git/目錄移動到父級別,因此我會徹底銷燬所有參考資料嗎?

謝謝。

+0

你說「將現有的源目錄移動到該父目錄中,並將不需要編譯的文件遷移到該父目錄中。」你在移動哪個?爲什麼不能用.gitignore和'git rm --cached path/to/files'完成? – sargas 2010-06-30 19:15:41

+1

有點像http://stackoverflow.com/questions/3142419/how-can-i-move-a-directory-in-a-git-repo-for-all-commits(這將意味着:無需移動.git目錄)? – VonC 2010-06-30 19:25:16

回答

3

一種選擇是在當前資源庫中移動東西。

例如,假設是這樣的:

/.git 
/lib/lib.c 
/lib/lib.h 
/test.c 
/readme.txt 

您可以創建一個新的文件夾(以下SRC)和(使用Git MV)移動lib文件夾和文件夾test.c的進入新的一個。然後,當前目錄將成爲您所需的「項目」父目錄,並且所有代碼都將位於新文件夾中。

/.git 
/src/lib/lib.c 
/src/lib/lib.h 
/src/test.c 
/readme.txt 

另一種方法是git filter-branch,正如VonC在註釋中指出的那樣。使用這個我相信你可以建立一個沒有移動提交的重組版本庫,這些文件只會存在於新的結構中。

+0

我最終因爲沒有考慮明顯的解決方案而大肆咒罵自己後採取了這種簡單,愚蠢的做法。謝謝,克里斯。 – 2010-07-01 11:11:14

1

與克里斯·謝弗協議,您可以使用下面的腳本來完成這些步驟:

fullpath=`pwd` 
dirname=`basename $fullpath` 

if [ ! -d ./.git ]; then 
    echo 'Working directory contains no .git repository. There is nothing to move.' 
elif [ -d ../.git ]; then 
    echo 'Parent directory already contains a .git repository. Aborting.' 
elif [ -d $dirname ]; then 
    echo "There's already a $dirname directory. Aborting to be safe." 

else # Enough checking; let's get some work done... 

    mkdir $dirname 
    shopt -s extglob 
    for file in `ls -a | egrep -v [.]git\|^[.]+\$\|^$dirname\$`; do 
    git mv $file $dirname/ 
    done 
    mv .git* .. 
    mv $dirname/* . 
    mv html/.[a-z]* . 
    git commit -m "Moved Git repository up one directory" 
    rmdir $dirname 

fi 

這可能是多一點是需要一個一次性的情況覈對,但它應該做的工作。您可以手工調整它,或者將其另存爲可執行腳本,然後從包含.git的目錄調用它。

顯然其他人已經能夠只是mv .git ..,但這並不適用於我。我必須首先執行所有的git mv file操作,然後將所有內容都移動一個。

如果我在將來更強大,我會在https://github.com/jcamenisch/dotfiles/blob/master/bin/mv-git-up處發佈更新。