Для синхронизации потоков рекомендуется использовать один из классов EventWaitHandle
, например ManualResetEvent
. Хотя немного проще использовать простой логический флаг, как вы здесь (и да, вы хотели бы отметить его как volatile
), IMO лучше освоиться с использованием инструментов потоковой обработки. Для ваших целей вы бы сделали что-то вроде этого ...
private System.Threading.ManualResetEvent threadStop;
void StartThread()
{
// do your setup
// instantiate it unset
threadStop = new System.Threading.ManualResetEvent(false);
// start the thread
}
В вашей теме ..
while(!threadStop.WaitOne(0) && !operationComplete)
{
// work
}
Затем в GUI для отмены ...
threadStop.Set();
не используйте этот рецепт, если Ваша ситуация не является той, описанной в вопросе. Этот рецепт для фиксации плохого слияния и воспроизведения Ваших хороших фиксаций на фиксированное слияние.
, Хотя filter-branch
сделает то, что Вы хотите, это - вполне сложная команда, и я, вероятно, принял бы решение сделать это с git rebase
. Это - вероятно, персональное предпочтение. filter-branch
может сделать это в единственной, немного более сложной команде, тогда как rebase
решение выполняет эквивалентные логические операции один шаг за один раз.
Попытка следующий рецепт:
# create and check out a temporary branch at the location of the bad merge
git checkout -b tmpfix <sha1-of-merge>
# remove the incorrectly added file
git rm somefile.orig
# commit the amended merge
git commit --amend
# go back to the master branch
git checkout master
# replant the master branch onto the corrected merge
git rebase tmpfix
# delete the temporary branch
git branch -d tmpfix
(Отмечают, что Вам на самом деле не нужно временное ответвление, можно сделать это с 'отдельной ГОЛОВОЙ', но необходимо обратить внимание на идентификатор фиксации, сгенерированный эти git commit --amend
шаг для предоставления к эти git rebase
команда вместо того, чтобы использовать временное имя ответвления.)
Это - то, для чего git filter-branch
был разработан.
Если Вы ничего не фиксировали с тех пор, всего git rm
файл и git commit --amend
.
, Если Вы имеете
git filter-branch \
--index-filter 'git rm --cached --ignore-unmatch path/to/file/filename.orig' merge-point..HEAD
, пройдет каждое изменение от merge-point
до HEAD
, удалит filename.orig и перепишет изменение. Используя --ignore-unmatch
означает, что команда не перестанет работать, если по некоторым причинам filename.orig будет отсутствовать в изменении. Это - рекомендуемый путь от раздела Examples в страница справочника .
ответвления фильтра мерзавца Примечание для пользователей Windows: путь к файлу должен наклонные черты вправо использования
Вы также можете использовать:
git reset HEAD файл / путь
Это лучший способ:
http://github.com/guides/completely-remove-a-file-from-all-revisions
Просто не забудьте сначала сделать резервную копию файлов.
EDIT
Правка Neon была, к сожалению, отклонена во время просмотра.
См. ниже сообщение Neons, оно может содержать полезную информацию!
Например, удалить все *.gz
файлы, случайно попавшие в git-репозиторий:
$ du -sh .git ==> e.g. 100M
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.gz' HEAD
$ git push origin master --force
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ git gc --aggressive --prune=now
Это всё равно не сработало? (В настоящее время я нахожусь на git-версии 1.7.6.1)
$ du -sh .git ==> e.g. 100M
Не знаю почему, так как у меня была только ОДНА мастер-ветка. В любом случае, в конце концов, я действительно очистил git-репозиторий, переместив его в новый пустой и пустой git-репозиторий, например,
$ git init --bare /path/to/newcleanrepo.git
$ git push /path/to/newcleanrepo.git master
$ du -sh /path/to/newcleanrepo.git ==> e.g. 5M
(да!)
Затем я клонировал его в новый каталог и переместил его в этот каталог через .git-папку. например,
$ mv .git ../large_dot_git
$ git clone /path/to/newcleanrepo.git ../tmpdir
$ mv ../tmpdir/.git .
$ du -sh .git ==> e.g. 5M
(да! наконец-то очистили!)
После проверки, что всё в порядке, можно удалить каталоги .../large_dot_git
и .../tmpdir
(может быть, через пару недель или месяцев, на всякий случай...)