如何在git repo的第一次提交时添加文件?

14ifxucb  于 2023-02-28  发布在  Git
关注(0)|答案(3)|浏览(144)

我一直在将旧的SVN repos转换为GIT。我已经得到了要转换的分支和标记。包括在GIT中使SVN标记成为真实的的标记。
但是,我想在新创建的GIT repo中的第一个提交中添加一个gitignore,让它看起来好像文件一直都在那里一样,这样所有后续的提交(在master或分支中)都会有这个文件,因为父树会引导回第一个提交。
看起来某种形式的git rebase或者git filter-branch --tree-filter正是我所需要的,我已经尝试了其中的每一种,但是最后都得到了断开的分支。

nxowjjhe

nxowjjhe1#

最近我不得不修改一个早期提交,因为提交消息中有一个有问题的拼写错误。这适用于修改任何关于先前提交的内容。我将Charles Bailey的答案修改为Combine the first two commits of a Git repository?

# Go back to the commit you want to change (detach HEAD)
git checkout <sha1_for_commit_to_change>

# Make any changes now (add your new file) then add them to the index
git add <new_files>

# amend the current commit
git commit --amend

# temporarily tag this new commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after the change onto the new initial commit
git rebase --rebase-merges --onto tmp <sha1_for_commit_to_change>

# remove the temporary tag
git tag -d tmp

请注意,这将更改修改后提交的所有提交ID,因此不建议在公共仓库中使用。此外,您还必须重新创建所有标记

cnwbcb6i

cnwbcb6i2#

如果需要,请在干净的工作树或新克隆上执行此操作:

$ git checkout -b withgitignore $firstcommithash
$ git add .gitignore
$ git commit --amend
$ for branch in branch1 branch2 branch3 ... ; do
      git checkout $branch
      git rebase withgitignore
   done

未测试;)

qlfbtfca

qlfbtfca3#

假设这是一个全新的重建,那么一个技巧就是在第一次提交时开始一个分支,并在那里添加gitignore。现在你在分支的头部有了“正确”的提交。现在的技巧是-你使用grafts工具来重新排序感知到的提交序列。一个普通的git filter-branch将使它永久化。尽管旧的层次结构仍将列在refs\info(IIRC)中的originals下。
虽然这将创建一个包含gitignore文件的早期提交,但所有其他提交仍然没有gitignore文件。
编辑:----------git-filter-branch,给出了例子:
git filter-branch --tree-filter 'rm filename' HEAD--index-filter变体。
你可以简单地add .gitignore你的.gitignore而不是删除,并使用--index-filter,这样你的工作树仍然是完整的,可以从中复制。
不过要先确保你有备份!如果对你有效就报告一下。

相关问题