Git, как удалить некоторые игнорируемые файлы при смене ветки - PullRequest
0 голосов
/ 04 января 2019

У меня есть проект с двумя версиями моего кода, одна «техническая поддержка» и одна «новая» для более новой версии.

Я хотел игнорировать все файлы * .min.js в моем коде в этих ветвях. Некоторые файлы .js находятся в «новом», но не в «обслуживании». Eclipse генерирует .min.js каждый раз, когда редактируется файл .js.

Проблема в том, что, когда я нахожусь на ветке "new" и переключаюсь на "техобслуживание" ветви, минимизированные js, сгенерированные в новом и не имеющие своих файлов .js на техобслуживании, все еще там.

Есть ли способ сообщить git об удалении этих файлов при переходе на обслуживание?

Я бы хотел определить стратегию слияния в gitattributes вместо игнорирования файлов .min.js, но Eclipse не обрабатывает gitattriutes.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Весь смысл неотслеживаемого файла в том, что Git ничего о нем не знает. Git поэтому не может знать удалить это либо.

Git предоставляет общий механизм, позволяющий вам запускать свои собственные операции после каждого git checkout, а именно то, что он называет ловушкой после проверки . (Соблюдает ли ваша Eclipse IDE этот же протокол, я понятия не имею.) Хук после проверки - это просто любой исполняемый файл 1 с именем .git/hooks/post-checkout. Git запустит его с некоторыми аргументами, как описано в документации githooks , после каждого git checkout.

Поскольку git checkout можно использовать для операций, которые не изменяют имя ветви, к которой прикреплен HEAD , вам необходимо будет проверить, какие условия вы считаете подходящими , Например, вы можете проверить третий параметр, который называется flag в документации. Если он установлен, команда была операцией, которая изменила имя коммита или ветки, к которому привязано HEAD. Если HEAD теперь связан с коммитом или веткой, в которой некоторые *.min.js файлы должны быть удалены, если они существуют, теперь вы можете удалить их, если они существуют. Если HEAD теперь привязан к коммиту или ветви, в которой должны быть созданы некоторые файлы *.min.js, если они не существуют, теперь вы можете создать их, если они не существуют.

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

#! /bin/sh
# Post-checkout hook to deal with `*.min.js` files.

# If flag is not 1, do nothing (and succeed).
if [ "$3" != 1 ]; then exit 0; fi

# Otherwise, determine whether there are *.min.js files that need to
# be created and/or removed.  The code below is meant to be illustrative,
# not efficient.

for file in $(compute files that should be removed); do rm -f "$file"; done
for file in $(compute files that should be created); do create_minified "$file"; done

exit 0 # always report success, regardless of actual success

Эта последняя строка важна: в документации Git утверждается, что хук после проверки не может повлиять на результат git checkout, но на самом деле статус выхода из хука после проверки устанавливает статус выхода самой git checkout. , Если ваша ловушка после оформления заказа сообщает о состоянии отказа, git checkout сообщит о состоянии отказа, что может ввести в заблуждение более крупные автоматизированные системы. Это может быть хорошо или плохо, в зависимости от вашей точки зрения, поэтому, хотя последняя строка важна , она не обязательно правильна для вашего конкретного приложения.


1 исполняемый файл , здесь должен быть фактически исполняемым . То есть ему нужно не только установить бит x (в Unix-подобной системе используйте chmod +x или chmod 755 или аналогичный для установки исполняемых битов), он должен быть непосредственно исполняемым через execve системный вызов . Для сценариев в Unix-подобных системах это означает, что сценарий должен начинаться со строки, такой как #! /bin/sh или #! /usr/bin/env bash, где имя пути после #! - это имя пути интерпретатора. Сценарии Python могут быть сделаны исполняемыми через #! /usr/bin/env python или #! /usr/bin/env python3.6 или тому подобное, в зависимости от того, какой интерпретатор Python вам нужно вызывать.

0 голосов
/ 04 января 2019

После переключения на ветку new вы можете выполнить следующую команду, чтобы рабочее дерево соответствовало состоянию HEAD.

git reset --hard && git clean -dfx
...