簡體   English   中英

如何檢查所有 git-lfs 跟蹤和提交的文件都是指針?

[英]How to check that all git-lfs tracked and committed files are pointers?

由於 git-lfs 需要一些手動設置(安裝 git-lfs,運行git lfs install一次),這可能導致開發人員沒有正確提交 git-lfs 跟蹤的文件類型。 我想在我們的持續集成系統上檢查拉取請求。

如何檢查所有 git-lfs 跟蹤和提交的文件都是指針? 有一個檢查,例如在變基時運行,但這不能作為 cli-command 使用。

我想要這樣的東西:

$ git clone https://...
$ [git lfs check-for-pointers]
Encountered 35 file(s) that should have been pointers, but weren't:
    file1.png
    ...

Git LFS 沒有辦法在本機執行此操作,但如果您想查看對它的支持,可以在 GitHub 存儲庫上打開一個問題。 同時,您可以使用如下技術實現這一點:

git ls-files | git check-attr --stdin filter | \
awk -F': ' '$3 ~ /lfs/ { print $1}' | \
xargs -L1 sh -c 'git cat-file blob "HEAD:$0" | \
    git lfs pointer --check --stdin || { echo "$0"; false; }'

如果此命令產生任何輸出,則存在無效的指針文件,它應該打印它是哪個文件。 如果一切正常,它也將退出零,如果有損壞的文件,它也將退出零。

這確實有一個限制,即它不處理包含冒號空格或換行符的文件名; 如果這很重要,您將必須使用-z選項並通過perlruby而不是awk

這是一個可能更快一點的替代解決方案:

rm .git/index && ! git reset --hard HEAD 2>&1 | grep 'that should have been pointers'

請注意,此解決方案將刪除尚未提交的數據。

對於那些沒有掃描下面答案的評論的人;)

除了 bkk2204( git ls-files -z用於文件名中的空格和其他瘋狂字符)並感謝來自 github 的 calve

git ls-files -z | git check-attr --stdin -z filter | \
perl -n0 -e 'chomp; push @x, $_; if (@x == 3) { print "$x[0]$/" if $x[2] eq "lfs"; @x=(); }' | \
xargs -0 -L1 --no-run-if-empty sh -c 'git cat-file blob "HEAD:$0" | git lfs pointer --check --stdin || { echo $0; false; }'

你可能會注意到

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM