情況:我剛剛克隆了一個git repo,然後爲回購配置了塗抹過濾器。在回購庫中散佈了.gitattributes
個文件,指定在結帳時應對文件使用的過濾器。但是,由於我在結帳(克隆)後設置了篩選器,因此沒有處理任何文件。git:創建塗抹過濾器後重新簽出文件
我該如何告訴git通過回購,找到所有.gitattributes
文件,並更新(重新簽出,應用過濾器,無論什麼)所有的文件上有一個塗抹過濾器?
情況:我剛剛克隆了一個git repo,然後爲回購配置了塗抹過濾器。在回購庫中散佈了.gitattributes
個文件,指定在結帳時應對文件使用的過濾器。但是,由於我在結帳(克隆)後設置了篩選器,因此沒有處理任何文件。git:創建塗抹過濾器後重新簽出文件
我該如何告訴git通過回購,找到所有.gitattributes
文件,並更新(重新簽出,應用過濾器,無論什麼)所有的文件上有一個塗抹過濾器?
只需重新檢查一切。
cd /path/to/your/repo
git stash save
rm .git/index
git checkout HEAD -- "$(git rev-parse --show-toplevel)"
git stash pop
塗抹過濾器將應用於新的結帳。
請注意,如this answer所示,您需要刪除索引以強制過濾器再次運行。
我已經創建了一個別名「
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\""
您可以刪除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
注: 再結賬之前,保存未提交的修改,否則,您對這些污跡濾光器的文件,所有的修改都將被取代。
不起作用。不塗抹塗抹。我猜git足夠聰明,知道這個文件沒有被修改,所以它認爲它不需要被檢出並且忽略它。我能夠讓git重新簽出文件的唯一方法就是觸摸文件,然後檢查出來。但我想要觸摸整個回購中的每個文件。 – Patrick
@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
這樣做,謝謝。我將它添加到我用來設置過濾器的腳本中,但只做了一些調整:1)在結帳前後添加'git stash save'和'git stash pop'(如果保存做了任何事情)。這是爲了萬一我正在處理任何事情。 2)'git checkout HEAD - 「$(git rev-parse --show-toplevel)」'所以我不必硬編碼路徑。 – Patrick