Удаление ненужных файлов с помощью git rm
приведет к удалению этих файлов из дерева файлов в коммите, в котором вы их удалили, но это не приведет к уменьшению репозитория Git, поскольку Git хранит историю всех старых коммитов, все еще находящихся в коммите. хранилище и, следовательно, все файлы, которые они содержат.
Я не хочу вдаваться в то, как переписать историю, чтобы удалить эти большие файлы - это подробно обсуждается здесь: Как удалить / удалить большой файл из истории коммитов в репозитории Git? , но если вы только начали использовать Git для этого проекта, проще всего начать с нового репо.
Action doThatThing = someMethod;
if (condition)
{
lock(thatThing)
{
doThatThing();
}
}
else
{
doThatThing();
}
Я думаю, что вопрос кричит "состояние состязания!". Что, если повороты условия от истинного до лжи вскоре после проверки, но прежде чем поток вводит критический раздел кода? Или в то время как поток находится в процессе выполнения его?
Я не эксперт по поточной обработке, но это кажется, что Вы могли бы искать что-то вроде этого (перепроверяемая блокировка). Идея состоит в том, чтобы проверить условие и прежде и после получения блокировки.
private static object lockHolder = new object();
if (ActionIsValid()) {
lock(lockHolder) {
if (ActionIsValid()) {
DoSomething();
}
}
}
bool locked = false;
if (condition) {
Monitor.Enter(lockObject);
locked = true;
}
try {
// possibly critical section
}
finally {
if (locked) Monitor.Exit(lockObject);
}
Править: да, существует состояние состязания, если Вы не можете гарантировать, что условие является постоянным, в то время как потоки входят.
На самом деле, для предотвращения состояния состязания я испытал бы желание использовать a ReaderWriterLockSlim
здесь - рассматривают параллельный доступ как блокировку чтения и эксклюзивный доступ как блокировка записи. Тот путь, если изменение условий Вы не закончите с некоторым несоответствующим кодом, все еще выполняющимся вслепую в регионе (под ложным предположением, что это безопасно); немного подробный, но (отформатированный для пространства):
if (someCondition) {
lockObj.EnterReadLock();
try { Foo(); }
finally { lockObj.ExitReadLock(); }
} else {
lockObj.EnterWriteLock();
try { Foo(); }
finally { lockObj.ExitWriteLock(); }
}
Используйте Перепроверяемый шаблон блокировки, как предложено выше. это - прием IMO :)
удостоверьтесь, что у Вас есть свой объект блокирования как помехи, как перечислено в примере not.that.dave.foley.myopenid.com.
Я предполагаю, что у Вас есть некоторый код, который немного походит на это:
private Monkey GetScaryMonkey(int numberOfHeads){
Monkey ape = null;
lock(this) {
ape = new Monkey();
ape.AddHeads(numberOfHeads);
}
return ape;
}
Сделать это условное выражение не могло Вы просто сделать это:
private Monkey GetScaryMonkey(int numberOfHeads){
if ( numberOfHeads > 1 ) {
lock(this) {
return CreateNewMonkey( numberOfHeads );
}
}
return CreateNewMonkey( numberOfHeads );
}
Должен работать, нет?