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.

Author: Community, 2015-04-11

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.

 22
Author: Palec,
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
 1
Author: Jeremy John,
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