簡體   English   中英

刪除所有Git提交中所有未選中的文件

[英]remove all but selected files in all Git commits

在Git歷史記錄的所有其他文件中,我有幾個“有趣的”文件(我已經觸摸過)。 我只希望將“有趣的”文件及其歷史記錄作為Git存儲庫發布,而在此存儲庫的歷史記錄中不存在任何其他文件。

如何為git filter-branch --index-filter編寫智能腳本? (或者至少對於git filter-branch --tree-filter ,這是不希望的,因為它比較慢,而且我保存的樹很大。)

請注意,我的問題與大多數人問的最相似的問題有點不同1 2如何從Git歷史記錄中刪除特定(“敏感”)文件? 我需要刪除補碼,並保留特定文件。

因此,此腳本中git filter-branch --index-filter的棘手部分是從索引中獲取文件列表,過濾掉特定文件,然后刪除結果列表。

我已經將其實現為單獨的可執行腳本git-update-index-keeping-only ; 這是粗略的實現:

git ls-files --full-name \
| fgrep -v -x -f <(echo "$FILELIST") \
| xargs git rm --cached "$@" --

在這里,我對文件名中的換行符和空格不會怎么想(對於xargs ,空格必須是個問題,除非告訴它為每個參數再次調用該命令,而我並不是為了提高效率),對此我沒有太多考慮。

在另一個對我的用例有用的腳本中記錄了一個用法示例:在2次提交(例如,“上游”提交和最重要的一次提交)之間的差異中獲取那些經過修改或添加的有趣列表。

因為是git-filter-only-files-modified-since ; 其本質是這樣的:

FILES="$(git diff-tree "$SINCE": HEAD: \
   -r --name-only --diff-filter=MACRT)"
export FILES
git filter-branch \
   --index-filter 'echo "$FILES" | git-update-index-keeping-only -q'

暫無
暫無

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

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