Compare commits
8 Commits
19f14d1c05
...
4e100cf647
Author | SHA1 | Date |
---|---|---|
Gaël Depreeuw | 4e100cf647 | 4 years ago |
Gaël Depreeuw | 669b433a13 | 4 years ago |
Gaël Depreeuw | 8059391cd1 | 4 years ago |
Gaël Depreeuw | 2d13360bd7 | 4 years ago |
Gaël Depreeuw | 2d2b9afe6c | 4 years ago |
Gaël Depreeuw | 116fad8120 | 4 years ago |
Gaël Depreeuw | a4076d7a15 | 4 years ago |
Gaël Depreeuw | 6e9a934cec | 4 years ago |
8 changed files with 614 additions and 293 deletions
@ -1,3 +1,3 @@ |
||||
[submodule "themes/hermit"] |
||||
path = themes/hermit |
||||
url = https://github.com/Track3/hermit.git |
||||
[submodule "themes/even"] |
||||
path = themes/even |
||||
url = https://github.com/Mithror/hugo-theme-even.git |
||||
|
@ -1,77 +1,229 @@ |
||||
baseURL = "https://depreeuw.dev" |
||||
languageCode = "en-us" |
||||
languageCode = "en" |
||||
defaultContentLanguage = "en" |
||||
title = "Gaël Depreeuw" |
||||
theme = "hermit" |
||||
# enableGitInfo = true |
||||
preserveTaxonomyNames = true |
||||
enableRobotsTXT = true |
||||
enableEmoji = true |
||||
theme = "even" |
||||
enableGitInfo = true # use git commit log to generate lastmod record |
||||
|
||||
# Syntax highlighting by Chroma. NOTE: Don't enable `highlightInClient` and `chroma` at the same time! |
||||
pygmentsOptions = "linenos=table" |
||||
pygmentsCodefences = true |
||||
pygmentsUseClasses = true |
||||
# hasCJKLanguage = true # If Chinese/Japanese/Korean is your main content language, enable this to make wordCount works right. |
||||
rssLimit = 10 # Maximum number of items in the RSS feed. |
||||
copyright = "This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License." # This message is only used by the RSS template. |
||||
enableEmoji = true # Shorthand emojis in content files - https://gohugo.io/functions/emojify/ |
||||
# googleAnalytics = "UA-123-45" |
||||
# disqusShortname = "yourdiscussshortname" |
||||
|
||||
[author] |
||||
name = "Gaël Depreeuw" |
||||
|
||||
[blackfriday] |
||||
# hrefTargetBlank = true |
||||
# noreferrerLinks = true |
||||
# nofollowLinks = true |
||||
|
||||
[taxonomies] |
||||
tag = "tags" |
||||
# Categories are disabled by default. |
||||
|
||||
[params] |
||||
dateform = "Jan 2, 2006" |
||||
dateformShort = "Jan 2" |
||||
dateformNum = "2006-01-02" |
||||
dateformNumTime = "2006-01-02 15:04 -0700" |
||||
|
||||
# Metadata mostly used in document's head |
||||
# description = "" |
||||
# images = [""] |
||||
themeColor = "#494f5c" |
||||
|
||||
homeSubtitle = "A website about my tips and general thoughts." |
||||
footerCopyright = ' · <a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" rel="noopener">CC BY-NC 4.0</a>' |
||||
# bgImg = "" # Homepage background-image URL |
||||
|
||||
# Prefix of link to the git commit detail page. GitInfo must be enabled. |
||||
# gitUrl = "https://github.com/username/repository/commit/" |
||||
|
||||
# Toggling this option needs to rebuild SCSS, requires Hugo extended version |
||||
justifyContent = false # Set "text-align: justify" to `.content`. |
||||
|
||||
relatedPosts = false # Add a related content section to all single posts page |
||||
pygmentsCodefencesGuessSyntax = true |
||||
|
||||
code_copy_button = true # Turn on/off the code-copy-button for code-fields |
||||
paginate = 5 |
||||
copyright = "Gaël Depreeuw" |
||||
|
||||
# Add custom css |
||||
# customCSS = ["css/foo.css", "css/bar.css"] |
||||
|
||||
# Social Icons |
||||
# Check https://github.com/Track3/hermit#social-icons for more info. |
||||
|
||||
[[params.social]] |
||||
name = "github" |
||||
url = "https://github.com/mithror" |
||||
|
||||
[[params.social]] |
||||
name = "nextcloud" |
||||
url = "https://nextcloud.depreeuw.dev/" |
||||
[author] # essential |
||||
name = "Gaël Depreeuw" |
||||
|
||||
[menu] |
||||
[sitemap] # essential |
||||
changefreq = "weekly" |
||||
priority = 0.5 |
||||
filename = "sitemap.xml" |
||||
|
||||
[[menu.main]] |
||||
name = "Posts" |
||||
url = "posts/" |
||||
[[menu.main]] # config your menu # 配置目录 |
||||
name = "Home" |
||||
weight = 10 |
||||
|
||||
identifier = "home" |
||||
url = "/" |
||||
[[menu.main]] |
||||
name = "About" |
||||
url = "about-hugo/" |
||||
name = "Archives" |
||||
weight = 20 |
||||
identifier = "archives" |
||||
url = "/post/" |
||||
[[menu.main]] |
||||
name = "Tags" |
||||
weight = 30 |
||||
identifier = "tags" |
||||
url = "/tags/" |
||||
[[menu.main]] |
||||
name = "Categories" |
||||
weight = 40 |
||||
identifier = "categories" |
||||
url = "/categories/" |
||||
|
||||
[params] |
||||
version = "4.x" # Used to give a friendly message when you have an incompatible update |
||||
debug = false # If true, load `eruda.min.js`. See https://github.com/liriliri/eruda |
||||
|
||||
since = "2020" |
||||
# use public git repo url to link lastmod git commit, enableGitInfo should be true. |
||||
# 指定 git 仓库地址,可以生成指向最近更新的 git commit 的链接,需要将 enableGitInfo 设置成 true. |
||||
gitRepo = "https://gitea.depreeuw.dev/Mithror/main-site" |
||||
|
||||
# site info (optional) # 站点信息(可选,不需要的可以直接注释掉) |
||||
logoTitle = "Gaël Depreeuw" # default: the title value # 默认值: 上面设置的title值 |
||||
keywords = ["git", "blog","hugo", "even"] |
||||
description = "Gaël Depreeuw's personal site" |
||||
|
||||
# paginate of archives, tags and categories # 归档、标签、分类每页显示的文章数目,建议修改为一个较大的值 |
||||
archivePaginate = 50 |
||||
|
||||
# show 'xx Posts In Total' in archive page ? # 是否在归档页显示文章的总数 |
||||
showArchiveCount = false |
||||
|
||||
# The date format to use; for a list of valid formats, see https://gohugo.io/functions/format/ |
||||
dateFormatToUse = "2006-01-02" |
||||
|
||||
# show word count and read time ? # 是否显示字数统计与阅读时间 |
||||
moreMeta = false |
||||
|
||||
# Syntax highlighting by highlight.js |
||||
highlightInClient = false |
||||
|
||||
# 一些全局开关,你也可以在每一篇内容的 front matter 中针对单篇内容关闭或开启某些功能,在 archetypes/default.md 查看更多信息。 |
||||
# Some global options, you can also close or open something in front matter for a single post, see more information from `archetypes/default.md`. |
||||
toc = true # 是否开启目录 |
||||
autoCollapseToc = false # Auto expand and collapse toc # 目录自动展开/折叠 |
||||
fancybox = true # see https://github.com/fancyapps/fancybox # 是否启用fancybox(图片可点击) |
||||
|
||||
# mathjax |
||||
mathjax = false # see https://www.mathjax.org/ # 是否使用mathjax(数学公式) |
||||
mathjaxEnableSingleDollar = false # 是否使用 $...$ 即可進行inline latex渲染 |
||||
mathjaxEnableAutoNumber = false # 是否使用公式自动编号 |
||||
mathjaxUseLocalFiles = false # You should install mathjax in `your-site/static/lib/mathjax` |
||||
|
||||
postMetaInFooter = true # contain author, lastMod, markdown link, license # 包含作者,上次修改时间,markdown链接,许可信息 |
||||
linkToMarkDown = false # Only effective when hugo will output .md files. # 链接到markdown原始文件(仅当允许hugo生成markdown文件时有效) |
||||
contentCopyright = '' # e.g. '<a rel="license noopener" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a>' |
||||
|
||||
changyanAppid = "" # Changyan app id # 畅言 |
||||
changyanAppkey = "" # Changyan app key |
||||
|
||||
livereUID = "" # LiveRe UID # 来必力 |
||||
|
||||
baiduPush = false # baidu push # 百度 |
||||
baiduAnalytics = "" # Baidu Analytics |
||||
baiduVerification = "" # Baidu Verification |
||||
googleVerification = "" # Google Verification # 谷歌 |
||||
|
||||
# Link custom CSS and JS assets |
||||
# (relative to /static/css and /static/js respectively) |
||||
customCSS = [] |
||||
customJS = [] |
||||
|
||||
uglyURLs = false # please keep same with uglyurls setting |
||||
|
||||
[params.publicCDN] # load these files from public cdn # 启用公共CDN,需自行定义 |
||||
enable = true |
||||
jquery = '<script src="https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>' |
||||
slideout = '<script src="https://cdn.jsdelivr.net/npm/slideout@1.0.1/dist/slideout.min.js" integrity="sha256-t+zJ/g8/KXIJMjSVQdnibt4dlaDxc9zXr/9oNPeWqdg=" crossorigin="anonymous"></script>' |
||||
fancyboxJS = '<script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.js" integrity="sha256-XVLffZaxoWfGUEbdzuLi7pwaUJv1cecsQJQqGLe7axY=" crossorigin="anonymous"></script>' |
||||
fancyboxCSS = '<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.1.20/dist/jquery.fancybox.min.css" integrity="sha256-7TyXnr2YU040zfSP+rEcz29ggW4j56/ujTPwjMzyqFY=" crossorigin="anonymous">' |
||||
timeagoJS = '<script src="https://cdn.jsdelivr.net/npm/timeago.js@3.0.2/dist/timeago.min.js" integrity="sha256-jwCP0NAdCBloaIWTWHmW4i3snUNMHUNO+jr9rYd2iOI=" crossorigin="anonymous"></script>' |
||||
timeagoLocalesJS = '<script src="https://cdn.jsdelivr.net/npm/timeago.js@3.0.2/dist/timeago.locales.min.js" integrity="sha256-ZwofwC1Lf/faQCzN7nZtfijVV6hSwxjQMwXL4gn9qU8=" crossorigin="anonymous"></script>' |
||||
flowchartDiagramsJS = '<script src="https://cdn.jsdelivr.net/npm/raphael@2.2.7/raphael.min.js" integrity="sha256-67By+NpOtm9ka1R6xpUefeGOY8kWWHHRAKlvaTJ7ONI=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/flowchart.js@1.8.0/release/flowchart.min.js" integrity="sha256-zNGWjubXoY6rb5MnmpBNefO0RgoVYfle9p0tvOQM+6k=" crossorigin="anonymous"></script>' |
||||
sequenceDiagramsCSS = '<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/bramp/js-sequence-diagrams@2.0.1/dist/sequence-diagram-min.css" integrity="sha384-6QbLKJMz5dS3adWSeINZe74uSydBGFbnzaAYmp+tKyq60S7H2p6V7g1TysM5lAaF" crossorigin="anonymous">' |
||||
sequenceDiagramsJS = '<script src="https://cdn.jsdelivr.net/npm/webfontloader@1.6.28/webfontloader.js" integrity="sha256-4O4pS1SH31ZqrSO2A/2QJTVjTPqVe+jnYgOWUVr7EEc=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/snapsvg@0.5.1/dist/snap.svg-min.js" integrity="sha256-oI+elz+sIm+jpn8F/qEspKoKveTc5uKeFHNNVexe6d8=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/underscore@1.8.3/underscore-min.js" integrity="sha256-obZACiHd7gkOk9iIL/pimWMTJ4W/pBsKu+oZnSeBIek=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/gh/bramp/js-sequence-diagrams@2.0.1/dist/sequence-diagram-min.js" integrity="sha384-8748Vn52gHJYJI0XEuPB2QlPVNUkJlJn9tHqKec6J3q2r9l8fvRxrgn/E5ZHV0sP" crossorigin="anonymous"></script>' |
||||
|
||||
# Display a message at the beginning of an article to warn the readers that it's content may be outdated. |
||||
# 在文章开头显示提示信息,提醒读者文章内容可能过时。 |
||||
[params.outdatedInfoWarning] |
||||
enable = false |
||||
hint = 30 # Display hint if the last modified time is more than these days ago. # 如果文章最后更新于这天数之前,显示提醒 |
||||
warn = 180 # Display warning if the last modified time is more than these days ago. # 如果文章最后更新于这天数之前,显示警告 |
||||
|
||||
[params.gitment] # Gitment is a comment system based on GitHub issues. see https://github.com/imsun/gitment |
||||
owner = "" # Your GitHub ID |
||||
repo = "" # The repo to store comments |
||||
clientId = "" # Your client ID |
||||
clientSecret = "" # Your client secret |
||||
|
||||
[params.utterances] # https://utteranc.es/ |
||||
owner = "" # Your GitHub ID |
||||
repo = "" # The repo to store comments |
||||
|
||||
[params.gitalk] # Gitalk is a comment system based on GitHub issues. see https://github.com/gitalk/gitalk |
||||
owner = "" # Your GitHub ID |
||||
repo = "" # The repo to store comments |
||||
clientId = "" # Your client ID |
||||
clientSecret = "" # Your client secret |
||||
|
||||
# Valine. |
||||
# You can get your appid and appkey from https://leancloud.cn |
||||
# more info please open https://valine.js.org |
||||
[params.valine] |
||||
enable = false |
||||
appId = '你的appId' |
||||
appKey = '你的appKey' |
||||
notify = false # mail notifier , https://github.com/xCss/Valine/wiki |
||||
verify = false # Verification code |
||||
avatar = 'mm' |
||||
placeholder = '说点什么吧...' |
||||
visitor = false |
||||
|
||||
[params.flowchartDiagrams]# see https://blog.olowolo.com/example-site/post/js-flowchart-diagrams/ |
||||
enable = false |
||||
options = "" |
||||
|
||||
[params.sequenceDiagrams] # see https://blog.olowolo.com/example-site/post/js-sequence-diagrams/ |
||||
enable = false |
||||
options = "" # default: "{theme: 'simple'}" |
||||
|
||||
[params.busuanzi] # count web traffic by busuanzi # 是否使用不蒜子统计站点访问量 |
||||
enable = false |
||||
siteUV = true |
||||
sitePV = true |
||||
pagePV = true |
||||
|
||||
[params.reward] # 文章打赏 |
||||
enable = false |
||||
wechat = "/path/to/your/wechat-qr-code.png" # 微信二维码 |
||||
alipay = "/path/to/your/alipay-qr-code.png" # 支付宝二维码 |
||||
|
||||
[params.social.asFont] # 社交链接 |
||||
a-email = "mailto:gael@depreeuw.dev" |
||||
# b-stack-overflow = "http://localhost:1313" |
||||
# c-twitter = "http://localhost:1313" |
||||
# d-facebook = "http://localhost:1313" |
||||
# e-linkedin = "http://localhost:1313" |
||||
# f-google = "http://localhost:1313" |
||||
b-github = "https://github.com/Mithror" |
||||
# h-weibo = "http://localhost:1313" |
||||
# i-zhihu = "http://localhost:1313" |
||||
# j-douban = "http://localhost:1313" |
||||
# k-pocket = "http://localhost:1313" |
||||
# l-tumblr = "http://localhost:1313" |
||||
# m-instagram = "http://localhost:1313" |
||||
# n-gitlab = "http://localhost:1313" |
||||
# o-bilibili = "http://localhost:1313" |
||||
|
||||
[params.social.asSVG] |
||||
a-gitea = "https://gitea.depreeuw.dev/Mithror" |
||||
b-nextcloud = "https://nextcloud.depreeuw.dev" |
||||
|
||||
# See https://gohugo.io/about/hugo-and-gdpr/ |
||||
[privacy] |
||||
[privacy.googleAnalytics] |
||||
anonymizeIP = true # 12.214.31.144 -> 12.214.31.0 |
||||
[privacy.youtube] |
||||
privacyEnhanced = true |
||||
|
||||
# see https://gohugo.io/getting-started/configuration-markup |
||||
[markup] |
||||
[markup.tableOfContents] |
||||
startLevel = 1 |
||||
[markup.goldmark.renderer] |
||||
unsafe = true |
||||
|
||||
# 将下面这段配置取消注释可以使 hugo 生成 .md 文件 |
||||
# Uncomment these options to make hugo output .md files. |
||||
#[mediaTypes] |
||||
# [mediaTypes."text/plain"] |
||||
# suffixes = ["md"] |
||||
# |
||||
#[outputFormats.MarkDown] |
||||
# mediaType = "text/plain" |
||||
# isPlainText = true |
||||
# isHTML = false |
||||
# |
||||
#[outputs] |
||||
# home = ["HTML", "RSS"] |
||||
# page = ["HTML", "MarkDown"] |
||||
# section = ["HTML", "RSS"] |
||||
# taxonomy = ["HTML", "RSS"] |
||||
# taxonomyTerm = ["HTML"] |
||||
|
@ -0,0 +1,236 @@ |
||||
--- |
||||
title: "Renames in Git explained" |
||||
date: 2020-11-28T12:07:00Z |
||||
draft: false |
||||
toc: true |
||||
tags: ['tech', 'git', 'rename'] |
||||
author: "Gaël Depreeuw" |
||||
--- |
||||
|
||||
## Introduction |
||||
|
||||
One of the questions I'm often asked when teaching or explaining Git is how Git |
||||
handles file and/or directory renames. The short answer to this is: **It** |
||||
**doesn't**. |
||||
|
||||
The slightly longer answer is: **It does, but probably not in the way you** |
||||
**envision it?**. |
||||
|
||||
Let's first take a look at how Git works internally. If you don't quite |
||||
understand everything which follows, I can recommend reading chapter 10 of |
||||
the [Git Pro Book 2nd. Edition](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain). |
||||
|
||||
## Git stores content, not files |
||||
|
||||
When you commit to a Git repository it basically does the following: |
||||
|
||||
Create a **blob** object for every file in the index (a.k.a. the staging area). |
||||
A blob object is created by taking the content of the file, prepending a header |
||||
and compressing the result. A SHA-1 hash is then calculated for this object |
||||
which will be used to identify the object. The object is stored in the aptly |
||||
named object store (found in `.git/objects`). The first 2 characters of the |
||||
hash (in hex format) are used as a directory within this store, while the |
||||
remaining characters are the filename of the blob object. |
||||
|
||||
Let's look at an example. Create a git repo somewhere and create a file. |
||||
|
||||
```bash |
||||
git init foo |
||||
cd foo |
||||
echo "foo" >> foo.txt |
||||
``` |
||||
|
||||
If you look into your `.git/objects` directory, it will be empty, aside from |
||||
two empty subdirectories. Let's create a blob out of this file now. |
||||
|
||||
```bash |
||||
$ git hash-object -w foo.txt |
||||
257cc5642cb1a054f08cc83f2d943e56fd3ebe99 |
||||
``` |
||||
|
||||
You will now find an object in the store: |
||||
|
||||
```bash |
||||
$ find .git/objects -type f |
||||
.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 |
||||
``` |
||||
|
||||
Here's an interesting exercise: what happens if you rename the file and create |
||||
the blob with the renamed file? |
||||
|
||||
```bash |
||||
$ mv foo.txt bar.txt |
||||
$ git hash-object -w bar.txt |
||||
257cc5642cb1a054f08cc83f2d943e56fd3ebe99 |
||||
``` |
||||
|
||||
That's right, nothing changed! This makes sense as we're only adding the content |
||||
to the object store! So how does Git remember the file names? |
||||
|
||||
## Filenames are part of tree objects |
||||
|
||||
Aside from **blob** objects, Git also creates **tree** objects. You can sort of |
||||
compare it to the directories in your worktree, i.e. for each directory in your |
||||
worktree, you will have a tree object. A tree object's content looks like: |
||||
|
||||
```code |
||||
<mode> <type> <hash> <name> |
||||
... |
||||
<mode> <type> <hash> <name> |
||||
``` |
||||
|
||||
You can create a tree object yourself by doing: |
||||
|
||||
```bash |
||||
$ git update-index --add --cacheinfo 100644 \ |
||||
257cc5642cb1a054f08cc83f2d943e56fd3ebe99 foo.txt |
||||
$ git write-tree |
||||
fcf0be4d7e45f0ef9592682ad68e42270b0366b4 |
||||
$ git cat-file -p fcf0be4d7e45f0ef9592682ad68e42270b0366b4 |
||||
100644 blob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 foo.txt |
||||
``` |
||||
|
||||
There are 3 different types (that I know of) which can be referred to in a tree |
||||
object: blob, tree, commit. Blobs represent file content, tree represent other |
||||
tree (i.e. subdirectories) and commits represent submodules (i.e the commit |
||||
at which they are included). A commit is a type of object which is also present |
||||
outside the tree objects. They contain the top tree object (representing the |
||||
top level of your repository), a link to one or more parent commits and some |
||||
meta data (author, commit msg, date, ...). Finally and for completion's sake, |
||||
there is also an object for annotated tags, which contain the commit it is |
||||
pointing too as well as some meta data. |
||||
|
||||
## Renaming |
||||
|
||||
Armed with the knowledge about trees and blobs, it should be fairly easy to |
||||
understand what happens if you rename a file. To make it easier to understand, |
||||
consider a simple example: we just rename a file at the top level. |
||||
|
||||
> Note: more complex examples are just more time consuming to explain, but |
||||
> not to understand. The same principles apply. |
||||
|
||||
In case of such a rename, when you commit this rename, your repository will |
||||
be impacted as follows: |
||||
|
||||
- The blob representing the file remains unchanged. |
||||
- The top level tree object changes as well because the filename associated with |
||||
the blob is different. |
||||
- The commit object will point to the new tree. (Its parent will point to the |
||||
old tree.) |
||||
|
||||
Nowhere is there any special mention of a rename occuring. Remember, we're just |
||||
storing content! As such Git is not aware of any name changes. This is why the |
||||
short answer was: Git doesn't handle file renames. The repository itself has no |
||||
notion of this action. It's just has content and a structure for that content. |
||||
|
||||
However, that does not mean you lose your history when you rename a file. |
||||
|
||||
### How to see history of a renamed file |
||||
|
||||
Git might not store information on renames in the repository but it does come |
||||
packed with an algorithm that detects file renames. The way it works is that for |
||||
every add/delete pair added to the index, it tries to determine a rename |
||||
candidate for every deleted file. It does this by comparing how similar the |
||||
paired files are. If they are at least 50% similar, it considered the pair to |
||||
have been a rename. If there are multiple rename candidates for one file, it |
||||
takes the one with the highest similarity percentage. If multipe files have the |
||||
same percentage, it picks one depending on the implementation. |
||||
|
||||
> **Note**: I believe, but am not sure, it basicaly takes the first |
||||
> alphabeticaly match in the last case. |
||||
|
||||
By default `git log -- <file>` does not track accross renames. If you want to |
||||
do see the history across renames, you will need to add the `--follow` option. |
||||
|
||||
You can also define the treshold percentage to be different from 50%. This is |
||||
done via the `-M<n>` or `--find-renames=<n>` option. See the git documentation |
||||
for the correct syntax. |
||||
|
||||
You can also turn off rename detection by doing `--no-renames` |
||||
|
||||
### Rename best practice |
||||
|
||||
Because of the treshold and the cheapness of commits, it is recommended that |
||||
when you rename a file/directory, you commit those renames first, before you |
||||
continue working on the renamed file. This basically makes it so you can use |
||||
a treshold of 100% all the time. |
||||
|
||||
### Why did Git do it this way |
||||
|
||||
This is pure speculation, but here's my thoughts on it: |
||||
|
||||
Filenames are actually part of the underlying file systems, so for a version |
||||
controls system to support multiple file system they have to handle filenames |
||||
in their own way. This includes renames. If you think about what this would |
||||
require for Git, it would not be very straightforward: Git could have chosen to |
||||
provide a command to store rename data, let's say: `git rename fileA fileB`, but |
||||
what should this command do? We can image it could create new '**rename** |
||||
object, which would hold the blob hash and the name of the previous file. Now, |
||||
every time you would walk through history, when you encounter this object type, |
||||
you would need to remember this redirections. There's probably a lot of little |
||||
nuances which are not immediately apparent though and it does not deal with one |
||||
of the major drawbacks of this new command: What happens if the user forgets it |
||||
and just does `mv fileA fileB`? |
||||
|
||||
Well, we'd actually want to have some mechanism to detect this as a rename as |
||||
once this is commited it becomes more difficult to undo this change |
||||
(especially if we already pushed the commit!). So it sure would be nice if Git |
||||
could somehow figure out that it was a rename. Which is exactly what they did. |
||||
But now that we have this functionality, what actually is the point of the |
||||
new command we wanted to implement? This is probably highly subjective, but to |
||||
me it seems completely irrelevant now. Instead of having a command which can be |
||||
forgotten and for which we need contigency, just use the contigency as the |
||||
solution! It makes the behaviour a lot more consistent! |
||||
|
||||
### Can I fix my commit if I did change a lot of content after renaming |
||||
|
||||
First, to prevent this: always check using `git status` whether are not the |
||||
rename is being detected. Now, how to solve it? |
||||
|
||||
It depends. If your commit is local only and it is the last commit, then you can |
||||
fix this easily. There are many ways to to it, but one option is: |
||||
|
||||
```bash |
||||
git mv <newname> <oldname> # Undo the file rename |
||||
git commit --amend # Commit the changes to the file |
||||
git mv <oldname> <newname> # Rename the file |
||||
git commit # Commit the rename |
||||
``` |
||||
|
||||
If you want to rename first and the changes second you can also do this, but |
||||
it is a bit more complex: |
||||
|
||||
```bash |
||||
git reset --soft HEAD~ # Go back one commit, but keep the changes |
||||
git restore --staged <oldname> <newname> # unstage the deletion and addition |
||||
git restore <oldname> # undelete the old file |
||||
mv <newname> <newname.tmp> # make a temp backup of the new file |
||||
git mv <oldname> <newname> # Rename the old file |
||||
git commit # commit the rename |
||||
cp <newname.tmp> <newname> # apply the new changes |
||||
git commit -a # Commit the changes |
||||
``` |
||||
|
||||
If the commit is already a couple of commits ago, you can do the same with an |
||||
interactive rebase and doing either of the above at the correct time. |
||||
|
||||
If you already pushed your commits you will have to check with the team if you |
||||
can rewrite the history and push it. If this is not possible, you might need to |
||||
find the right treshold to have Git mark it as a rename. |
||||
|
||||
## Summary |
||||
|
||||
So in summary: no, Git does not store renames in its repository. Instead, for |
||||
every add/delete pair in a commit, Git will do an similarity analysis and |
||||
when they are X% alike (default 50%), it will assume a rename occured. |
||||
|
||||
Some commands influenced by this are: `git log`, `git diff` and `git merge`. |
||||
Options related to renames are: |
||||
|
||||
```txt |
||||
-M=<n>, --find-renames=<n> # where n is the treshold percentage. |
||||
--no-renames # don't do any rename detection |
||||
``` |
||||
|
||||
It is best practise to handle renames in their own commits. Try to avoid |
||||
renaming and modifying a file within the same commit. |
@ -0,0 +1,149 @@ |
||||
-----BEGIN PGP PUBLIC KEY BLOCK----- |
||||
|
||||
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 |
||||
FTZo62dWDvlkjXY0vE7Wsj0= |
||||
=4ORE |
||||
-----END PGP PUBLIC KEY BLOCK----- |
@ -0,0 +1 @@ |
||||
Subproject commit 39a8165aaa6b726ce0947abb31c0ce09aa30e9d9 |
@ -1 +0,0 @@ |
||||
Subproject commit 2dc35c5c6a52168a3a7b35c5ad51209f40a851cf |
Loading…
Reference in new issue