Mam repozytorium plików i pliku, o którym wiem, ale nie jestem pewien, co tag / oddział. Znam nazwę pliku w ramach repozytorium.

Czy istnieje łatwy sposób na wyszukiwanie drzewa Git, aby znaleźć najbliższą gałęzi / znacznika, z którego pochodzi plik?

Edytuj: Pełny scenariusz, aby wyjaśnić dlaczego.

Mamy repozytorium szablonów. Szablony te były czasami używane przez inny program, a kiedy zostały użyte, zostały one sprawdzane z głównego repozytorium szablonu bez żadnej historii Git.

Szybko do przodu, chcemy, aby móc programowo aktualizować wszystkie miejsca za pomocą tych szablonów, ale wielu z nich nie wiemy, która wersja jest w rzeczywistości używana, a co aktualizacje mogą wystąpić w pozostałej części kod, aby bezproblemowo zezwolić aktualizacji. Więc co próbujemy zrobić, to dowiedzieć się, co najbliższa tag (A-La Git) byłby dla konkretnej wersji konkretnego szablonu. Stamtąd możemy zorganizować resztę aktualizacji w razie potrzeby.

Mam więc kopię szablonu, wiem, że pochodzi z mojego repo, ale nie wiem, kiedy pochodzi.

git
-1
Dan R 16 luty 2017, 19:03

2 odpowiedzi

Najlepsza odpowiedź

OK, więc masz jakieś treści i chcesz znaleźć w jakim punkcie historii zawartość pojawiła się na danej ścieżce w repo.

Wspominasz coś o MD5; Być może miałeś na myśli Hash używany przez Git (co jest w rzeczywistości SHA1), ale nawet jeśli nie chwiej go jest, czego używać. Należy pamiętać, że nie można użyć tylko żadnych narzędzi do obliczenia SHA1, ponieważ Git przywiązuje nagłówek do zawartości, a także może stosować niektóre filtry przed obliczeniem hasha. Więc:

git hash-object file-containing-the-target-content

I zanotuj SHA1, który ci daje.

Następnie potrzebujesz wyjścia dziennika, który zawiera SHA1 pliku. Jeden byłby

git log --raw --no-abbrev --all --full-history --reverse -- path/to/file/in/repo

I wyszukaj wyjście pierwszego wystąpienia wartości SHA1, którą znalazłeś powyżej. (Może istnieć sposób na zautomatyzowanie wyszukiwania treści; myślę o tym, ale z jakiegoś powodu nie kliknie. Ale tylko przechwytywanie dziennika lub rurociągu do mniejszego, a następnie poszukiwanie wartości SHA1, będzie działać bez zbyt duży kłopot.)

A może to dokładnie to, co musisz zrobić ... ale szczerze mówiąc, nie mogę wymyślić, co będzie wniosek o tę technikę. Jeśli chcesz wiedzieć, kiedy konkretny bit treści dostał się do repo, grając z git blame może okazać się bardziej owocne.

1
Mark Adelsberger 16 luty 2017, 17:17

Zamierzam to opublikować osobno, ponieważ @ Mark-Adelsberger dostał mnie przez większość drogi, ale nie zupełnie go nie dostać w jednym strzale. Oto jak zlokalizować zatwierdzenie pliku z jego treści i uzyskać najbliższy tag:

hash=$(git hash-object file_of_unknown_origin)
commit_hash=$(git log --raw --no-abbrev --all --full-history --reverse --format=format:%H -- path/to/file | sed 's/^:[0-9]* [0-9]* [a-z0-9]* //' | grep -B1 $hash | head -n 1)
git checkout $commit_hash
git describe --tags
0
Dan R 16 luty 2017, 22:41