Добавить набор исправлений gerrit, если коммиты были сделаны локально

У меня проблема в следующем:

У меня есть репозиторий git, который я фиксировал локально с помощью плагина Pycharm git (не уверен, что эта его часть актуальна). Я отправил эти изменения в репозиторий gitlab.

Теперь мне нужно сделать код-ревью. Кто-то присылает мне репозиторий git с файлом .gitreview. Они сказали мне клонировать репозиторий, скопировать/вставить мои локальные файлы и выполнить следующие шаги:

git clone http://repo-address/wow.git
cd wow
git review -s
git checkout -b fix_something

# ソース
tox -e py27 -e pep8 # for testing
git add # the files
gitt commit -m "コメント"
git review

Я сделал это и увидел, что мои файлы загружены в gerrit. Для моих файлов был проведен некоторый обзор кода, и всякий раз, когда я хотел загрузить ревизии или изменения, мне приходилось выполнять следующий процесс:

git review -d "the ID of the patch set you want to edit"

# Edit the source
tox -e py27 -e pep8 # Test command
git add files you want
git commit --amend
git review 

Что я почти уверен, что сделал правильно по крайней мере один раз, но здесь все становится немного мутно (поэтому мне нужна помощь). Я определенно отредактировал набор исправлений и правильно исправил его по крайней мере один раз (я вижу это на gerrit, и когда я git diff его по сравнению с предыдущим коммитом, изменения есть).

Однако здесь я пытаюсь сделать это снова, и это не работает должным образом, возможно, потому, что я продолжал вносить изменения в локальный репозиторий вместо клонированного репозитория, в котором был файл .gitreview. То, что я пытался сделать (и, вероятно, неправильно)

  1. изменить локальное репо
  2. скопируйте все файлы из локального репо в репо с файлом .gitreview в нем
  3. выполните вышеуказанные шаги с помощью git review-d

И вот что происходит:

error: unable to unlink old 'repo/__init__.py': Permission denied
...

