Если вы хотите использовать решение 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))
[/g0]
Предполагая структуру древовидной выборки в вашем репозитории как:
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» возвращает пустую строку), гарантирует, что это фиксация, когда последний файл в этой папке был удален.
Насколько мне известно, специальной команды git нет, чтобы определить, был ли каталог удален / перемещен.
Однако, если весь каталог переместился в новое место в отслеживаемом git-репозитории он должен отображаться в разделе Untracked files:
команды git status
. Кроме того, все его файлы будут отображаться как удаленные.
Что касается удаленной директории, если вы ожидаете, что каталог больше не существует, вы можете запустить команду ls
, чтобы дважды проверить, что каталог имеет в факт, были удалены. Если каталог не существует, он не отслеживается.
Если каталог существует, но ничего не содержит, то git также не отслеживает его. Тем не менее, вы можете попробовать
git ls-files dirName/ --error-unmatch; echo$?
Это решение изначально упоминалось в в этом вопросе StackOverflow . Предполагается, что команда проверяет, отслеживает ли какой-то файл git, но в этой ситуации git проверит, есть ли какие-либо файлы, где dirName
является частью пути к файлу. Если папка не отслеживается, появится сообщение об ошибке.
git ls-files
является ключом! Спасибо за ваш вклад (: upvote :)
– Kakawait
10 September 2015 в 08:34
git ls-files
является ключом! Спасибо за ваш вклад (: upvote :)
– Kakawait
10 September 2015 в 08:35