Как выполнить поиск (поиск) зафиксированного кода в истории Git?

Чтобы оживить переход между фрагментами или оживить процесс показа или скрыть фрагмент, вы используете Fragment Manager для создания Fragment Transaction.

. В каждой транзакции фрагмента вы можете указать и которые будут использоваться для показа и скрытия соответственно (или оба, когда используется замена).

Следующий код показывает, как вы заменили бы фрагмент, скользя один фрагмент и скользящий другой в своем месте.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

Чтобы добиться того же самого, скрывая или отображая фрагмент, который вы просто назовете ft.show или ft.hide, передав фрагмент, который вы хотите показать или скрыть соответственно.

Для справки определения XML-анимации будут использовать тег objectAnimator. Пример slide_in_left может выглядеть примерно так:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>
1284
задан Peter Mortensen 24 June 2019 в 16:11
поделиться

4 ответа

Для поиска содержимого фиксации (т. Е., фактические строки исходного кода, в отличие от сообщений фиксации и т.п.), вам необходимо выполнить:

git grep <regexp> $(git rev-list --all)

git rev-list --all | xargs git grep будет работать, если вы столкнетесь с ошибкой «Список аргументов слишком длинный».

Если вы хотите ограничить поиск каким-либо поддеревом (например, «lib / util»), вам нужно будет передать это в подкоманду rev-list и grep а также:

git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

Это приведет к просмотру всего вашего текста коммита для regexp .

Причина передачи пути в обеих командах заключается в том, что rev-list вернет список ревизий, в котором произошли все изменения в lib / util , но вам также необходимо передать в grep , чтобы он выполнял поиск только в lib / util .

Только представьте себе следующий сценарий: grep может найти такой же в других файлах, содержащихся в той же ревизии, возвращенной rev-list (даже если в этой ревизии не было изменений в этом файле).

Вот еще несколько полезных способов поиска в источнике:

Поиск в рабочем дереве текста, соответствующего регулярному выражению regexp:

git grep <regexp>

Поиск в рабочем дереве строк текста, соответствующих регулярному выражению regexp1 или regexp2:

git grep -e <regexp1> [--or] -e <regexp2>

Поиск в рабочем дереве для строк текста, соответствующих регулярному выражению regexp1 и regexp2, только пути к файлам отчетов:

git grep -e <regexp1> --and -e <regexp2>

Поиск в рабочем дереве файлов, в которых есть строки текста, соответствующие регулярному выражению regexp1, и строки текста, соответствующие регулярному выражению regexp2:

git grep -l --all-match -e <regexp1> -e <regexp2>

Поиск в рабочем дереве изменений строки шаблона соответствия текста:

git diff --unified=0 | grep <pattern>

Искать во всех ревизиях текст, соответствующий регулярному выражению regexp:

git grep <regexp> $(git rev-list --all)

Искать во всех ревизиях между rev1 и rev2 текст, соответствующий регулярному выражению regexp:

git grep <regexp> $(git rev-list <rev1>..<rev2>)
1783
ответ дан 19 December 2019 в 20:15
поделиться

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

git log -S "<words/phrases i am trying to find>" --all --oneline  --graph 

Объяснение:

  1. git log - Потребность я пишу больше здесь, она показывает журналы в хронологическом порядке.
  2. -S "<words/phrases i am trying to find>" - Это показывает все те фиксации мерзавца, где любой (добавленный/измененный/удаленный) файл имеет слова/фразы, я пытаюсь найти без '<>' символы.
  3. --all - Чтобы осуществить и искать через все ответвления.
  4. --oneline - Это сжимается, мерзавец входят в систему одна строка.
  5. --graph - Это создает график хронологически заказанных фиксаций.
0
ответ дан 19 December 2019 в 20:15
поделиться

Вы должны использовать pickaxe (-S) опцию git log

Для поиска Foo:

git log -SFoo -- path_containing_change 
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change

См. подробнее Git history - find lost line by keyword.


Как Якуб Наренбски прокомментировал:

  • это ищет различия, которые вводят или удаляют экземпляр <строки>.
    Обычно это означает "ревизии, в которых добавлена или удалена строка с 'Foo'".

  • Опция --pickaxe-regex позволяет вам использовать расширенный POSIX regex вместо поиска строки.


Как заметил Rob, этот поиск чувствителен к регистру - он открыл последующий вопрос о том, как искать без учета регистра.

507
ответ дан 19 December 2019 в 20:15
поделиться

Значит, вы пытаетесь просмотреть старые версии кода с помощью grep, чтобы узнать, где что-то было в последний раз?

Если бы я делал это, я бы, вероятно, использовал git bisect . Используя bisect, вы можете указать заведомо хорошую версию, заведомо плохую версию и простой скрипт, который проверяет, является ли версия хорошей или плохой (в этом случае grep, чтобы увидеть, присутствует ли код, который вы ищете ). Запустив это, вы обнаружите, когда код был удален.

1
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: