亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

ディレクトリ 検索
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore git commit-tree git count-objects git diff-index git for-each-ref git hash-object git ls-files git merge-base git read-tree git rev-list git rev-parse git show-ref git symbolic-ref git update-index git update-ref git verify-pack git write-tree Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
テキスト

命名

git-filter-branch  - 重寫(xiě)分支

概要

git filter-branch [--setup <command>] [--env-filter <command>]        [--tree-filter <command>] [--index-filter <command>]        [--parent-filter <command>] [--msg-filter <command>]        [--commit-filter <command>] [--tag-name-filter <command>]        [--subdirectory-filter <directory>] [--prune-empty]        [--original <namespace>] [-d <directory>] [-f | --force]        [--] [<rev-list options>…]

描述

讓您通過(guò)重寫(xiě)<rev-list選項(xiàng)>中提到的分支來(lái)重寫(xiě)Git修訂歷史記錄,并在每個(gè)修訂版上應(yīng)用自定義過(guò)濾器。這些過(guò)濾器可以修改每個(gè)樹(shù)(例如,刪除文件或?qū)λ形募\(yùn)行perl重寫(xiě))或每個(gè)提交的信息。否則,將保留所有信息(包括原始提交時(shí)間或合并信息)。

該命令將只重寫(xiě)positive命令行中提到的ref(例如,如果通過(guò)a..b,只會(huì)b被重寫(xiě))。如果您沒(méi)有指定過(guò)濾器,那么提交將被重新發(fā)送而不做任何更改,這通常沒(méi)有任何影響。盡管如此,這對(duì)于補(bǔ)償一些Git bug或?qū)?lái)可能會(huì)有用,因此這種用法是允許的。

注意:該命令.git/info/graftsrefs/replace/命名空間中承認(rèn)文件和引用。如果您有任何定義的移植或替換參考,運(yùn)行此命令將使它們永久。

警告!重寫(xiě)的歷史將為所有對(duì)象具有不同的對(duì)象名稱,并且不會(huì)與原始分支會(huì)聚。您將無(wú)法輕松地將重寫(xiě)的分支推送并分發(fā)到原始分支的頂部。如果您不知道全部含義,請(qǐng)不要使用此命令,并且如果簡(jiǎn)單的單一提交就足以解決您的問(wèn)題,請(qǐng)避免使用它。(有關(guān)重寫(xiě)已發(fā)布?xì)v史記錄的更多信息,請(qǐng)參閱git-rebase [1]中的“從上游重新引導(dǎo)恢復(fù)”一節(jié)。)

始終驗(yàn)證重寫(xiě)的版本是否正確:原始參考文獻(xiàn)(如果與重寫(xiě)版本不同)將存儲(chǔ)在命名空間中refs/original/。

請(qǐng)注意,由于此操作非常昂貴,因此使用該-d選項(xiàng)將臨時(shí)目錄從磁盤(pán)重定向到磁盤(pán)可能是一個(gè)好主意,例如在tmpfs上。據(jù)報(bào)道,加速非常明顯。

過(guò)濾器

這些過(guò)濾器按以下列出的順序應(yīng)用。<command>參數(shù)總是使用eval命令在shell上下文中進(jìn)行評(píng)估(出于技術(shù)原因,提交過(guò)濾器值得注意的例外)。在此之前,$GIT_COMMIT環(huán)境變量將被設(shè)置為包含被重寫(xiě)的提交的ID。此外,GIT_AUTHOR_NAME,GIT_AUTHOR_EMAIL,GIT_AUTHOR_DATE,GIT_COMMITTER_NAME,GIT_COMMITTER_EMAIL和GIT_COMMITTER_DATE取自當(dāng)前提交并導(dǎo)出到環(huán)境中,以影響由git-commit-tree [1]創(chuàng)建的替換提交的作者身份和提交者身份過(guò)濾器已運(yùn)行。

如果任何對(duì)<command>的評(píng)估返回非零退出狀態(tài),則整個(gè)操作將被中止。

