删除树并使用Rugged进行提交

时间:2016-10-20 22:45:15

标签: ruby git gitlab libgit2 rugged

我试图删除git repo中的目录数组,并为每个删除的目录进行1次提交。我使用Rugged和Gitlab_git(它或多或少只是Rugged的一个包装器)到目前为止我已经设法做了我需要做的一切,除了实际的删除和提交。

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

我还尝试编辑他们为树构建器编写的代码,但是它添加了一个提交到我的历史记录,显示已添加的repo中的每个文件,然后左侧分段显示相同的事情。什么都没删除。

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内部有点模糊,所以也许这就是我的问题。

2 个答案:

答案 0 :(得分:2)

git索引不会显式跟踪目录,只跟踪其内容。要删除目录,请删除其所有内容。

答案 1 :(得分: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删除目录,模仿直接删除目录时的操作。

查看docs了解详情,尤其是Tree::BuilderCommit.create