gpt4 book ai didi

git - 使用 git filter-branch 删除除文件列表之外的所有内容的历史记录

转载 作者:太空狗 更新时间:2023-10-29 14:27:49 26 4
gpt4 key购买 nike

我正在尝试在两个 git 存储库之间移动一些文件 repo1repo2 .我有一个简短的文件列表,其中包含我想要移动的文件(保留历史记录)。

要从 repo1 移动的三个文件:

libraryname/file1
libraryname/file2
tests/libraryname/file3

libraryname/中还有其他文件和 tests/libraryname/ . /中还有其他文件夹和 tests/

我的计划是 checkout repo1 ,然后修改历史树,直到它只包含我感兴趣的文件的历史。然后 checkout repo2 , 并 merge 上一个操作的输出。好像git filter-branch是第一步的正确工具。

到目前为止,我已经尝试了 git filter-branch --index-filter 'git rm -r --cached <FILES>'在哪里<FILES>列出每个不需要的整个文件夹或文件。

但这会留下很多文件夹,这些文件夹不再存在于 HEAD ,但在这个存储库生命周期的某个时刻已经存在。弄清楚这个 repo 历史中存在的所有内容似乎很乏味 - 必须有更好的方法

我如何得到一个只包含这三个文件的 git 提交树?有没有比我建议更好的方法?或者,有没有办法删除 HEAD 当前不存在的所有文件的痕迹? ?

最佳答案

使用 Git 2.24(2019 年第 4 季度),git filter-branch is deprecated

等效的是,使用 newren/git-filter-repo 及其 example section :

If you have a long list of files, directories, globs, or regular expressions to filter on, you can stick them in a file and use --paths-from-file; for example, with a file named stuff-i-want.txt with contents of

README.md
guides/
tools/releases
glob:*.py
regex:^.*/.*/[0-9]{4}-[0-9]{2}-[0-9]{2}.txt$
tools/==>scripts/
regex:(.*)/([^/]*)/([^/]*)\.text$==>\2/\1/\3.txt

then you could run

git filter-repo --paths-from-file stuff-i-want.txt

在您的情况下,stuff-i-want.txt 将是:

libraryname/file1
libraryname/file2
tests/libraryname/file3

正如 kubanczyk 指出的那样:

Works well on Ubuntu 20.04, you can just pip3 install git-filter-repo since it's stdlib-only and doesn't install any dependencies.

On Ubuntu 18 it's incompatible with distro's git version, but it's easy to enough to run it on a docker run -ti ubuntu:20.04

关于git - 使用 git filter-branch 删除除文件列表之外的所有内容的历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45633033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com