gpt4 book ai didi

GIT:如何将文件添加到第一次提交(并在此过程中重写历史记录)?

转载 作者:IT王子 更新时间:2023-10-29 01:27:12 26 4
gpt4 key购买 nike

我想将一个文件添加到 git 存储库,就好像它从一开始就在那里一样。我只找到有关如何从整个历史记录中删除文件的说明,而没有找到如何添加文件的说明。

我尝试了 git filter-branch --tree-filter 'git add LICENSE.txt' 但我收到找不到文件的错误。

最佳答案

git filter-branch 可以做到这一点,但可能比需要的重量重得多。

您的历史有多大?如果它又小又短,最简单的方法是现在添加新文件,然后使用 git rebase -i --root 将新提交移动到第二个位置并将其压缩到根提交。

例如,假设您有:

$ git log --oneline --graph --decorate --all
* e8719c9 (HEAD, master) umlaut
* b615ade finish
* e743479 initial

(您的 SHA-1 值当然会有所不同)并且您希望将 LICENSE.txt(已经在工作目录中)作为根提交的一部分添加到树中。你现在就可以这样做:

$ git add LICENSE.txt && git commit -m 'add LICENSE, for fixup into root'
[master 924ccd9] add LICENSE, for fixup into root
1 file changed, 1 insertion(+)
create mode 100644 LICENSE.txt

然后运行 ​​git rebase -i --root。捕获最后一行 (pick ... add LICENSE, ...) 并将其移动到第二行,将 pick 更改为 fixup,并写出 rebase-commands 文件并退出编辑器:

".git/rebase-merge/git-rebase-todo" 22L, 705C written
[detached HEAD 7273593] initial
2 files changed, 4 insertions(+)
create mode 100644 LICENSE.txt
create mode 100644 x.txt
Successfully rebased and updated refs/heads/master.

(新的、完全重写的)历史现在看起来更像这样:

git log --oneline --graph --decorate --all
* bb71dde (HEAD, master) umlaut
* 7785112 finish
* 7273593 initial

LICENSE.txt 在所有提交中。


如果你确实有更复杂的(分支)历史并且想使用 git filter-branch 来更新它,你需要的 --tree-filter不是:

'git add LICENSE.txt'

而是:

'cp /somewhere/outside/the/repo/LICENSE.txt LICENSE.txt'

每次都将新文件复制到树中。 (更快的方法是使用 --index-filter 但这更复杂。)

关于GIT:如何将文件添加到第一次提交(并在此过程中重写历史记录)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353584/

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