Git ведет себя так, как и должно быть.
Для вашей ситуации вы можете удалить файл за один коммит в другую ветку. Другие коммиты будут такими, какими они должны быть. Затем, вместо слияния other_branch
с мастером, вы можете выбрать коммиты other_branch
в главную ветку без коммита удаления.
Надеюсь, ты получил ответ.
Вы могли бы рассмотреть основа 36. в этом это может сделать буквы и числа. Рассмотрите удаление I (глаз) и O (О), от Вашего набора, таким образом, они не становятся путавшими с 1 (один) и 0 (нуль). Некоторые люди могли бы жаловаться приблизительно 2 и Z также.
Можно хотеть попробовать алгоритм хеширования CRC32. CRC32 генерирует 8 символьных строк.
Самой простой вещью, которая могла возможно работать, является счетчик, который увеличен каждый раз, когда значение требуется. Восемь (left-zero-padded) цифр дают Вам 100 миллионов возможных значений 00000000 до 99999999 (хотя Вы могли бы прервать пробелы или дефисы для удобства чтения, как в 000-000-00).
при необходимости больше чем в 100 миллионах значений Вы могли бы или увеличить длину или использовать буквы в альтернативных положениях. Используя A0A0A0A0 через Z9Z9Z9Z9 дает Вам по four-and-a-half миллиарду возможных значений (4,569,760,000) доступный. Это - тривиальный бит кода, чтобы взять длинное целое и произвести такое кодирование (модификация 10 для самой правой цифры, отделения 10 затем модификация 26 для самой правой буквы, и т.д.), Если у Вас есть память для записи, самый быстрый путь состоит в том, чтобы преобразовать в противоречии с модификацией 260 массивов и использовать каждую модификацию 260 значений в качестве индекса в массив двух символьных строк ("A0", "A1", "A2", и так далее через "A9", "B0", "B1", и т.д. через "Z9").
проблема с основой 36 (упомянутый в другом ответе) состоит в том, что не только необходимо волноваться о беспорядке читателя подобных символов (один по сравнению со Мной, обнулите по сравнению с O, два по сравнению с Z, пять по сравнению с S), но также и о комбинациях смежных букв, которые могли бы быть восприняты читателями как то, чтобы произносить неприятные или непристойные слова по буквам или сокращения.
Если Вы ищете "удобный для пользователя", Вы могли бы хотеть попытаться использовать все слова вместо того, чтобы просто делать это short/alphanumberic, таким образом, чем-то как:
words = [s.strip().lower() for s in open('/usr/share/dict/canadian-english') if "'" not in s]
mod = len(words)
def main(script, guid):
guid = hash(guid)
print "+".join(words[(guid ** e) % mod] for e in (53, 61, 71))
if __name__ == "__main__":
import sys
main(*sys.argv)
, Который производит вывод как:
oranjestad+compressing+wellspring
padlock+discommoded+blazons
pt+olenek+renews
, Который забавен. Иначе просто взятие первых 8-10 символов гуида или sha1/md5 хеша гуида является, вероятно, Вашим лучшим выбором.
8 characters - perfectly random - 36^8 = 2,821,109,907,456 combinations
10 characters - perfectly random - 36^10 = 3,656,158,440,062,976 combinations
GUID's - statistically unique* - 2^128 = 340,000,000,000,000,000,000,000,000,000,000,000,000 combinations
* GUID уникальные 100% времени? [stackoverflow]
проблема с Вашим GUID-> преобразование символов; в то время как Ваш GUID статистически уникален, путем взятия любого подмножества Вы уменьшаете случайность и увеличиваете шанс коллизий. Вы, конечно, не хотите создавать non-unqiue SKU's.
<час>Решение 1:
Создают SKU использование данных, относящихся к объектным и бизнес-правилам.
т.е. Там вероятно, чтобы быть небольшой комбинацией атрибутов, которая делает объект уникальным (естественный ключ) . Объедините элементы естественного ключа, закодируйте и сожмите их для создания SKU. Часто все, в чем Вы нуждаетесь, является полем даты и времени (т.е. CreationDate) и несколько других свойств для достижения этого. У Вас, вероятно, будет много дыр в sku создании, но sku's более относится к Вашим пользователям.
гипотетически:
Wholesaler, product name, product version, sku
Amazon, IPod Nano, 2.2, AMIPDNN22
BestBuy, Vaio, 3.2, BEVAIO32
<час> Решение 2:
метод А, который резервирует диапазон чисел, и затем продолжает выпускать их последовательно и никогда не возвращает то же число дважды. Можно все еще закончить с дырами в диапазоне. Вероятно, хотя Вы не должны генерировать достаточно sku's, чтобы иметь значение, но гарантировать, чтобы Ваши требования допускали это.
реализация должна иметь key
таблица в базе данных, которая имеет счетчик. Счетчик увеличен в транзакции. Важный момент - то, что вместо того, чтобы увеличить 1, метод в программном обеспечении захватывает блок. pseudo-c#-code следующие.
-- what the key table may look like
CREATE TABLE Keys(Name VARCHAR(10) primary key, NextID INT)
INSERT INTO Keys Values('sku',1)
// some elements of the class
public static SkuKeyGenerator
{
private static syncObject = new object();
private static int nextID = 0;
private static int maxID = 0;
private const int amountToReserve = 100;
public static int NextKey()
{
lock( syncObject )
{
if( nextID == maxID )
{
ReserveIds();
}
return nextID++;
}
}
private static void ReserveIds()
{
// pseudocode - in reality I'd do this with a stored procedure inside a transaction,
// We reserve some predefined number of keys from Keys where Name = 'sku'
// need to run the select and update in the same transaction because this isn't the only
// method that can use this table.
using( Transaction trans = new Transaction() ) // pseudocode.
{
int currentTableValue = db.Execute(trans, "SELECT NextID FROM Keys WHERE Name = 'sku'");
int newMaxID = currentTableValue + amountToReserve;
db.Execute(trans, "UPDATE Keys SET NextID = @1 WHERE Name = 'sku'", newMaxID);
trans.Commit();
nextID = currentTableValue;
maxID = newMaxID;
}
}
идея здесь состоит в том, что Вы резервируете достаточно ключей так, чтобы Ваш код часто не шел база данных, поскольку получение диапазона ключей является дорогой операцией. У Вас должна быть хорошая идея количества ключей, которые необходимо зарезервировать для балансировки ключевой потери (перезапуск приложения) по сравнению с исчерпывающими ключами слишком быстро и возвращением к базе данных. Эта простая реализация не имеет никакого способа снова использовать потерянные ключи.
, поскольку эта реализация полагается база данных и транзакции, у Вас могут быть приложения, работающие одновременно и все генерируют уникальные ключи, не будучи должен часто переходить к базе данных.
вышеупомянутое Примечания свободно основано key table
, страница 222 от Шаблоны Архитектуры приложений для предприятия (Fowler) . Метод обычно используется для генерации первичных ключей без потребности столбца идентификационных данных базы данных, но Вы видите, как это может быть адаптировано к Вашей цели.