我的第一個 Open Source Upstream: fix nobelium 搜尋顯示已刪除 tag
date
Mar 6, 2026
summary
目前使用的部落格網站 Nobelium,在操作上發現,就算我把 tag 拿掉了,在主頁的 search 它還是會冒出來。所以就想把這次的修改也 upstream 上去,讓所有人都可以受惠。
目前使用的部落格網站 Nobelium,在操作上發現,就算我把 tag 拿掉了,在主頁的 search 它還是會冒出來。所以就想說,把這次的修改也 upstream 上去,讓所有人都可以受惠。
問題: 將 Notion 頁面中的 tag 移除後,Nobelium 的 Search 頁面仍被搜到原始 Nobelium 的作法Solution修改 Upstream 囉1. 首先,先 push 到自己的 repo 上2. 確認遠端設定 (Remote)Commit 結果
問題: 將 Notion 頁面中的 tag 移除後,Nobelium 的 Search 頁面仍被搜到
如圖:Notion 的頁面中,沒有 TEMP 和 Jekyll 這兩個 Tag,但在 Nobelium 的 Search 頁面仍然跑出這兩個選項


原始 Nobelium 的作法
在原始的 Nobelium 程式碼中,讀取
select / multi_select 時,只是單純地把頁面上的字串讀出來然後以逗號分隔:結果: 原始版本完全信任頁面底層殘留的資料,沒有去做二次驗證,所以那些被刪掉的舊 Tag 就會被一起抓下來,出現在網頁上並且被 Search 索引到。
Solution
lib/notion/getPageProperties.js 第 33 到 36 行,也就是後來加上的修改:
它的運作方式是:
- 先去抓 Notion 資料庫最新的 Schema(設定檔),列出目前真正還活著的有效選項 (
validOptions)。
- 再把頁面上的 tags 放進去過濾 (
filter)。
- 如果某個 tag 在這篇文章裡有殘留,但是已經不存在於 Schema 的有效選項中了,就會被自動剔除。
修改 Upstream 囉
1. 首先,先 push 到自己的 repo 上

2. 確認遠端設定 (Remote)
首先確認你的 Local 環境是否已經連結了 Upstream。
- origin: 指向你自己 Fork 的倉庫。
- upstream: 指向原始的(NotebookLM)主頁倉庫。
如果沒有 upstream,請執行:git remote add upstream [原始倉庫的網址]

如果只有一個修改走 <方法一>, 若已有多個 comment 卻不想全部推上去走 <方法二>
方法一、單一 patch: 直接 pull request
1. 同步並合併上游最新修改 (Sync & Merge)
在將你的 Local 修改送出去之前,必須確保你的程式碼是基於上游最新的狀態:
2. 將合併後的 Local 修改推送到你的 Origin
你無法直接將 Local 的修改
push 到別人的 upstream(除非你有寫入權限)。你必須先推送到你自己的遠端:3. 到主頁發起 Pull Request (PR)
最後一步是在瀏覽器上完成:
- 打開瀏覽器,進入該專案的 GitHub 原始主頁(或是你 Fork 的頁面)。
- GitHub 通常會自動偵測到你有更新,並顯示一個 "Compare & pull request" 的綠色按鈕。
- 點擊按鈕,填寫你的修改說明。
- 提交 Pull Request。
方法二、只上傳特定 patch:

因為我先前已經有太多的 commit,而我不想把中間我自己客製化的內容全部都 upstream 上去。所以重新抓一個乾淨的 repo 來 cherry-pick,再將我最新的修改 cherry-pick 上去,來達到不污染 origin/branch 的效果。
1. 確保你的 Local upstream 是最新的
抓取上游原始 branch(假設叫 main)的最新狀態。

2. 建立一個新的 PR 專用分支
從上游的最新位置建立一個新分支,這樣這個分支起點就是「乾淨」的,不包含你其他的 Patch。

3. 挑選最新的 Patch (Cherry-pick)
找到你想 PR (pull request) 的那個 Commit ID(雜湊值)。你可以透過 git log 在你原本的分支查看。


4. 推送到你的 Origin 並發起 PR
現在你的 fix 分支上只有那一個最新的修改了。

最後,到 GitHub 網頁上,選擇用這個
fix 分支向 upstream/main 發起 Pull Request。
Commit 結果

另外有看到 Coderabbit 給的兩個建議
- Docstring Coverge: Code 中沒寫 comment 介紹怎麼使用
- Code Suggestion: 針對 split 的優化建議
2. Code Suggestion

在 JavaScript 中,
.split(',') 會非常老實地分割字串。如果 Notion 或使用者輸入的是 "Travel, Tech"(逗號後有空格):split(',')會得到["Travel", " Tech"]。
- 你的
validOptions裡面可能是["Travel", "Tech"]。
- 比對時,
" Tech"(有空格) 不等於"Tech"(無空格),導致這個標籤被錯誤地過濾掉。
這會造成使用者明明選了標籤,結果網頁上卻顯示不出來。
好吧… 來改
結果加上修改後無法上到 fix,因為剛才用了 
git commit --amend
當你「修正」舊的 commit 時,Git 會認為這是一個新的歷史,與遠端(GitHub)現有的歷史不一致。這就是為什麼它提示
(non-fast-forward) 並拒絕你的推送。由於這是你自己的 PR 分支,且目的是為了更新 PR,你必須使用 「強制推送」(-f) 來覆蓋遠端舊的紀錄。

