Разница в git не работает должным образом после клона git - PullRequest
1 голос
/ 15 октября 2019

У меня есть скрипт bash, в котором я должен клонировать и получить разницу в некоторых репозиториях. Я пытаюсь получить разницу между диапазонами дат

git clone $repository 
cd $path
git diff master@{2019-10-1}..master@{2019-10-14} -- package.json

, но отображается сообщение об ошибке: предупреждение: журнал «master» возвращается только в вторник, 15 октября 2019 г. 09:51:16 +0000.

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

$ git diff master@{2019-10-1}..master@{2019-10-14} -- package.json
diff --git a/package.json b/package.json
index d29ffcb..8766fde 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "accountd",
-  "version": "0.0.95",
+  "version": "0.0.102",
   "main": "dist/src/index.js",
   "private": true,
   "scripts": {
@@ -8,7 +8,8 @@
     "start-dev": "npm run build && nodemon . port=5000 stage",
     "start-sand": "npm run build && nodemon . port=5000 stage",
-    "test": "nyc --extension .ts --reporter=html --reporter=cobertura --reporter=text mocha -r ts-node/register src/**/*.spec.ts --exit",
+    "test": "mocha -r ts-node/register test/**/*.spec.ts  test/**/**/*.spec.ts --exit",

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

Ответы [ 2 ]

4 голосов
/ 15 октября 2019

Используемая вами запись (master@{<date>}) говорит, что вы хотите сослаться на версию master на <date> в соответствии с локальными флагами . То есть вы говорите, что хотите знать, на что указывал этот конкретный клон master в тот день, а не то, что из текущих коммитов master было совершено в этот день.

И gitговорит вам "у этого клона не было master ссылки на эту дату".

Чтобы сделать то, что вы имеете в виду, сначала вы должны найти последний коммит до даты "then", затем diff против этого. Есть несколько способов, но что-то вроде

git diff $(git rev-list -n1 --before="<date>" --first-parent master) master

может быть больше, чем вы хотите

0 голосов
/ 15 октября 2019

Синтаксис @{date} не даст вам того, что вы хотите. Я бы вошел в то, что вы делаете хотите, но я был избит до ответа;см. Марк Марк Адельсбергер вместо ответа . : -)

Что нужно знать о синтаксисе @{...}

С синтаксисом @{date} не имеет значения, сколько лет источнику репозитория . Неважно, сколько коммитов у вас есть. Все, что имеет значение, это то, что находится в так называемых reflogs .

этого конкретного клона. Каждый репозиторий Git - каждый клон - имеет свои собственные reflogs. В общем, никакие два разных репозитория Git не согласятся с тем, что входит в reflogs. Reflogs не предназначены для такой работы. Какой вид работы? Этот вид:

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

Перепрошивки абсолютно ничего не сообщают об измененияхв файлах, или изменения не в файлах, с течением времени. Они сообщают вам об изменениях в ссылках вашего Git с течением времени.

Это может вас озадачить, что именно: ref или reference является. Мы, вероятно, не должны вдаваться в подробности, но каждое название ветви, например master, на самом деле является ссылкой, полное написание которой refs/heads/master;каждое имя тега, например v1.2, является ссылкой, полное написание которой refs/tags/v1.2;и каждое имя для удаленного отслеживания, такое как origin/master, является ссылкой, полное написание которой начинается с refs/remotes/. Таким образом, они являются просто обобщением различных имен, которые люди обычно используют, чтобы говорить о коммитах. Чтобы говорить о коммитах Git , нужны их необработанные хэш-идентификаторы. имена в некоторой степени просто существуют, чтобы нам, слабым людям, не приходилось запоминать произвольные, большие уродливые хэш-идентификаторы. 1

Ключ кпонимание этого и синтаксиса @{...} означает, что эти имена - например, refs/heads/master - изменяются с течением времени. Прямо сейчас ваш master коммит может быть a123456.... Вчера, возможно, это был какой-то другой коммит, а завтра, возможно, еще один коммит. Ваш Git master будет меняться со временем, и каждый раз, когда он меняется, ваш Git ведет запись того, что было . Эта запись возвращается только к тому моменту: коммиты являются постоянными, но запись с хэш-идентификатором master означала, когда нет. Более того, он не переносится из одного клона в другой: Запись каждого клона о том, что master имел в виду, когда является конфиденциальной для этого конкретного Git . В новом клоне, который имеет все коммитов 2 , есть только одно значение, которое master когда-либо имело, то есть то, что у него сейчас.

Примечаниечто вы также можете использовать @{<em>number</em>}. При этом выбирается номерная запись в reflog.

Чтобы просмотреть фактический reflog для любого конкретного ref, запустите git reflog <em>ref</em>, например, git reflog master. Команда git reflog также имеет различные другие подкоманды для работы с журналами. Подробнее см. в документации .


1 Имена имеют другие функции. Подробнее об этом см. Think Like (а) Git .

2 Предполагая, что это не клон мелкий , то естьне использовать некоторые из новых функций «пакета Promisor», которые еще не используются в общем. Кроме того, если вы клонировали с -b или --single-branch, или вышестоящий репозиторий настроен не так, как обычно, у вас может вообще не быть ветки с именем master.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...