Github - найти, когда каталог удален [дубликат]

Если вы хотите использовать решение ggplot2, вы можете сделать это, если можете сформировать свои данные в этом формате (см. пример ниже)

# dummy data
set.seed(45)
df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45), 
                   variable=rep(paste0("category", 1:9), each=5))
# plot
ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable))

ggplot2_geom_line [/g0]

8
задан Kakawait 8 September 2015 в 15:05
поделиться

2 ответа

Предполагая структуру древовидной выборки в вашем репозитории как:

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   a/b/c/d/e/q.txt
    new file:   a/b/c/m.txt
    new file:   a/b/c/n.txt
    new file:   a/b/f/o.txt
    new file:   a/b/f/p.txt
    new file:   a/b/k.txt
    new file:   a/b/z.txt
    new file:   a/x.txt
    new file:   a/y.txt

Давайте сделаем следующие коммиты:

commit 0bb4d4d50072c1eac1c3cb2b14b670deba8ee31b
Author: Site User <user@site.com>
Date:   Tue Sep 8 19:27:58 2015 +0100

    removed a/b/c/d/e/q.txt

D       a/b/c/d/e/q.txt

-

commit 3b53f16eb2fd7d3d605180ccabcfa71eb9e9225a
Author: Site User <user@site.com>
Date:   Tue Sep 8 19:28:55 2015 +0100

    removed a/b/c/m.txt and a/b/c/n.txt (full a/b/c)

D       a/b/c/m.txt
D       a/b/c/n.txt

-

commit 3af8ace473944996fb8b21135106360305e8b89a
Author: Site User <user@site.com>
Date:   Tue Sep 8 19:30:30 2015 +0100

    added a/b/g/w.txt

A       a/b/g/w.txt

-

Commit 3b53f16eb2fd7d3d605180ccabcfa71eb9e9225a - это тот, который видит, что папка «a / b / c» исчезает, поскольку последний файл в ней удален.

Чтобы найти SHA # фиксации, когда папка a / b / c была удалена, вы можете найти последнюю фиксацию, включающую папку «a / b / c», используя комбинацию из:

#> git log --name-status -- a/b/c 

и

#> git ls-tree -r [commit] -- a/b/c

Что-то вроде:

for cmt in $(git log --pretty=%H -- a/b/c); \
    do X=$(git ls-tree -r "${cmt}" -- a/b/c); \
    [[ -z "${X}" ]] && echo "The folder a/b/c has been deleted in commit: ${cmt}"; \
done

Выход:

The folder a/b/c has been deleted in commit: 3b53f16eb2fd7d3d605180ccabcfa71eb9e9225a

В форме простого сценария BASH (который Я называю delete.sh, должен иметь исполняемые разрешения):

#!/bin/bash

P="$1"
GIT=$(which git)

for cmt in $($GIT log --pretty=%H -- "${P}"); do
    X=$($GIT ls-tree -r "${cmt}" -- "${P}");
    [[ -z "${X}" ]] && echo "The folder a/b/c has been deleted in commit: ${cmt}";
done

Использование:

./deleted.sh a/b/c

Выход:

The folder a/b/c has been deleted in commit: 3b53f16eb2fd7d3d605180ccabcfa71eb9e9225a

Как это работает

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

Это то, что делает сценарий оболочки.

Итерирует назад в истории, извлекает все SHA # s, связанные с любыми файлами в папке, а затем находит среди этих коммитов - первое, у которого нет файлов, соответствующих пути при условии, в дереве Git.

Тот факт, что эта фиксация входит в список для проверки, гарантирует, что в ней есть изменения, связанные с этой папкой.

Тот факт, что нет файлов, соответствующих папке в своем дереве (отфильтрованное «ls-tree» возвращает пустую строку), гарантирует, что это фиксация, когда последний файл в этой папке был удален.

3
ответ дан Dmitri Sologoubenko 22 August 2018 в 08:54
поделиться
  • 1
    Но последнее фиксация из папки не требуется означает, что папка была удалена? – Kakawait 9 September 2015 в 07:28
  • 2
    Первой фиксацией, возвращающейся в историю, которая не имеет файлов в дереве, соответствующем пути к папке, должна делать. Это то, что делает сценарий оболочки. Он выполняет итерацию назад в истории, извлекает все SHA # s, связанные с любыми файлами в папке, а затем находит среди этих коммитов первое, у которого нет файлов, соответствующих пути, указанному в дереве Git. – Dmitri Sologoubenko 9 September 2015 в 08:37
  • 3
    @Kakawait, см. Примечания по теме «Как это работает»? как объяснение. – Dmitri Sologoubenko 9 September 2015 в 08:47
  • 4
    Да, я потрачу время, чтобы внимательно прочитать оба ответа – Kakawait 9 September 2015 в 08:49
  • 5
    Хороший трюк / обходной путь! Я соглашусь с этим ответом – Kakawait 10 September 2015 в 08:32

Насколько мне известно, специальной команды git нет, чтобы определить, был ли каталог удален / перемещен.

Однако, если весь каталог переместился в новое место в отслеживаемом git-репозитории он должен отображаться в разделе Untracked files: команды git status. Кроме того, все его файлы будут отображаться как удаленные.

Что касается удаленной директории, если вы ожидаете, что каталог больше не существует, вы можете запустить команду ls, чтобы дважды проверить, что каталог имеет в факт, были удалены. Если каталог не существует, он не отслеживается.

Если каталог существует, но ничего не содержит, то git также не отслеживает его. Тем не менее, вы можете попробовать

git ls-files dirName/ --error-unmatch; echo$?

Это решение изначально упоминалось в в этом вопросе StackOverflow . Предполагается, что команда проверяет, отслеживает ли какой-то файл git, но в этой ситуации git проверит, есть ли какие-либо файлы, где dirName является частью пути к файлу. Если папка не отслеживается, появится сообщение об ошибке.

1
ответ дан Community 22 August 2018 в 08:54
поделиться
  • 1
    git ls-files является ключом! Спасибо за ваш вклад (: upvote :) – Kakawait 10 September 2015 в 08:34
  • 2
    git ls-files является ключом! Спасибо за ваш вклад (: upvote :) – Kakawait 10 September 2015 в 08:35
Другие вопросы по тегам:

Похожие вопросы: