2014-12-02 3 views
4

У меня есть git repo, созданный с помощью опции --serparate-git-dir. Я часто использую ту же репо, что и другие рабочие деревья, указав в качестве аргументов --git-dir и --work-tree.Переменные окружения в .git/config

У меня есть два рабочих дерева. Я переключаюсь между часто, поэтому я добавил файл .git во вторичное дерево работы, указывающее на каталог репозитория. Однако, поскольку файл config репозитория указывает на основное рабочее дерево, я все же должен указать его явно, иначе он использует основное рабочее дерево.

Я попытался установить значение worktree для $PWD ИНТ файла .git/config, но это вызывает следующее сообщение об ошибке: fatal: Could not chdir to '$PWD': No such file or directory

Есть ли способ сделать worktree динамический?

ответ

1

EDIT 05-2016 Как @amynbe комментарии, мерзавец> = 2,5 имеет мерзавец-worktree https://git-scm.com/docs/git-worktree


У меня есть сценарий, который кто-то на Freenode прошел вокруг, я не уверен, что из автор, но я знаю, что могу поделиться, он используется для создания различных рабочих copyes, основанные на ветках, я думаю, что это может соответствовать вашему использования:

#!/bin/sh 

usage() { 
     echo "usage:" [email protected] 
     exit 127 
} 

die() { 
     echo [email protected] 
     exit 128 
} 

if test $# -lt 2 || test $# -gt 3 
then 
     usage "$0 <repository> <new_workdir> [<branch>]" 
fi 

orig_git=$1 
new_workdir=$2 
branch=$3 

# want to make sure that what is pointed to has a .git directory ... 
git_dir=$(cd "$orig_git" 2>/dev/null && 
    git rev-parse --git-dir 2>/dev/null) || 
    die "Not a git repository: \"$orig_git\"" 

case "$git_dir" in 
.git) 
     git_dir="$orig_git/.git" 
     ;; 
.) 
     git_dir=$orig_git 
     ;; 
esac 

# don't link to a configured bare repository 
isbare=$(git --git-dir="$git_dir" config --bool --get core.bare) 
if test ztrue = z$isbare 
then 
     die "\"$git_dir\" has core.bare set to true," \ 
       " remove from \"$git_dir/config\" to use $0" 
fi 

# don't link to a workdir 
if test -h "$git_dir/config" 
then 
     die "\"$orig_git\" is a working directory only, please specify" \ 
       "a complete repository." 
fi 

# don't recreate a workdir over an existing repository 
if test -e "$new_workdir" 
then 
     die "destination directory '$new_workdir' already exists." 
fi 

# make sure the links use full paths 
git_dir=$(cd "$git_dir"; pwd) 

# create the workdir 
mkdir -p "$new_workdir/.git" || die "unable to create \"$new_workdir\"!" 

# create the links to the original repo. explicitly exclude index, HEAD and 
# logs/HEAD from the list since they are purely related to the current working 
# directory, and should not be shared. 
for x in config refs logs/refs objects info hooks packed-refs remotes rr-cache svn 
do 
     case $x in 
     */*) 
       mkdir -p "$(dirname "$new_workdir/.git/$x")" 
       ;; 
     esac 
     ln -s "$git_dir/$x" "$new_workdir/.git/$x" 
done 

# now setup the workdir 
cd "$new_workdir" 
# copy the HEAD from the original repository as a default branch 
cp "$git_dir/HEAD" .git/HEAD 
# checkout the branch (either the same as HEAD from the original repository, or 
# the one that was asked for) 
git checkout -f $branch 
+0

Итак, я понял, что в этом файле 'config' нет возможности использовать переменную окружения? Я определенно дам этому сценарию попробовать, надеюсь, он хорошо работает под Git для windows – Anthony

+0

из того, что я знаю, нет, вы не можете установить env var в файле конфигурации, учитывая, что он имеет абсолютный путь относительно вашего рабочего каталога , это опубликовано еще одно жизнеспособное решение, я надеюсь, что он удовлетворит ваши потребности в любом случае! – DRC

+0

Заменена команда git-worktree, добавленная в Git 2.5. См. Http://nuclearsquid.com/writings/git-new-workdir/ – amynbe

1

у меня была аналогичная проблема в том, что я хотел сделать мой ~/.gitconfig, переносимый через платформы, чтобы я мог использовать тот же gitconfig на моем Macbook и в моей Linux VM. Мне нужно было credential.helper быть различным в зависимости от платформы.

В итоге я написал небольшой скрипт generate_gitconfig и добавил его в мой bashrc, чтобы ~/.gitconfig был сгенерирован автоматически после запуска каждого сеанса оболочки.

Написания gitconfig через скрипт дает большую гибкость в том, что вы можете установить значение динамически в зависимости от переменной среды, установлены ли определенные команды, имя хост машины и т.д.

Вот мой generate_gitconfig сценария, в качестве примера:

#!/bin/bash 

cat <<EOF > $HOME/.gitconfig 
# This gitconfig was generated via ~/.bin/generate_gitconfig. 
# Edit that file, not this one! 

[user] 
    name = Dave Yarwood 
    email = [email protected] 
[push] 
    default = simple 
[core] 
    autocrlf = input 
    editor = nvim 
    excludesfile = $HOME/.gitignore_global 
[rerere] 
    enabled = true 
EOF 

if [[ "$(uname)" == Darwin ]]; then 
    CREDENTIAL_HELPER="osxkeychain" 
elif [[ -n "$(which gnome-keyring-daemon)" ]]; then 
    CREDENTIAL_HELPER="/usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring" 
fi 

if [[ -n "$CREDENTIAL_HELPER" ]]; then 
    cat <<EOF >> $HOME/.gitconfig 
[credential] 
    helper = $CREDENTIAL_HELPER 
EOF 
fi 
Смежные вопросы