一個(gè)map函數(shù)可以使用“original sha1 id”參數(shù),如果提交已被重寫(xiě),則輸出“重寫(xiě)的sha1 id”,否則輸出“original sha1 id”。map如果您的提交過(guò)濾器發(fā)出多個(gè)提交,該函數(shù)可以在單獨(dú)的行上返回多個(gè)ids。

選項(xiàng)

--setup <command>

這不是為每個(gè)提交執(zhí)行的實(shí)際過(guò)濾器,而是在循環(huán)之前的一次設(shè)置。因此,還沒(méi)有定義提交特定的變量。由于技術(shù)原因,此處定義的函數(shù)或變量可以在除提交過(guò)濾器之外的以下過(guò)濾步驟中使用或修改。

--env-filter <command>

如果您只需要修改提交將執(zhí)行的環(huán)境,則可以使用此過(guò)濾器。具體來(lái)說(shuō),您可能需要重寫(xiě)作者/提交者名稱/電子郵件/時(shí)間環(huán)境變量(有關(guān)詳細(xì)信息,請(qǐng)參閱git-commit-tree [1])。

--tree-filter <command>

這是重寫(xiě)樹(shù)及其內(nèi)容的過(guò)濾器。該參數(shù)在shell中用工作目錄設(shè)置為檢出樹(shù)的根來(lái)評(píng)估。然后使用新的樹(shù)(新文件自動(dòng)添加,消失的文件自動(dòng)刪除 - 既不.gitignore文件也沒(méi)有任何其他忽略規(guī)則有任何影響?。?/p>

--index-filter <command>

這是重寫(xiě)索引的過(guò)濾器。它類(lèi)似于樹(shù)型過(guò)濾器,但不檢出樹(shù),這使得它更快。經(jīng)常使用git rm --cached --ignore-unmatch ...,請(qǐng)參閱下面的示例。對(duì)于毛病,請(qǐng)參閱git-update-index [1]。

--parent-filter <command>

這是重寫(xiě)提交的父列表的過(guò)濾器。它將接收stdin上的父字符串,并應(yīng)在stdout上輸出新的父字符串。父字符串采用git-commit-tree [1]中描述的格式:初始提交時(shí)為空,正常提交時(shí)為“-p parent”,合并為“-p parent1 -p parent2 -p parent3 ...”承諾。

--msg-filter <command>

這是重寫(xiě)提交消息的過(guò)濾器。參數(shù)在shell中使用標(biāo)準(zhǔn)輸入的原始提交消息進(jìn)行評(píng)估; 其標(biāo)準(zhǔn)輸出被用作新的提交消息。

--commit-filter <command>

這是執(zhí)行提交的過(guò)濾器。如果指定了此過(guò)濾器,它將被調(diào)用,而不是git commit-tree命令,參數(shù)形式為“<TREE_ID>(-p <PARENT_COMMIT_ID>)...”和stdin上的日志消息。提交ID預(yù)計(jì)在標(biāo)準(zhǔn)輸出上。

作為一個(gè)特殊的擴(kuò)展,提交過(guò)濾器可能會(huì)發(fā)出多個(gè)提交id; 在那種情況下,原來(lái)承諾的改寫(xiě)孩子將把他們?nèi)慨?dāng)作父母。

您可以map在此過(guò)濾器中使用便利功能,以及其他便利功能。例如,調(diào)用skip_commit "$@"將忽略當(dāng)前的提交(但不會(huì)更改它!如果需要,則git rebase改為使用)。

如果您不希望保留對(duì)單個(gè)父代的提交并且不對(duì)樹(shù)進(jìn)行更改git_commit_non_empty_tree "$@"git commit-tree "$@"那么也可以使用它。

--tag-name-filter <command>

這是重寫(xiě)標(biāo)簽名稱的過(guò)濾器。傳遞時(shí),將調(diào)用指向重寫(xiě)對(duì)象(或指向重寫(xiě)對(duì)象的標(biāo)記對(duì)象)的每個(gè)標(biāo)記ref。原始標(biāo)簽名稱通過(guò)標(biāo)準(zhǔn)輸入傳遞,新標(biāo)簽名稱預(yù)計(jì)在標(biāo)準(zhǔn)輸出上。

原始標(biāo)簽不會(huì)被刪除,但可以被覆蓋; 使用“--tag-name-filter cat”來(lái)簡(jiǎn)單地更新標(biāo)簽。在這種情況下,要非常小心,并確保在轉(zhuǎn)換發(fā)生沖突的情況下備份舊標(biāo)簽。

幾乎可以正確重寫(xiě)標(biāo)簽對(duì)象。如果標(biāo)簽附有消息,則會(huì)使用相同的消息,作者和時(shí)間戳創(chuàng)建新的標(biāo)簽對(duì)象。如果標(biāo)簽附有簽名,簽名將被剝離。根據(jù)定義,不可能保留簽名。這是“幾乎”適當(dāng)?shù)脑?,因?yàn)槔硐肭闆r下,如果標(biāo)簽沒(méi)有改變(指向相同的對(duì)象,具有相同的名稱等),它應(yīng)該保留任何簽名。情況并非如此,簽名將永遠(yuǎn)被刪除,買(mǎi)家要小心。也不支持更改作者或時(shí)間戳(或針對(duì)該問(wèn)題的標(biāo)記消息)。指向其他標(biāo)簽的標(biāo)簽將被重寫(xiě)為指向底層提交。

--subdirectory-filter <directory>

只能看看觸及給定子目錄的歷史記錄。結(jié)果將包含該目錄(并且僅包含該目錄)作為其項(xiàng)目根目錄。意味著重新映射到祖先。

--prune-empty

有些過(guò)濾器會(huì)生成空的提交,使樹(shù)保持不變。這個(gè)選項(xiàng)指示git-filter-branch刪除這樣的提交,如果它們只有一個(gè)或零個(gè)未修剪的父母; 因此合并提交將保持不變。這個(gè)選項(xiàng)不能與一起使用--commit-filter,盡管通過(guò)git_commit_non_empty_tree在提交過(guò)濾器中使用提供的功能可以實(shí)現(xiàn)相同的效果。

--original <namespace>

使用此選項(xiàng)設(shè)置原始提交將存儲(chǔ)在其中的名稱空間。默認(rèn)值是refs/original。

-d <directory>

使用此選項(xiàng)可將路徑設(shè)置為用于重寫(xiě)的臨時(shí)目錄。當(dāng)應(yīng)用樹(shù)型過(guò)濾器時(shí),該命令需要暫時(shí)將該樹(shù)檢出到某個(gè)目錄,這在大型項(xiàng)目的情況下可能消耗相當(dāng)大的空間。默認(rèn)情況下,它在.git-rewrite/目錄中執(zhí)行此操作,但您可以通過(guò)此參數(shù)覆蓋該選項(xiàng)。

-f   --force

git filter-branch拒絕從現(xiàn)有的臨時(shí)目錄開(kāi)始,或者當(dāng)已經(jīng)有ref時(shí)refs/original/,除非強(qiáng)制。

<rev-list options>…

參數(shù)git rev-list。這些選項(xiàng)包含的所有正面參考都被重寫(xiě)。您也可以指定諸如此類(lèi)的選項(xiàng)--all,但您必須使用--它們將它們與git filter-branch選項(xiàng)分開(kāi)。意味著重新映射到祖先。

重新映射到祖先

通過(guò)使用git-rev-list [1]參數(shù),例如路徑限制器,您可以限制被重寫(xiě)的修訂集。然而,在命令行上的正面參考是有區(qū)別的:我們不會(huì)讓這些限制器排除它們。為此,他們改寫(xiě)為指向最近的未被排除的祖先。

例子

假設(shè)您想從所有提交中刪除文件(包含機(jī)密信息或版權(quán)侵犯):

git filter-branch --tree-filter 'rm filename' HEAD

但是,如果該文件在某個(gè)提交的樹(shù)中不存在,則該樹(shù)的簡(jiǎn)單操作rm filename將失敗并提交。因此,您可以改為使用rm -f filename腳本。

使用它--index-filter可以git rm產(chǎn)生更快的版本。與使用一樣,如果文件不在提交樹(shù)中rm filename,git rm --cached filename將會(huì)失敗。如果你想“完全忘記”一個(gè)文件,它輸入歷史記錄時(shí)無(wú)關(guān)緊要,所以我們還添加--ignore-unmatch

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

現(xiàn)在,您將獲得保存在HEAD中的重寫(xiě)歷史記錄。

重寫(xiě)存儲(chǔ)庫(kù)以使其看起來(lái)像是foodir/其項(xiàng)目根目錄,并放棄所有其他歷史記錄:

git filter-branch --subdirectory-filter foodir -- --all

因此,您可以將庫(kù)子目錄轉(zhuǎn)換為自己的存儲(chǔ)庫(kù)。請(qǐng)注意,--filter-branch選項(xiàng)將從修訂選項(xiàng)中分離選項(xiàng),并--all重寫(xiě)所有分支和標(biāo)簽。

要將提交(通常位于其他歷史記錄的頂端)設(shè)置為當(dāng)前初始提交的父級(jí),以便將其他歷史記錄粘貼到當(dāng)前歷史記錄的后面:

git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD

(如果父字符串為空 - 當(dāng)我們處理初始提交時(shí)發(fā)生 - 將graftcommit作為父項(xiàng)添加)。請(qǐng)注意,這假設(shè)歷史記錄具有單個(gè)根(即沒(méi)有共同祖先發(fā)生時(shí)不合并)。如果不是這種情況,請(qǐng)使用:

git filter-branch --parent-filter \        'test $GIT_COMMIT = <commit-id> && echo "-p <graft-id>" || cat' HEAD

甚至更簡(jiǎn)單:

echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD

刪除歷史記錄中由“Darl McBribe”撰寫(xiě)的提交:

git filter-branch --commit-filter '        if [ "$GIT_AUTHOR_NAME" = "Darl McBribe" ];
        then
                skip_commit "$@";        else
                git commit-tree "$@";
        fi' HEAD

該功能skip_commit定義如下:

skip_commit(){
        shift;        while [ -n "$1" ];        do
                shift;
                map "$1";
                shift;
        done;}

換擋魔法首先拋棄樹(shù)ID,然后拋出-p參數(shù)。請(qǐng)注意,這將正確處理合并!如果Darl在P1和P2之間進(jìn)行合并,它將被正確傳播,并且合并的所有子代將成為合并提交,P1和P2作為它們的父代提交,而不是合并提交。

注意提交引入的更改以及未被后續(xù)提交恢復(fù)的更改仍將位于重寫(xiě)的分支中。如果你想changes與提交一起扔掉,你應(yīng)該使用交互模式git rebase。

您可以使用重寫(xiě)提交日志消息--msg-filter。例如,可以通過(guò)以下方式刪除git svn-id由創(chuàng)建的存儲(chǔ)庫(kù)中的字符串git svn

git filter-branch --msg-filter '
        sed -e "/^git-svn-id:/d"'

如果你需要為Acked-by最后10個(gè)提交(其中沒(méi)有一個(gè)是合并)添加行,請(qǐng)使用以下命令:

git filter-branch --msg-filter '
        cat &&
        echo "Acked-by: Bugs Bunny <bunny@bugzilla.org>"' HEAD~10..HEAD

--env-filter選項(xiàng)可用于修改提交者和/或作者身份。例如,如果您發(fā)現(xiàn)由于配置錯(cuò)誤的user.email而導(dǎo)致您的提交有錯(cuò)誤身份,則可以在發(fā)布項(xiàng)目之前進(jìn)行更正,如下所示:

git filter-branch --env-filter '        if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
        then
                GIT_AUTHOR_EMAIL=john@example.com
        fi        if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
        then
                GIT_COMMITTER_EMAIL=john@example.com
        fi
' -- --all

要限制僅重寫(xiě)歷史記錄的一部分,除了指定新的分支名稱外,還要指定一個(gè)修訂范圍。新的分支名稱將指向git rev-list該范圍的最高版本。

