grit - пытается добавить файлы в git repo без записи их в файловую систему
mkdir /tmp/scratch
cd /tmp/scratch
git init .
-* - xx.rb:
SCRATCH = '/tmp/scratch'
repo = Repo.new(SCRATCH)
def add_multiple_commits_same_file_different_content(repo)
previous_commit = repo.commits.first && repo.commits.first.id
dir = "./"
(0...5).each do |count|
i1 = repo.index
i1.read_tree('master')
i1.add("#{dir}foo.txt", "hello foo, count is #{count}.\n")
dir += "sd#{count}/"
previous_commit = i1.commit("my commit - #{count}",
previous_commit,
Actor.new("j#{count}", "e@e#{count}.zz"),
previous_commit.nil? ? nil : repo.commits(previous_commit).first.tree)
end
end
add_multiple_commits_same_file_different_content(repo)
---* ---
git status:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: ./foo.txt
# deleted: ./sd0/foo.txt
# deleted: ./sd0/sd1/foo.txt
# deleted: ./sd0/sd1/sd2/foo.txt
# deleted: ./sd0/sd1/sd2/sd3/foo.txt
# deleted: ./sd0/sd1/sd2/sd3/sd4/foo.txt
---* ----
Если я пытаюсь проверить файлы, они удаляются. Любые идеи по HWTA я делаю неправильно.
Спасибо Джон
2 ответа
Я знаю, что это старый пост, но у меня возникла та же проблема, и я нашел ее при поиске решения. Похоже, вы должны быть в каталоге репо при добавлении файла (ов). Вот что я сделал, чтобы это работало...
repo = Grit::Repo.init('repo/test.git')
File.open('repo/test.git/foo.txt', 'w') { |f| f.puts 'Hello World!' }
Dir.chdir('repo/test.git') { repo.add('foo.txt') }
repo.commit_index('This commit worked!')
Ключевым шагом является блок Dir.chdir. Надеюсь, это будет работать и для вас!
На мой взгляд, грит на самом деле не следует POLA, поэтому вот как добавить все измененные файлы. Моя кривая обучения заключалась в том, что Грит возвращал файлы (например, repo.status.files
) не будет работать, если передается repo.add
, Вместо этого вам нужно использовать имена файлов. Мне нужно было зайти в исходный код, чтобы понять это.
location = '/foo/bar/my_repo'
repo = Grit::Repo.new(location)
# modified, added, un-tracked files
changed_files = repo.status.files.select { |k,v| (v.type =~ /(M|A)/ || v.untracked) }
Dir.chdir(location) {
changed_files.each do |changed_file|
# changed_file here is array, which first element is name of file
# e.g. changed_file.first => "example.txt."
repo.add(changed_file.first)
end
}
repo.commit_index("Successful commit! yeeeee! ")