0

我正在尝试删除 git repo 中的一组目录,并为每个删除的目录进行 1 次提交。我正在使用 Rugged 和 Gitlab_git(它或多或少只是 Rugged 的​​一个包装器),到目前为止,除了实际删除和提交之外,我已经设法完成了我需要做的所有事情。

我在Rugged 自述文件中没有看到任何解释如何删除整个树/目录的内容。我尝试将他们的提交示例用于 blob 并用目录替换单个文件,但它没有用

我还尝试编辑他们为树构建器提供的代码,但它在我的历史记录中添加了一个提交,显示存储库中的每个文件都已添加,然后离开暂存显示相同的内容。什么都没有被删除。

oid = repo.write("Removing folder", :blob)
builder = Rugged::Tree::Builder.new(repo)
builder << { :type => :blob, :name => "_delete", :oid => oid, :filemode => 0100644 }

options = {}
options[:tree] = builder.write

options[:author] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
options[:committer] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
options[:message] ||= "Making a commit via Rugged!"
options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
options[:update_ref] = 'HEAD'

Rugged::Commit.create(repo, options)

有什么建议么?我对 git 内部仍然有点模糊,所以也许这就是我的问题。

4

2 回答 2

2

git 索引不显式跟踪目录,只跟踪它们的内容。要删除目录,请分阶段删除其所有内容。

于 2016-10-28T05:28:01.933 回答
0

您可以Tree::Builder基于存储库中的现有树创建一个,然后您可以根据需要对其进行操作。

如果您已经拥有Commit想要作为父提交的对象,那么您可以这样做:

parent_commit = ... # e.g. this might be repo.head.target

# Create a Tree::Builder containing the current commit tree.
tree_builder = Rugged::Tree::Builder.new(repo, parent_commit.tree)

# Next remove the directory you want from the Tree::Builder.
tree_builder.remove('path/to/directory/to/remove')

# Now create a commit using the contents of the modified tree
# builder. (You might want to include the :update_ref option here
# depending on what you are trying to do - something like
# :update_ref => 'HEAD'.)
commit_data = {:message => "Remove directory with Rugged",
  :parents => [commit],
  :tree => tree_builder.write
}

Rugged::Commit.create(repo, commit_data)

这将在删除目录的 repo 中创建提交,但如果您不使用:update_ref.

它也不会更新您当前的工作目录或索引。如果你想更新它们,你可以更新reset到新的HEAD,但要小心丢失任何工作。或者,您可以使用 删除目录Dir.rmdir,模仿直接删除目录时的操作。

查看文档以获取更多信息,尤其是Tree::BuilderCommit.create.

于 2016-12-23T17:00:51.280 回答