考慮這個(gè)歷史:

     D--E--F--G--H    /     /A--B-----C

只重寫(xiě)提交D,E,F(xiàn),G,H,但只保留A,B和C,請(qǐng)使用:

git filter-branch ... C..H

要重寫(xiě)提交E,F(xiàn),G,H,請(qǐng)使用以下其中一個(gè):

git filter-branch ... C..H --not D
git filter-branch ... D..H --not C

要將整棵樹(shù)移動(dòng)到一個(gè)子目錄中,或從其中刪除它:

git filter-branch --index-filter \
        'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
         mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

收縮存儲(chǔ)庫(kù)的清單

git-filter-branch可以用來(lái)擺脫文件的一個(gè)子集,通常用一些--index-filter和的組合--subdirectory-filter。人們期望得到的存儲(chǔ)庫(kù)比原來(lái)的存儲(chǔ)庫(kù)要小,但是你需要更多的步驟才能使它更小,因?yàn)镚it在你告訴它之前盡量不要丟失你的對(duì)象。首先確保:

  • 如果一個(gè)blob在其整個(gè)生命周期中移動(dòng),你真的會(huì)刪除所有文件名的變體。git log --name-only --follow --all -- filename可以幫助您找到重命名。

  • 你真的過(guò)濾了所有的refs:--tag-name-filter cat -- --all在調(diào)用git-filter-branch時(shí)使用。

然后有兩種方法可以獲得較小的存儲(chǔ)庫(kù)。更安全的方法是克隆,這可以保持原來(lái)的原樣。

  • 克隆它git clone file:///path/to/repo??寺⒉粫?huì)有被刪除的對(duì)象。參見(jiàn)git-clone [1]。(請(qǐng)注意,使用純路徑進(jìn)行克隆只是將所有內(nèi)容硬鏈接起來(lái)?。┤绻_實(shí)不想克隆它,無(wú)論出于何種原因,請(qǐng)檢查以下幾點(diǎn)(按此順序)。這是一種非常具有破壞性的方法,因此請(qǐng)進(jìn)行備份或恢復(fù)克隆。你被警告了。

  • 刪除由git-filter-branch備份的原始參考:說(shuō)git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d。

  • 使用所有reflogs git reflog expire --expire=now --all。

  • 垃圾收集所有未被引用的對(duì)象git gc --prune=now(或者如果你的git-gc不夠新以支持參數(shù)--prune,則git repack -ad; git prune改為使用)。

警告

git-filter-branch允許你對(duì)Git歷史進(jìn)行復(fù)雜的shell腳本重寫(xiě),但如果你只是removing unwanted data像大文件或密碼那樣,你可能不需要這種靈活性。對(duì)于這些操作,您可能需要考慮BFG Repo-Cleaner,一種基于JVM的git-filter-branch替代方案,對(duì)于這些用例而言,其典型速度至少快10-50倍,并且具有不同的特征:

  • 任何特定版本的文件都會(huì)被精確清理once。與git-filter-branch不同的是,BFG不會(huì)讓你有機(jī)會(huì)根據(jù)歷史記錄中何時(shí)或何時(shí)提交文件來(lái)處理文件。這個(gè)約束條件給了BFG的核心性能優(yōu)勢(shì),并且非常適合清理不良數(shù)據(jù)的任務(wù) - 您不關(guān)心where壞數(shù)據(jù),您只需要它gone。

  • 默認(rèn)情況下,BFG充分利用多核機(jī)器,并行清理提交文件樹(shù)。git-filter-branch清除按順序提交(即以單線程方式)提交,盡管is可以在針對(duì)每個(gè)提交執(zhí)行的腳本中編寫(xiě)包含它們自己的并行性的過(guò)濾器。

  • 該命令選項(xiàng)都遠(yuǎn)遠(yuǎn)超過(guò)git的過(guò)濾分支更嚴(yán)格,并致力于只是為了消除不必要的數(shù)據(jù)-例如任務(wù):--strip-blobs-bigger-than 1M

前の記事: 次の記事: