Git: Есть ли способ проверить ранее запрограммированный код? [dубликат]

Отображаемое значение вызывается функцией g_format_size_for_display GLib. Вы должны отредактировать исходный код nautilus, чтобы изменить это поведение, просто добавив% i к выводу:

Шаг 1: Загрузите исходный код, установите зависимости и откройте файл для редактирования

mkdir -p .p/nautilus && cd .p/nautilus
sudo apt-get build-dep nautilus
apt-get source nautilus && cd nautilus*
gedit src/file-manager/fm-properties-window.c

Шаг 1 : измените код

Теперь перейдите к строке 2338 (в Nautilus 2.30) и измените with size %s на with size %s (%i Bytes). Сделайте то же самое для totalling %s. Измените его на totalling %s (%i Bytes) Теперь он должен выглядеть так:

    text = g_strdup_printf (ngettext("%'d item, with size %s (%i Bytes)",
                     "%'d items, totalling %s (%i Bytes)",

Шаг 3: Скомпилировать

Теперь вы можете просто скомпилировать Nautilus, как и все другие приложения

./configure --prefix=/usr
make
sudo make install
nautilus -q

Обратите внимание, что Nautilus будет перезаписана всякий раз, когда будет обновлено это через управление пакетами. Это означает, что вам нужно снова создать и установить его вручную.

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

1336
задан 1 July 2016 в 21:30

18 ответов

Чтобы получить список задержек, которые все еще находятся в вашем репозитории, но недоступны:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

Если вы указали заголовок на свой тайник, замените " WIP "в -grep=WIP в конце команды с частью вашего сообщения, например -grep=Tesselation.

Команда grepping для «WIP», потому что сообщение фиксации по умолчанию для кошелька находится в форме WIP on mybranch: [previous-commit-hash] Message of the previous commit.

57
ответ дан 15 August 2018 в 16:01
  • 1
    Это отлично работает для меня. Но мне пришлось отредактировать ответ, чтобы отобразилось двойное пространство после cut -d. При одном пробеле cut не распознает разделитель. – s4y 24 May 2011 в 00:59
  • 2
    Я повторно отредактировал, чтобы сделать cut аргументы еще более ясными – dty 29 November 2012 в 17:54
  • 3
    echo 'git fsck - недоступен | grep commit | cut -d " & Quot; -f3 | xargs git log --merges --no-walk --grep = WIP '& gt; / usr / local / bin / git-stashlog; chmod a + rx / usr / local / bin / git-stashlog # git stashlog – Erik Martino 24 June 2014 в 11:48
  • 4
    Или вы можете добавить это в свой .gitconfig как псевдоним (перед командой с !). – asmeurer 2 December 2015 в 02:04
  • 5
    Пробовал принятые и поп-ответы и не работал. Это было сделано. – juliangonzalez 7 September 2016 в 02:55

То, что я здесь искал, это то, как на самом деле вернуть кошелек, независимо от того, что я проверил. В частности, я что-то спрятал, затем проверил более старую версию, а затем вынул ее, но в тот более ранний момент тайник был не-оператором, поэтому тарелка исчезла; Я не мог просто сделать git stash, чтобы вернуть его в стек. Это сработало для меня:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

В ретроспективе я должен был использовать git stash apply не git stash pop. Я делал bisect и имел небольшой патч, который я хотел применить на каждом шаге bisect. Теперь я делаю это:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.
4
ответ дан 15 August 2018 в 16:01
  • 1
    это ответ или продолжение вопроса? – Alex Brown 15 January 2014 в 12:52
  • 2
    Немного обоим. Я нашел эту страницу, потому что я потерял тайник и пытался вернуть его. Вариант использования для меня - это биссект, где я хочу применить изменения перед тестированием на каждом шаге. Я узнал, что вы не можете просто поп, тест, stash, bisect, потому что это может оставить другую фиксацию на stash, следовательно stash apply. – Ben 15 January 2014 в 18:50

Принятый ответ Аристотеля покажет все достижимые коммиты, в том числе несташные коммиты. Чтобы отфильтровать шум:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

Это будет включать в себя только коммиты, которые имеют ровно 3 родительских фиксации (которые имеет кошелек) и сообщение которых включает в себя «WIP on».

Имейте в виду, что если вы сохранили свой штамп с сообщением (например, git stash save "My newly created stash"), это переопределит сообщение по умолчанию «WIP on ...».

Вы можете отображать больше информации о каждом фиксации , например отобразить сообщение фиксации или передать его на git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R
8
ответ дан 15 August 2018 в 16:01

В OSX с git v2.6.4 я просто случайно запускаю git stash drop, после чего я нашел его, пробираясь ниже шагов

Если вы знаете имя кошелька, используйте:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

в противном случае вы найдете идентификатор из результата вручную:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

Тогда, когда вы найдете идентификатор commit просто ударить по git stash apply {commit-id}

Надеюсь, это поможет кому-то быстро

12
ответ дан 15 August 2018 в 16:01

эквивалент Windows PowerShell с помощью gitk:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

Возможно, более эффективный способ сделать это в одном канале, но это делает задание.

11
ответ дан 15 August 2018 в 16:01

Если вы хотите переделать потерянный тайник, вам сначала нужно найти хэш вашего потерянного тайника.

Как Аристотель Пагалтзис предложил git fsck помочь вам.

Лично я использую свой псевдоним log-all, который показывает мне каждую фиксацию (восстанавливаемые коммиты), чтобы лучше понять ситуацию:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

Вы можете выполнить еще более быстрый поиск, если ищете только Сообщения об ошибке «WIP on».

Как только вы узнаете свой sha1, вы просто измените свой лог-файл для добавления старого тайника:

git update-ref refs/stash ed6721d

Вероятно, вы предпочтете связать сообщение -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

И вы захотите использовать это как псевдоним:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1
23
ответ дан 15 August 2018 в 16:01
  • 1
    Мне нравится этот, потому что он показывает вещи в историческом порядке. – joeytwiddle 29 September 2016 в 05:57
  • 2
    Однако -d\\ должен быть -d\ (или даже более четким -d' ') – joeytwiddle 29 September 2016 в 05:58
  • 3
    Возникла ошибка: «фатальный: неопределенный аргумент« болтаться »: неизвестная ревизия или путь не в рабочем дереве. & Quot; – Daniel Ryan 20 July 2017 в 04:47
  • 4
    вам также нужно обернуть подкоманду кавычками git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721 – Andrei Shostik 4 September 2017 в 21:07

Я только что построил команду, которая помогла мне найти мой потерянный фиксатор:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

В этом списке перечислены все объекты в дереве .git / objects, найдите те, которые имеют тип commit, затем показывает резюме каждого из них. С этого момента речь шла только о том, чтобы найти соответствующие «WIP по работе: 6a9bb2» («работа» - это моя ветка, 619bb2 - недавняя фиксация).

Заметим, что если Я использую «git stash apply» вместо «git stash pop». У меня не было бы этой проблемы, и если я буду использовать «сообщение git stash save», тогда коммита, возможно, было бы легче найти.

Update : С идеей Натана это становится короче:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less
68
ответ дан 15 August 2018 в 16:01
  • 1
    Спасибо, что снова оттачивали мои навыки работы с раковиной! Я смог найти свой пропущенный трюк с вашим циклом и git-шоу. – wprater 29 May 2012 в 22:27
  • 2
    Это было прекрасно: показ сводки для фиксации в less сделал это тривиальным . – cbowns 21 May 2013 в 23:42

Восстановил его, выполнив следующие шаги:

Определить удаленный хэш-код: gitk --all $ (git fsck --no-reflog | awk / dangling commit / {print $ 3} ') Cherry Pick the Stash: git cherry-pick -m 1 $ stash_hash_code Разрешить конфликты, если они используются: git mergetool

Кроме того, у вас могут возникнуть проблемы с сообщением о фиксации, если вы используете gerrit. Пожалуйста, скопируйте свои изменения, прежде чем следовать следующим альтернативам:

Определить удаленный хэш-код: gitk --all $ (git fsck --no-reflog | awk / dangling commit / {print $ 3} ') Вы также можете записать изменения, переустановить и подтвердить.
4
ответ дан 15 August 2018 в 16:01

git fsck --unreachable | grep commit должен показать sha1, хотя список, который он возвращает, может быть довольно большим. git show <sha1> покажет, является ли это фиксацией, которую вы хотите.

git cherry-pick -m 1 <sha1> объединит фиксацию в текущей ветке.

36
ответ дан 15 August 2018 в 16:01
  • 1
    Ах, это, конечно, улучшает мой метод! У меня есть 130 недостижимых коммитов прямо сейчас, поэтому мне все еще нужна последняя половина моего решения. – Greg Hewgill 18 September 2008 в 07:12

Если вы не закрыли терминал, просто посмотрите на результат из git stash pop, и вы получите идентификатор объекта упавшего файла. Обычно это выглядит так:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

(Обратите внимание, что git stash drop также создает одну и ту же строку.)

Чтобы вернуть этот штамп, просто запустите git branch tmp 2cae03e, и вы Я получу его как ветку. Чтобы преобразовать это в stash, запустите:

git stash apply tmp
git stash

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

601
ответ дан 15 August 2018 в 16:01
  • 1
    Это часто самый простой ответ и заслуживает того, чтобы быть выше списка – Casebash 14 November 2011 в 04:57
  • 2
    Вы также можете сделать git stash apply commitid, затем git stash, чтобы получить новый тайник. – Matthew Flaschen 24 November 2011 в 02:11
  • 3
    Обратите внимание, что если git автоматически объединяет тайник и имеет конфликты, он не покажет вам хэш. – James 27 September 2013 в 01:53
  • 4
    @James: Опять же, если эти конфликты являются результатом запуска git stash pop, он также не потеряет кошелек, так что это обычно не проблема. – Dolda2000 27 September 2013 в 08:23
  • 5
    Я сделал каплю гиты и подумал, что мои изменения потеряны на вечность. Этот ответ спас меня :) это нужно проголосовать больше! – raghav710 25 May 2017 в 09:58

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

git fsck --no-reflog | awk '/dangling commit/ {print $3}' > tmp_commits

for h in `cat tmp_commits`; do git show $h | less; done

Затем вы получаете все различия для этих хэшей отображаются один за другим. Нажмите «q», чтобы перейти к следующему разлому.

10
ответ дан 15 August 2018 в 16:01

Почему люди задают этот вопрос? Потому что они еще не знают или не понимают reflog.

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

Я бы посоветовал всем с этим вопросом просто проверить reflog (git reflog), не намного больше , Как только вы увидите список всех коммитов, существует сто способов узнать, какую фиксацию вы ищете, и вишнево-выбрать или создать ветку из нее. В этом процессе вы узнаете о рефлоге и полезных вариантах для различных основных команд git.

10
ответ дан 15 August 2018 в 16:01
  • 1
    Привет, Робби. Это актуально, если вы работали, получали побочные следы, и вам нужно выбрать резервную копию, где вы остановились пару недель назад, только чтобы узнать, что вы не можете найти свою спрятанную работу - она, вероятно, потерялась где-то в этом другом материале, который вы делали. reflog отлично, если это недавняя история, но не долгое время. – emragins 20 June 2017 в 23:30
  • 2
    Я согласен с эрагинами, но это был пример использования ОП. Я не знаю точно, как будут вести себя другие команды, которые будут размещены здесь, но мой geuss был бы тем, что они также перестанут работать, как только ref на его спрятанную фиксацию будет очищен. – RobbyD 20 July 2017 в 11:50
  • 3
    Хм ... приведенный выше сценарий привел меня к этому вопросу, и я знаю, что это было, по крайней мере, пару недель, если не ближе к месяцу между тем, когда я (неосознанно) потерял свой кошелек и когда смог восстановить его. – emragins 22 July 2017 в 02:44

Мне понравился подход Аристотеля, но мне не нравилось использовать GITK ... поскольку я привык использовать GIT из командной строки.

Вместо этого я взял оборванные коммиты и вывел код в файл DIFF для просмотра в моем редакторе кода.

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

Теперь вы можете загрузить полученный файл diff / txt (его в вашей домашней папке) в ваш редактор txt и посмотреть фактический код и полученный SHA.

Затем просто используйте

git stash apply ad38abbf76e26c803b27a6079348192d32f52219
15
ответ дан 15 August 2018 в 16:01

Просто хотел упомянуть об этом дополнении к принятому решению. Это было сразу не очевидно для меня в первый раз, когда я попробовал этот метод (может быть, он и должен был быть), но для применения stash из хэш-значения просто используйте «git stash apply»:

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

Когда я был новичком в git, мне это было непонятно, и я пытался использовать разные комбинации «git show», «git apply», «patch» и т. Д.

234
ответ дан 15 August 2018 в 16:01
  • 1
    Это спасло мой день после случайного ввода git stash drop вместо git stash pop. – Jörn Horstmann 7 April 2011 в 18:45
  • 2
    Ницца. Я просто понял, что он печатает SHA1, когда он бросает кошелек (т. Е. Когда вы поп). – asmeurer 10 May 2011 в 09:19
  • 3
    Обратите внимание, что это применимо (duh!) К stash к текущему рабочему дереву. Если дерево грязно, вы можете сначала использовать временную ветвь или тайник, снова применить кошелек из SHA-1, снова нажать и затем поместить второй в последний тайник (называемый stash @ {1}). – musiKk 24 March 2014 в 16:28

Я не могу получить ответы на работу в Windows в простом командном окне (в моем случае - Windows 7). awk, grep и Select-string не были распознаны как команды. Поэтому я попробовал другой подход:

первый запуск: git fsck --unreachable | findstr "commit" скопировать вывод в блокнот find заменить «unreachable commit» на start cmd /k git show

будет выглядеть примерно так:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

первый запуск: git fsck --unreachable | findstr "commit" скрипт откроет кучу окон команд, показывая, что каждая фиксация копирует вывод в блокнот [ ! d3]

может быть не лучшим решением, но работал для меня

7
ответ дан 15 August 2018 в 16:01
  • 1
    Большое спасибо за публикацию, это единственное, что сработало для меня. – achecopar 8 January 2018 в 18:46

Другой распространенный вариант использования: вы пытались выскакивать на неправильную ветку и возникали конфликты?

Все, что вы хотите, - это отменить поп, но сохраните его в списке, чтобы вы могли вывести его на нужную ветку.

Чтобы исправить это, сделайте следующее:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

Done!

0
ответ дан 15 August 2018 в 16:01

Я случайно удалил тайник в приложении GitUP. Просто нажмите Ctrl + Z, чтобы отменить его.

Возможно, это помогает кому-то;)

0
ответ дан 15 August 2018 в 16:01

Вы можете перечислить все недостижимые коммиты, написав эту команду в терминале -

git fsck --unreachable

Проверить недостижимый хеш фиксации -

git show hash

Наконец, применитесь, если вы найдете скрытый элемент -

git stash apply hash
3
ответ дан 15 August 2018 в 16:01

Другие вопросы по тегам:

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