2014-04-29 191 views
0

我的「真實」.git文件夾在/var/www。我想將整個文件夾推送到github。不幸的是,一些git子模塊被排除在外。如何讓git忽略git子模塊?

例如文件夾w/extensions/Lingo被排除在外。但w/extensions/Lingo/.git不是「我的」git子模塊。 Git僅用於下載w/extensions/Lingo並將用於更新該文件夾。沒有自己的發展計劃。

如何告訴我的「真實」git /var/www/.git忽略任何子模塊,如w/extensions/Lingo/.git

換句話說,我想告訴git是「只要將/var/www/*中的任何文件視爲普通文件」即可。

回答

2

www/extensions/Lingowww/extensions/Lingo不應該被忽略:您要推送的是gitlink (special entry, mode 16000),它表示(在主要回購的工作樹中)當前在www/extensions/Lingo中檢出的SHA1。

您可以檢查,通過做一個git log(沒有斜槓):

cd /var/www 
git log -- extensions/Lingo 
+0

我不想忽視它,而是將其視爲普通文件夾。怎麼做? – adrelanos

+1

@adrelanos它是一個子模塊:它並不意味着被視爲普通文件夾,而是作爲另一個回購內容的標記:一旦克隆了推送給GitHub的內容,一個簡單的'git submodule update --init '會恢復該文件夾的內容。 – VonC

+0

我把它推到github上。當有人克隆它時,他們最終會得到一個空的'/ www/w/extensions/Lingo'。不是我想要的。 – adrelanos

2

如果堅持包括一個子模塊在你的回購協議的內容,你可以做:

git submodule deinit Lingo 
git rm -r --cached extensions/Lingo 
rm -R extensions/Lingo/.git # (if it is still there) 
git add extensions/Lingo 

(正如我在「How do I remove a Git submodule?」中所詳述的)

--cached確保你沒有取消e工作樹中該文件夾的內容。

+0

這可能會起作用,但是隨後使用簡單的'git fetch' +'git merge origin/master'更新擴展/ Lingo的功能就會丟失。 – adrelanos

+1

@adrelanos當然,這就是爲什麼它是一個子模塊!最後一種方法是將其設置爲子樹:http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/(注意http://stackoverflow.com/a/14448784/6309雖然) – VonC

+0

@adrelanos其他替代方法:http://jayunit100.blogspot.fr/2013/12/git-submodules-are-to-hot-subtrees-are.html但我只是保留子模塊;) – VonC

0

我不建議這樣做,但它聽起來像你已經死了...請注意,這將導致您的「子模塊」中的文件被提交到兩個地方,並保持它們同步是一個額外的挑戰。

我認爲這至少與子模塊一樣複雜,並且由於這是一件奇怪的事情,所以其他想要貢獻的開發者可能會感到困惑。

可以移動.git目錄你的子模塊的目錄,使

  1. 你的主要Git倉庫並不認爲「子模塊」目錄作爲一個子模塊,並
  2. 你仍然可以獲取來自上游。

下面是一個簡單的例子:

  1. 克隆的東西(你的 「內部資料庫」)到主存儲庫的子目錄:

    ~ $ cd repo 
    ~/repo/ $ git clone git://some-other-repo.git/ 
    
  2. 創建一個目錄來存放.git目錄從您的內部資源庫位於您的主資源庫之外的某處,並將您的內部.git目錄移動到那裏:

    現在0
    ~/repo/ $ cd .. 
    ~ $ mkdir -p fake-submodules/some-other-repo/ 
    ~ $ mv ~/repo/some-other-repo/.git fake-submodules/some-other-repo/ 
    
  3. ,從你的主版本庫,你可以添加的所有文件,並提交像往常一樣:

    ~ $ cd repo 
    ~/repo/ $ git add some-other-repo 
    ~/repo/ $ git commit -m "Add some other repo" 
    
  4. ,並且可以使用Git的--work-tree選項獲取從上游資源庫更新:

    ~/repo/ $ cd ../fake-submodules/some-other-repo 
    ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo status 
    ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo fetch 
    ~/fake-submodules/some-other-repo/ $ git --work-tree ../../repo/some-other-repo merge origin/master 
    

請注意,您將不得不從您的的內部存儲庫執行所有Git操作目錄。您可能會想要執行類似git config core.worktree ../../repo/some-other-repo的操作,以避免每次都需要輸入--work-tree選項。

請再次重新考慮這樣做。 Git的子模塊可能並不完美,但至少它們被廣泛使用和理解。正如VonC所說,還有其他更合適的選擇,如子樹。