2014-02-08 73 views
3

情況:我剛剛克隆了一個git repo,然後爲回購配置了塗抹過濾器。在回購庫中散佈了.gitattributes個文件,指定在結帳時應對文件使用的過濾器。但是,由於我在結帳(克隆)後設置了篩選器,因此沒有處理任何文件。git:創建塗抹過濾器後重新簽出文件

我該如何告訴git通過回購,找到所有.gitattributes文件,並更新(重新簽出,應用過濾器,無論什麼)所有的文件上有一個塗抹過濾器?

回答

7

只需重新檢查一切。

cd /path/to/your/repo 
git stash save 
rm .git/index 
git checkout HEAD -- "$(git rev-parse --show-toplevel)" 
git stash pop 

塗抹過濾器將應用於新的結帳。

請注意,如this answer所示,您需要刪除索引以強制過濾器再次運行。

Alexander Amelkin評論below

我已經創建了一個別名「reattr」來執行所有這些步驟,現在我很高興。

reattr = !sh -c "\"git stash save; rm .git/index; git checkout HEAD -- \\\"$(git rev-parse --show-toplevel)\\\"; git stash pop\"" 

(多線可讀性)

reattr = !sh -c "\"git stash save; \ 
        rm .git/index; \ 
        git checkout HEAD -- \\\"$(git rev-parse --show-toplevel)\\\"; \ 
        git stash pop\"" 
+1

不起作用。不塗抹塗抹。我猜git足夠聰明,知道這個文件沒有被修改,所以它認爲它不需要被檢出並且忽略它。我能夠讓git重新簽出文件的唯一方法就是觸摸文件,然後檢查出來。但我想要觸摸整個回購中的每個文件。 – Patrick

+0

@Patrick奇怪,我已經做了幾個月,現在已經成功:https://github.com/VonC/compileEverything/blob/master/gitlab/install_or_update_gitlab.sh.tpl#L64-L68。試試'git checkout HEAD -/path/to/your/repo' – VonC

+0

這樣做,謝謝。我將它添加到我用來設置過濾器的腳本中,但只做了一些調整:1)在結帳前後添加'git stash save'和'git stash pop'(如果保存做了任何事情)。這是爲了萬一我正在處理任何事情。 2)'git checkout HEAD - 「$(git rev-parse --show-toplevel)」'所以我不必硬編碼路徑。 – Patrick

2

您可以刪除Git的指數,讓Git的它重新掃描,以瞭解變化。然後,您可以檢出所有含有塗抹過濾器的文件。

# remove Git index 
rm .git/index 

# rescan index 
git reset HEAD -- . 

# checkout all the files which have a smudge filter on them 
git ls-files --modified | grep -v .gitattributes | awk '{print "git checkout HEAD -- \""$1"\""}' | bash 

注: 再結賬之前,保存未提交的修改,否則,您對這些污跡濾光器的文件,所有的修改都將被取代。