Почти для каждого файла. Я предполагаю, что это потому, что копирование моего локального материала и просто тяжелая перезапись всего было плохим. Коллега посоветовал мне сослаться на это (это на японском, извините: http://qiita.com/uasi/items/77d41698630fef012f82), который в основном представляет собой руководство по объединению двух репозиториев в один (с сохранением истории коммитов). Я последовал за этим, выполнив:

cd ~/gerrit-repo
git remote add hotfix ~/local-repo  # i assum the "hotfix" is just a name reference so i may have messed up here too
git fetch hotfix
git merge hotfix/master

который «работал» тем, что копировал и объединял все, и все, что мне нужно было сделать, это разрешить конфликт в файле .gitignore. Теперь я могу просто сделать обзор git, и все должно быть в порядке. Проблема в том, что когда я сделал gitreview, произошло следующее:

You are about to submit multiple commits. This is expected if you are
submitting a commit that is dependent on one or more in-review
commits. Otherwise you should consider squashing your changes into one
commit before submitting.

The outstanding commits are:

0994069 (HEAD -> review/me/intit-test) Newest patch merge preparation (hopefully I didn't mess everything up)
b49d7b4 checking whether the patch set stuff actually worked。
8b3685b (hotfix-patch/master) patch-13-prep
afdd1ca minor edits to log config
5425ac7 reorganization re: patch set 12 code-review-1
de57a63 reorganization re: patch set 12 code-review-1
30133bf appended yuck func to xyz file
f7760b9 init xyz file
e48aa60 added log folder to ignore
cdbbdf5 init setup.py
76d0e9d created folders for the different configs needed for different servers. I don't know if these should all be accessible from one directory though.
1599648 added command list for the checks
...

Я замечаю, что каждый коммит с момента моего первоначального коммита был там. Что является проблемой, так как я хочу добавить только те коммиты из моего локального каталога, которые произошли с момента последнего обзора/набора исправлений git. Во всяком случае, продолжил, несмотря ни на что, а затем:

remote: Resolving deltas: 100% (414/414)          
remote: Processing changes: refs: 1, done            
remote:
remote: ERROR:  In commit 28064f...  # (this actually is the first commit in my local repo)      
remote: ERROR:  committer email address [email protected]        
remote: ERROR:  does not match your user account.        
remote: ERROR:        
remote: ERROR:  The following addresses are currently registered:        
remote: ERROR:    [email protected]        
remote: ERROR:        
remote: ERROR:  To register an email address, please visit:        
remote: ERROR:  http://gerrit-link/#/settings/contact        
remote:
remote:
To ssh://gerrit-link:port/repo/project.git
 ! [remote rejected] HEAD -> refs/publish/master/intit-test (invalid     committer)
error: failed to push some refs

Что для меня имеет смысл, но нежелательно, поскольку локальные коммиты были сделаны с моей локальной машины (а конфликтующая фиксация, о которой идет речь, на самом деле является моей первой фиксацией для репо). Я не уверен, должен ли я разрешить разницу в электронной почте при первоначальном коммите, а затем смогу просмотреть, или мне также нужно исправить историю коммитов. Я ошибаюсь, думая, что я должен делать коммиты только после установки последнего патча? Если да, то как добавить коммиты только после коммита в наборе исправлений gerrit?

Короче говоря, скажем, что у меня есть репозиторий, на который я нажал и которым я управляю. Я хочу скопировать все эти файлы в другое хранилище под другим названием/что у вас есть. Я знаю, и теперь это актуально. Поэтому я хочу продолжить работу только над этим новым репо. Но я случайно продолжал работать над оригинальным местным. Как добавить коммиты из моего локального в новый?


person frei    schedule 23.03.2017    source источник


Ответы (2)


Вы также можете использовать этот способ для перемещения фиксации из старого репо в новое репо:

# In the new repo
git remote add old <path for the ole repo> -f
# find the commit id you want to move
git checkout -b temp <the commit id you want to move>
git checkout -
git merge temp
# solve the conflict if has and commit changes
git branch -D temp 
person Marina Liu    schedule 23.03.2017

Короче говоря, скажем, что у меня есть репозиторий, на который я нажал и которым я управляю. Я хочу скопировать все эти файлы в другое хранилище под другим названием/что у вас есть. Я знаю, и теперь это актуально. Поэтому я хочу продолжить работу только над этим новым репо. Но я случайно продолжал работать над оригинальным местным. Как добавить коммиты из моего локального в новый?

В вашем новом локальном репо вы добавляете удаленную ссылку на свое старое репо, выбираете из него и выбираете нужные вам коммиты:

cd /path/to/new/local/clone
git remote add oldrepo /url/old/repo
git fetch oldrepo

Сделайте git branch -r, чтобы увидеть, где находится ваша ветка oldrepo/xxx, и git log oldrepo/xxx, чтобы проверить коммиты, вам нужно git cherry-pick.

person VonC    schedule 23.03.2017
comment
Спасибо! Ссылаясь на это: stackoverflow.com/questions/5120038/, в частности, ответ Брайана, должен ли fetch oldrepo; merge oldrepo/currentbranch автоматически получать все новые коммиты? Я не уверен, что слияние будет работать конкретно, но я сделал описанные выше шаги с первой попытки и получил сообщение типа not something we can merge, но я попробую еще раз. - person frei; 23.03.2017
comment
@frei вы не хотите объединяться: это сохранит ссылку на ветку oldrepo. Вы хотите выбирать, как я описал в stackoverflow.com/a/1994491/6309. И тогда вы можете удалить пульт oldrepo. - person VonC; 23.03.2017
comment
Я продолжаю видеть: You are currently cherry-picking commit 6fdc7cd. nothing to commit, working tree clean. The previous cherry-pick is now empty, possibly due to conflict resolution Независимо от того, какой коммит я выбираю из старой ветки. Я определенно не вижу отражения этих изменений в новой ветке, поэтому не знаю, что делать. Я не уверен, что участие Геррита также влияет на это. - person frei; 23.03.2017
comment
@frei В основном это связано с тем, что изменения уже существуют в вашей текущей ветке. Вы можете использовать git commit --allow-empty, чтобы закончить выбор вишни. - person Marina Liu; 23.03.2017
comment
@Marina-MSFT, как правило, я бы это понял, но изменения вообще не отражаются в выборе вишни. Если я закончу выбор вишни, изменения из этих коммитов на самом деле не будут записаны поверх текущих файлов. - person frei; 23.03.2017
comment
@frei Я также даю еще один вариант, проверьте, работает ли он для вас. - person Marina Liu; 23.03.2017