На примере @kynan в качестве основы я создал этот скрипт и поместил его в свой путь (~/bin/
) как gg
. Он использует git grep
, но избегает некоторых указанных типов файлов.
В нашем репо много изображений, поэтому я исключил файлы изображений, и это сокращает время поиска до 1/3, если я ищу весь репо. Но скрипт может быть легко изменен, чтобы исключить другие типы файлов или geleralpatterns.
#!/bin/bash
#
# Wrapper of git-grep that excludes certain filetypes.
# NOTE: The filetypes to exclude is hardcoded for my specific needs.
#
# The basic setup of this script is from here:
# https://stackoverflow.com/a/14226610/42580
# But there is issues with giving extra path information to the script
# therefor I crafted the while-thing that moves path-parts to the other side
# of the '--'.
# Declare the filetypes to ignore here
EXCLUDES="png xcf jpg jpeg pdf ps"
# Rebuild the list of fileendings to a good regexp
EXCLUDES=`echo $EXCLUDES | sed -e 's/ /\\\|/g' -e 's/.*/\\\.\\\(\0\\\)/'`
# Store the stuff that is moved from the arguments.
moved=
# If git-grep returns this "fatal..." then move the last element of the
# arg-list to the list of files to search.
err="fatal: bad flag '--' used after filename"
while [ "$err" = "fatal: bad flag '--' used after filename" ]; do
{
err=$(git grep "$@" -- `git ls-files $moved | grep -iv "$EXCLUDES"` \
2>&1 1>&3-)
} 3>&1
# The rest of the code in this loop is here to move the last argument in
# the arglist to a separate list $moved. I had issues with whitespace in
# the search-string, so this is loosely based on:
# http://www.linuxjournal.com/content/bash-preserving-whitespace-using-set-and-eval
x=1
items=
for i in "$@"; do
if [ $x -lt $# ]; then
items="$items \"$i\""
else
moved="$i $moved"
fi
x=$(($x+1))
done
eval set -- $items
done
# Show the error if there was any
echo $err
Примечание 1
В соответствии с этим должна быть возможность назвать вещь git-gg
и иметь возможность называть ее как обычный git команда вроде:
$ git gg searchstring
Но я не могу заставить это работать. Я создал скрипт в своем ~/bin/
и сделал символическую ссылку git-gg
в /usr/lib/git-core/
.
Примечание 2
Команду нельзя превратить в обычный sh
псевдоним псевдонима, поскольку она будет вызываться в корне репо. И это не то, чего я хочу!
Некоторые примечания:
Администратор баз данных скажет вам, что первичный ключ в данном случае это фактически комбинация двух столбцов FK. Поскольку Rails / ActiveRecord плохо работает с составными PK (по крайней мере, по умолчанию), это может быть причиной.
Комбинация внешних ключей может быть первичным ключом (называемым составным первичным ключом). Лично я предпочитаю использовать технический первичный ключ вместо этого (поле автоматического номера, последовательность и т. Д.). Зачем? Что ж, это упрощает идентификацию записи, что вам может потребоваться, если вы собираетесь ее удалить.
Подумайте об этом: если вы собираетесь представить веб-страницу с все связи,
Плохая идея - не иметь первичного ключа в какой-либо таблице, точка (если СУБД является реляционной СУБД или СУБД SQL). Первичные ключи - важная часть целостности вашей базы данных.
Я полагаю, если вы не возражаете против того, чтобы ваша база данных была неточной и время от времени давала неверные ответы, тогда вы могли бы обойтись без ... но большинство людей хотят точных ответов от их СУБД и для таких людей первичные ключи имеют решающее значение.
В основном потому, что в этом нет необходимости. Комбинация двух полей внешнего ключа однозначно идентифицирует любую строку.
Но это просто говорит о том, почему это не хорошая идея ... но почему это может быть плохая идея?
Подумайте о накладных расходах, добавляемых при добавлении столбца идентификации. Таблица займет на 50% больше дискового пространства. Хуже обстоит дело с индексом. С полем идентификатора вы должны поддерживать счетчик идентификаторов плюс второй индекс. Вы утроите дисковое пространство и утроите объем работы, который необходимо выполнять с каждой вставкой. Единственное преимущество - это немного более короткое предложение WHERE в команде DELETE.
С другой стороны, если составные ключевые поля представляют собой всю таблицу, то индекс может быть таблицей.
Размещение самого селективного столбца первым должно быть актуально только в объявлении INDEX. В объявлении KEY это не должно иметь значения (потому что, как было правильно указано, KEY - это SET, а внутри набора порядок не имеет значения - набор {a1, a2} совпадает с набором {a2 , a1}).
Если продукт СУБД таков, что упорядочение атрибутов внутри объявления KEY имеет значение, то этот продукт СУБД виновен в том, что не различает должным образом логическую структуру базы данных (часть, в которой вы выполняете KEY) и физический дизайн базы данных (часть, где вы делаете объявление INDEX).
Плюсы наличия одного ПК
Недостатки использования одного PK
Примечания
Я хотел прокомментировать следующий комментарий: «Неправильно скажите ноль или более ».
Я хотел отметить, что текст, к которому был добавлен этот комментарий, просто не содержал текста« ноль или более », поэтому автор комментария, который я хотел прокомментировать, критиковал кого-то еще за кое-что, чего не было сказано.
Я также хотел прокомментировать, что неправильно говорить «ноль или больше». Теория отношений, широко известная сегодня среди тех немногих, кто все еще пытается изучить детали этой теории, на самом деле ТРЕБУЕТ возможности ключа без атрибутов.