Git excludesfile dla gałęzi
Chcę ignorować pewne pliki w gałęzi bez konieczności polegania na śledzonym pliku .gitignore
, który zostanie nadpisany podczas łączenia z innymi gałęziami.
Uważnie śledziłem odpowiedź przepełnienia stosu wraz z połączonym postem na blogu, Ale mój repo nie zdaje się rozpoznawać określonego excludesfile
w moim .git/config
. Dokumentacja Git(git-config
, gitignore
) wydaje się, że nie pokazuje, jak określić i adresować plik wykluczający dla określonego branch.
Mój .git/config
wygląda tak:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
excludesfile = +/info/exclude
[branch "myspecialbranch"]
excludesfile = +/info/exclude_specialbranch
Mój plik .git/info/exclude
wygląda tak (domyślnie nie dotykałem):
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.DS_Store
Nie mam pliku .gitignore
w moim "specialbranch".
Jeśli próbuję zignorować plik taki jak info.php
, mój plik .git/info/exclude_specialbranch
wygląda tak:
info.php
... ale nie ignoruje pliku.
Jeśli uruchamiam git status --ignored
, wyświetla tylko plik .DS_Store
z domyślnego pliku exclude
.
Jednak jeśli dodam info.php
do mojego .git/info/exclude
plik:
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
.DS_Store
info.php
Doskonale ignoruje plik.
Zauważ, że nadal działa bez linii excludesfile = +/info/exclude
Pod [core]
w .git/config
. Git zdaje się wiedzieć, gdzie jest systemowy exclude
bez mojej wiedzy.
Mam wrażenie, że .git/config
nie rozpoznaje adresu mojego zwyczaju:
excludesfile = +/info/exclude_specialbranch
... najprawdopodobniej z powodu użycia +
do opisania lokalizacji .git
katalogu.
Jaka jest prawidłowa metoda adresowania niestandardowego wyklucz pliki w (nowszych) wersjach Git?
Używam OSX 10.9.5 i Git w wersji 2.2.1.
2 answers
Git nie obsługuje per-branch excludes files
Próbujesz osiągnąć coś, czego Git nie obsługuje. post na blogu jest oryginalnym źródłem tej mistyfikacji, że odpowiedź na przepełnienie stosu jest tylko parrotowana. Jak zauważono w komentarzach pod tą odpowiedzią, nawet oryginalny wpis na blogu zawiera dyskusję, która pokazuje, że rozwiązanie nie działa i łączy się z nowszym postem na blogu, który wspomina, że nawet autor nie jest w stanie odtworzyć zachowanie.
Dlaczego to nie działa? Jeśli czytasz man gitignore
oraz man git-config
, znajdziesz tylko core.excludesfile
Nie tam. core.excludesfile
ma na celu umożliwienie wykluczenia np. Vima .pliki swp lub inne tymczasowe rzeczy używane przez oprogramowanie.
core.excludesfile
Oprócz
.gitignore
(per-directory) i.git/info/exclude
, Git sprawdza ten plik w poszukiwaniu wzorców plików, które nie mają być śledzone. "~/
"jest rozszerzona do wartości$HOME
i"~user/
" do katalog domowy określonego użytkownika. Jego domyślną wartością jest$XDG_CONFIG_HOME/git/ignore
. Jeśli$XDG_CONFIG_HOME
nie jest ustawione lub puste, zamiast tego używane jest$HOME/.config/git/ignore
. Zobacz gitignore(5) .
Obejście pracy
Uważam, że najlepsze przybliżenie pliku wykluczającego dla każdej gałęzi jest osiągane przy użyciuHooka po kasie i realizacji .gitignore
za pomocą dowiązania symbolicznego.
Każda gałąź będzie miała np. katalog .gitignores
z plikami nazwanymi po odpowiednich gałęziach. Wtedy byłoby .gitignores/__default
plik, który będzie używany domyślnie. Plik .gitignore
zostanie wykluczony przez wszystkie pliki excludes i zostanie utworzony przez hook po kasie jako dowiązanie symboliczne do odpowiedniego pliku w .gitignores
.
Jeśli nie chcesz śledzić plików wykluczeń, możesz zrobić to samo z plikiem .git/info/exclude
jako dowiązaniem symbolicznym do .git/info/excludes/__default
itd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:55
Oto skrypt, który napisałem, aby to zrobić:
#!/bin/bash
# This is designed to allow per-branch un-ignoring of certain files.
# Use case: Compiled CSS files on master to push to server.
# A special .gitignore file will be present on master at
# {$gitignorePath}/{$disabledMasterGitignoreName} and that file should
# enable the css files using the ! flag. @https://git-scm.com/docs/gitignore
# When the branch specified by script parameters
# is checked out, {$gitignorePath}/{$disabledMasterGitignoreName} is
# copied to .gitignore.
# On other branches this gitignore file is named $disabledMasterGitignoreName, versioned,
# and {$gitignorePath}.gitignore will be deleted. Note, you must ignore
# {$gitignorePath}.gitignore from your main .gitignore file
#
# To enable put this file in your path and call this script
# in .git/hooks/post-checkout with pass a list of single-space-separated branches that
# will enable the branch-specific .gitignore.
# One caveat is that you can only merge into the branch containing the .gitignore
# file. Otherwise you'll end up re-committing the files. This is fine if you are
# using gitflow and `master` contains your special .gitigore using the ! syntax
# that is un-ignoring files.
#
# Background: @http://stackoverflow.com/questions/29579546/git-excludesfile-for-a-branch
set -e
gitignorePath='docroot/sites/all/themes'
disabledMasterGitignoreName='.gitignore_master--disabled'
#branchWithGitignoreEnabled='master'
branch=$(git rev-parse --abbrev-ref HEAD)
gitignoreRoot="$(git rev-parse --show-toplevel)/${gitignorePath}"
if [ -f "${gitignorePath}/.gitignore" ]
then
masterGitignoreExists=true
fi
if [ -f "${gitignorePath}/${disabledMasterGitignoreName}" ]
then
disabledMasterGitignoreExists=true
fi
IFS=' ' read -a params <<< "$@"
if [[ " ${params[@]} " =~ " ${branch} " ]]
then
if [ $disabledMasterGitignoreExists ]
then
cp -f "${gitignoreRoot}/${disabledMasterGitignoreName}" "${gitignoreRoot}/.gitignore"
echo "Enabled ${gitignorePath}/.gitignore"
fi
elif [ $masterGitignoreExists ]
then
rm -f "${gitignorePath}/.gitignore"
if [ masterGitignoreExists ]
then
echo "Disabled ${gitignorePath}/.gitignore"
fi
fi
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-08 23:03:09