6

У меня есть папка now еще экспортированный из репозитория Git, и сам репозиторий:

/
/now/
/repository.git/

Я хотел бы сравнить файлы now с текущим состоянием хранилища. Хотя это легко сделать с помощью --git-dir=/repository.git и --work-tree=/now ,

git --git-dir=/repository.git --work-tree=/now status

для меня это не так очевидно, когда now была подпапка материала в репозитории git.

Есть ли способ - помимо повторной проверки хранилища и diff материала - заставить git каким-то образом сравнить папку и соответствующую подпапку в хранилище? (Я знаю, что git не сконцентрирован на идее изменений в отдельных файлах, поэтому я на самом деле ожидаю хорошо информированное нет.)

2 ответа2

2

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

diff-sub() { : usage: diff-sub repo treeish-in-repo external-dir
  (
    GIT_DIR="$1" GIT_WORK_TREE="$3"
    GIT_INDEX_FILE=/tmp/.git-index--now-sub.tmp
    if test -e "$GIT_INDEX_FILE"; then
      echo "already exists: $GIT_INDEX_FILE"
      exit 1
    fi
    export GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE
    git read-tree "$2" &&
    git diff
    ec=$?
    rm -f "$GIT_INDEX_FILE"
    exit "$ec"
  )
}
: diff sub from master in /repository.git against /now
diff-sub /repository.git master:sub /now

Примечание. Если вы запустите другие команды Git, которые сравниваются с обычным полным деревом (например, git status или git diff --cached вместо git diff), вы увидите странные результаты, так как и индекс, и рабочее дерево содержат только часть нормального, полного дерева.

2

Вы можете воссоздать структуру каталогов, ведущую к подпапке, и воспользоваться опцией --relative для таких команд, как diff и log (но не для status). Например, если у вас есть проверка sub/dir:

mkdir -p sub
mv now sub/dir
git --git-dir=/repository.git diff --relative=sub/dir

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .